笔记
细节:处理在同一点落子
工具:vs,图形库插件
控制台应用程序
getchar()防闪退
创建自己的窗口initgraph (宽,高)
cleardevice()刷新函数
void initgame初始化游戏界面:
loadimage(null,图片保存路径)加载图片
第一条线为窗口边框
for循环加载线,line(第一个点坐标(横,纵),第二个),竖线与横线的加载只是横纵坐标相反
setlinecolor(black)线条颜色
setlinestyle(样式,宽度)
最后加上边框的线条
outtextxy(横,纵,提示语句)
void playchess()下棋
MOUSEMSG m:鼠标相关结构体,理解为数据类型,m鼠标变量
while(1)死循环实现下棋过程
int chessboard[][]棋盘二维数组
m=GetMouseMsg获取鼠标消息
m.x鼠标横坐标
处理落子位置,通过鼠标位置与格子的距离绝对值小于格子宽度的一半判定
同时把数组下标换成坐标并记录落子点,用来判断是否落子重复。
m.uMsg=WM_LBUTTONDOWN左键按下
whoseturn变量实现玩家轮流落子,奇数玩家1
chessboard[][]=!0,表示已有
HWND hwnd定义窗口句柄
hwnd=gethwnd()窗口句柄置前
MessagBox(hwnd,内容,标题)信息框弹出
setfilcolor()
solidcircle(x,y,r)无边框填充圆
judge(x,y)判断
细节i>=1,i<=N-4
从当前位置依次从前往后5个5个判断是否相连
效果
代码
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<windows.h>
#include <math.h>
#include<iostream.h>
#include<time.h>
#define N 20
HWND hWnd;
int chessboard[N][N]={0};
int whoseturn;
void initgame();
void playchess();
int judge(int x,int y);
char* to_string(int a){
char *s=new char[6];
int c=5;
while(c>-1){s[c]=a%10+'0';c--;a=a/10;}
return s;
}
int main(){
initgame();
playchess();
getchar();
return 0;
}
void initgame(){
initgraph(600,500);
loadimage(NULL,"ff.jpg");
for (int i=1;i<20;i++){
setlinecolor(BLACK);
line(i*25,0,i*25,500);
line(0,i*25,500,i*25);
}
setlinestyle(PS_SOLID,2);
line(500,0,500,500);
outtextxy(510,50,"黑棋:玩家一");
outtextxy(510,80,"白棋:玩家二");
}
void playchess(){
int i,j,x,y,a=0,b=0;
MOUSEMSG m;
hWnd=GetHWnd();
int start=clock()/1000;
int showTime=start;
int now=0;
while(1)
{
now=clock()/1000;
if(now!=showTime){
showTime=now;
outtextxy(520,100,to_string(showTime-start));
}
m=GetMouseMsg();
for (i=1;i<20;i++){
for (j=1;j<20;j++){
if(abs(i*25-m.x)<12.5&&abs(j*25-m.y)<12.5){
x=i*25;
y=j*25;
a=i;
b=j;
}
}
}
if(m.uMsg==WM_LBUTTONDOWN){
if(whoseturn %2==1){
outtextxy(505,200,"请玩家一落子");
if (chessboard[a][b]!=0){
MessageBox(hWnd,"请重新选择地点","这里已落子",MB_OK);
continue;
}
else{
setfillcolor(WHITE);
solidcircle(x,y,10);
chessboard[a][b]=2;
}
}
else{
outtextxy(505,200,"请玩家二落子");
if (chessboard[a][b]!=0){
MessageBox(hWnd,"请重新选择地点","这里已落子",MB_OK);
continue;
}
else{
setfillcolor(BLACK);
solidcircle(x,y,10);
chessboard[a][b]=1;
}
}
whoseturn++;
}
if (judge(a,b)){
if (whoseturn%2==1){
MessageBox(hWnd,"玩家一胜利","游戏结束",MB_OK);
exit(0);
}
else{
MessageBox(hWnd,"玩家二胜利","游戏结束",MB_OK);
exit(0);
}
}
}
}
int judge(int x,int y)
{
int i=0,j=0;
int t=2-whoseturn%2;
for (i =x -4,j =y;i<=x;i++)
{
if (i>=1&&i<=N-4&&t==chessboard[i][j] && t==chessboard[i+1][j] && t==chessboard[i + 2][j] && t==chessboard[i + 3][j] && t==chessboard[i+4][j])
return 1;
}
for (i =x,j =y-4;j<=x;j++)
{
if (j>=1&&j<=N-4&&chessboard[i][j] == t && chessboard[i][j + 1] == t&& chessboard[i][j + 2] == t && chessboard[i][j + 3] == t && chessboard[i][j+ 4] == t)
return 1;
}
for (i =x -4,j =y-4;i<=x,j<=y;i++,j++)
{
if (i>=1&&i<=N-4&&j>=1&&j<=N-4&&chessboard[i][j] == t && chessboard[i + 1][j + 1] == t && chessboard[i + 2][j + 2] == t && chessboard[i + 3][j + 3] == t && chessboard[i + 4][j + 4] == t )
return 1;
}
for (i =x+4,j =y-4;i>=1,j<=y;i--,j++)
{
if (i>=1&&i<=N-4&&j>=1&&j<=N-4&&chessboard[i][j] == t && chessboard[i - 1][j + 1] == t &&chessboard[i - 2][j + 2] == t &&chessboard[i - 3][j + 3] == t &&chessboard[i - 4][j + 4] == t)
return 1;
}
return 0;
}
推箱子代码
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
void initgame();
void movebox();
void judge();
void judge();
//0空地 1墙 3目的地 4箱子 5人
int map[9][9]={{1,1,1,1,1,0,0,0,0},
{1,5,0,0,1,0,0,0,0},
{1,0,4,4,1,0,1,1,1},
{1,0,4,0,1,0,1,3,1},
{1,1,1,0,1,1,1,3,1},
{0,1,1,0,0,0,0,3,1},
{0,1,0,0,0,1,0,0,1},
{0,1,0,0,0,1,1,1,1},
{0,1,1,1,1,1,0,0,0}};
int main()
{
while(1)
{
initgame();
judge();
movebox();
//getchar();}
return 0;
}
void initgame()
{
system("cls");//清屏
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
switch (map[i][j])
{
case 0:
printf(" ");//两个空格
break;
case 1:
printf("■");
break;
case 3:
printf("☆");
break;
case 4:
printf("◇");//两个空格
break;
case 5:
printf("♀");
break;
case 8://人站在目的地上
printf("♀");
break;
case 7://箱子在目的地上
printf("★");
break;
}
}
printf("\n");
}
}
//动态界面
void movebox()
{
int m,n;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(map[i][j]==5||map[i][j]==8)//找到人
{
m=i;
n=j;
}
}
}
switch(getch())//获取键盘按键
{
case 72://or"w"/up
//人前面是空地目的地
if(map[m-1][n]==0||map[m-1][n]==3)
{
map[m][n]-=5;
map[m-1][n]+=5;
}
else if(map[m-1][n]==4||map[m-1][n]==7)
{//箱子前面是空地目的地
if(map[m-2][m]==0||map[m-2][m]==3)
{
map[m][n]-=5;
map[m-1][n]-=1;
map[m-2][n]+=4;
}
}
break;
case 80:
if(map[m+1][n]==0||map[m+1][n]==3)
{
map[m][n]-=5;
map[m+1][n]+=5;
}
else if(map[m+1][n]==4||map[m+1][n]==7)
{//箱子前面是空地目的地
if(map[m+2][m]==0||map[m+2][m]==3)
{
map[m][n]-=5;
map[m+1][n]-=1;
map[m+2][n]+=4;
}
}
break;
case 75:
if(map[m][n-1]==0||map[m][n-1]==3)
{
map[m][n]-=5;
map[m][n-1]+=5;
}
else if(map[m][n-1]==4||map[m][n-1]==7)
{//箱子前面是空地目的地
if(map[m][m-2]==0||map[m][m-2]==3)
{
map[m][n]-=5;
map[m][n-1]-=1;
map[m][n-2]+=4;
}
}
break;
case 77:
if(map[m][n+1]==0||map[m][n+1]==3)
{
map[m][n]-=5;
map[m][n+1]+=5;
}
else if(map[m][n+1]==4||map[m][n+1]==7)
{//箱子前面是空地目的地
if(map[m][m+2]==0||map[m][m+2]==3)
{
map[m][n]-=5;
map[m][n+1]-=1;
map[m][n+2]+=4;
}
}
break;
}
}
void judge()
{
int win;
for(int j=0;j<9;j++)
{
if(map[i][j]=7)
{
win++;
}
}
if( win==3)
{
MessageBox(NULL,"恭喜你",MB_OK;
exit(0);
}
}
音乐播放
//#include "stdafx.h"
#include<stdio.h>
#include<conio.h>//getch()
//micSendString
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
void playSound(char* str)
{
char buff[256]={0};
sprintf(buff,"open sounds\\%s alias m",str);
mciSendString(buff,0,0,0);//打开音乐
mciSendString("play m alias m",0,0,0);
Sleep(300);//睡觉
mciSendString("close m alias m",0,0,0);
}
int_tmain(int argc,_TCHAR* argv[])
{
int c;
while(1){
c=getch();//获取按键值
switch(c){
case 49:
playSound("1.mp3");
break;
case 50:
mciSendString("open 2.mp3 alias m",0,0,0);//打开音乐
mciSendString("play m alias m",0,0,0);
Sleep(300);//睡觉
mciSendString("close m alias m",0,0,0);
break;
case 51:
mciSendString("open 3.mp3 alias m",0,0,0);//打开音乐
mciSendString("play m alias m",0,0,0);
Sleep(300);//睡觉
mciSendString("close m alias m",0,0,0);
break;
default:
break;
}
}
mciSendString("open 1.mp3 alias m",0,0,0);//打开音乐
mciSendString("play m alias m",0,0,0);
Sleep(300);//睡觉
mciSendString("close m alias m",0,0,0);
while
}
贪吃蛇
#include<stdio.h>
#include<graphics.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
#define Sl 500
void InitSnake();
void DrawSnake();
void MoveSnake();
void ChangeSnakeCh();
enum Ch//方向
{up=72,
down= 80,
left=75,
right=77
}
struct Coor//坐标
{int x;
int y;}
struct Snake
{int n;
Coor szb[Sl];
Ch ch;
}snake;
int main()
{InitSnake();
while (1){
while(!kbhit())
{cleardevice();
DrawSnake();
MoveSnake();
Sleep(200);
}ChangeSnakeCh();}
return 0;
//setbkcolor(GREEN);
//cleardevice();
//settextstyle(50,0,"微软雅黑")宽一般设为0
}
void InitSnake()
{initgraph(640,480);
//Play Sound();wav
mciSendString("open xxx.mp3 alias BGM",0,0,0);
mciSendString("play BGM",0,0,0);
snake.n=1;
snake.ch=right;
snake.szb[0].x=0;
snake.szb[0].y=0;
}
void DrawSnake()
{setlinecolor(YELLOW);
setfillcolor(YELLOW);
for(int i=0;i<snake.n;i++)
{
fillrectangle(snake.szb[i].x,snake.szb[i].y,snake.szb[i].x+10,snake.szb[i ].y+10);
}
}
void MoveSnake()
{switch(snake.h)
{case up:
snake.szb[0].y-=10;
break;
case down:
snake.szb[0].y+=10;
break;
case left:
snake.szb[0].x-=10;
break;
case up:
snake.szb[0].x-=10;
break;
}
}
void ChangeSnakeCh()
{int move;
move=getch();
switch (move)
{case up:
if(snake.ch!=down)
snake.ch=up;
break;
}
}