推箱子
基本思路:
- 绘制一个地图,包含人,箱子,墙,目的地;
2.实现人的移动;
3.实现人和箱子同时移动。
代码:
#include<graphics.h> //使用EGE图形库
#include<stdio.h>
#include<windows.h>
#include<time.h>
#define MAPSIZE 10
int map[MAPSIZE][MAPSIZE]=
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,1},
{1,0,1,1,0,0,0,1,0,1},
{1,0,1,0,0,0,0,0,0,1},
{1,0,0,0,0,0,1,0,0,1},
{1,0,0,0,1,0,1,0,0,1},
{1,0,1,0,0,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,0,1,1,1,0,1,0,1},
{1,1,1,1,1,1,1,1,1,1},
};
int map2[MAPSIZE][MAPSIZE];
typedef struct s_actor
{
int x;
int y;
PIMAGE img; //图片
} ACT;
ACT man,box,goal;
void map_copy()
{
int i,j;
for(i=0; i<MAPSIZE; i++)
for(j=0; j<MAPSIZE; j++)
map2[i][j]=map[i][j];
}
void go_back()
{
int i,j;
for(i=0; i<MAPSIZE; i++)
for(j=0; j<MAPSIZE; j++)
map[i][j]=map2[i][j];
}
void show_map()
{
go_back();
system("cls"); //清屏
int i,j;
PIMAGE img1=newimage(); //分别得到各个人物的图像
PIMAGE img2=newimage();
man.img=newimage();
box.img=newimage();
goal.img=newimage();
getimage(img1,"game\\hua.jpg"); //注意图片的路径
getimage(img2,"game\\11.jpg");
getimage(man.img,"game\\zly.png");
getimage(box.img,"game\\fsf.png");
getimage(goal.img,"game\\2.png");
putimage(0,0,img1);
map[man.y][man.x]=2;
map[box.y][box.x]=3;
map[goal.y][goal.x]=4;
for(i=0; i<MAPSIZE; i++) //在屏幕上打印出图片
{
for(j=0; j<MAPSIZE; j++)
{
if(map[i][j]==1)
putimage(j*50,i*50,img2);
else if(map[i][j]==2)
putimage_transparent(NULL,man.img,j*50,i*50,0);
else if(map[i][j]==3)
putimage_transparent(NULL,box.img,j*50,i*50,0);
else if(map[i][j]==4)
putimage_transparent(NULL,goal.img,j*50,i*50,0);
}
//printf("\n");
}
Sleep(50);
}
void man_move()
{
char ch;
ch=getch();
switch(ch) //控制方向
{
case 'w':
if(map[man.y-1][man.x]!=1)
{
if(map[man.y-1][man.x]==3&&map[box.y-1][box.x]!=1)
{
box.y--;
man.y--;
}
else if(map[man.y-1][man.x]==3&&map[box.y-1][box.x]==1)
man.y=man.y;
else
man.y--;
}
break;
case 's':
if(map[man.y+1][man.x]!=1)
{
if(map[man.y+1][man.x]==3&&map[box.y+1][box.x]!=1)
{
box.y++;
man.y++;
}
else if(map[man.y+1][man.x]==3&&map[box.y+1][box.x]==1)
man.y=man.y;
else
man.y++;
}
break;
case 'a':
if(map[man.y][man.x-1]!=1)
{
if(map[man.y][man.x-1]==3&&map[box.y][box.x-1]!=1)
{
box.x--;
man.x--;
}
else if(map[man.y][man.x-1]==3&&map[box.y][box.x-1]==1)
man.x=man.x;
else
man.x--;
}
break;
case 'd':
if(map[man.y][man.x+1]!=1)
{
if(map[man.y][man.x+1]==3&&map[box.y][box.x+1]!=1)
{
box.x++;
man.x++;
}
else if(map[man.y][man.x+1]==3&&map[box.y][box.x+1]==1)
man.x=man.x;
else
man.x++;
}
break;
}
}
int judge()
{
int flag=0;
if(map[box.y][box.x]==4)
flag=2;
else if(map[box.y-1][box.x]==1&&map[box.y][box.x-1]==1||map[box.y-1][box.x]==1&&map[box.y][box.x+1]==1||map[box.y+1][box.x]==1&&map[box.y][box.x-1]==1||map[box.y+1][box.x]==1&&map[box.y][box.x+1]==1)
flag=1;
return flag;
}
int main()
{
initgraph(500,500);
man.x=1;
man.y=1;
box.x=4;
box.y=4;
goal.x=6;
goal.y=8;
map_copy();
show_map();
while(1)
{
man_move();
show_map();
if(judge()==1)
{
printf("Sorry,game over!\n");
return 0;
}
else if(judge()==2)
{
printf("Congratulation! you succeed!\n");
return 0;
}
}
getch();
closegraph();
}
贪吃蛇
- 绘制一幅二维数组地图;
- 初始化蛇的长度,蛇头,蛇身坐标;
- 分别实现在蛇吃到食物与没有吃到食物时的移动。
源代码:
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
int map[20][40];
int dx[4]= {0,0,-1,1}; //控制蛇方向的改变
int dy[4]= {-1,1,0,0};
int len=4; //蛇的长度
int speed=100; //蛇运动的速度
int count=0;//标记蛇是否碰到墙壁或自身
struct Snake
{
int x;
int y;
int dire;//蛇方向
} S[400];
void Goto_Top() //清屏
{
COORD pos= {0,0};
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout,pos);
}
void init() //初始化蛇
{
int i,j;
for(i=0; i<20; i++)
for(j=0; j<40; j++)
map[i][j]='@';
for(i=1; i<19; i++)
for(j=1; j<39; j++)
map[i][j]=' ';
for(i=0; i<400; i++)
{
S[i].x=0;
S[i].y=0;
S[i].dire=0;
}
S[0].y=1;
S[0].x=1;
S[1].y=1;
S[1].x=2;
S[2].y=1;
S[2].x=3;
S[3].y=1;
S[3].x=4;
S[3].dire=3;
for(i=0; i<len-1; i++)
map[S[i].y][S[i].x]='X';
map[S[3].y][S[3].x]='H';
srand(time(0));
food();
}
void food() //随机设置食物的坐标
{
int x,y;
while(1)
{
x=rand()%39+1;
y=rand()%19+1;
if(map[y][x]==' ')
{
map[y][x]='Q';
break;
}
}
}
void turn() //蛇方向的改变
{
char dir;
if(kbhit()) //敲击键盘
{
dir=getch();
switch (dir)
{
case 'w':
S[len-1].dire=0;
break;
case 's':
S[len-1].dire=1;
break;
case 'a':
S[len-1].dire=2;
break;
case 'd':
S[len-1].dire=3;
break;
}
}
}
void check()
{
int x,y;
x=S[len-1].x+dx[S[len-1].dire];
y=S[len-1].y+dy[S[len-1].dire];
if(map[y][x]=='@'||map[y][x]=='X')
{
printf("game over!\n");
printf("结束游戏请输入'q' 重新游戏请输入'r'\n");
count = 1;
return;
}
else if(map[y][x]=='Q')
{
len++;
speed=((600-len*20)>100)?(600-len*20):100;
}
}
void move() //蛇的移动
{
int i,t=len;
turn();
check();
if(t==len)
{
for(i=0; i<len-1; i++)
{
if(i==0)
{
map[S[i].y][S[i].x]=' ';
S[i].y=S[i+1].y;
S[i].x=S[i+1].x;
}
else
{
S[i].y=S[i+1].y;
S[i].x=S[i+1].x;
}
map[S[i].y][S[i].x]='X';
}
S[len-1].x=S[len-1].x+dx[S[len-1].dire];
S[len-1].y=S[len-1].y+dy[S[len-1].dire];
map[S[len-1].y][S[len-1].x]='H';
}
else
{
map[S[len-2].y][S[len-2].x]='X';
S[len-1].x=S[len-2].x+dx[S[len-2].dire];
S[len-1].y=S[len-2].y+dy[S[len-2].dire];
S[len-1].dire=S[len-2].dire;
map[S[len-1].y][S[len-1].x]='H';
food();
}
}
void show_map()
{
int i,j;
char ch;
for(i=0; i<20; i++)
{
for(j=0; j<40; j++)
printf("%c",map[i][j]);
printf("\n");
}
menu();
while(1)
{
Sleep(speed);
move();
if(count)
{
while(1)
{
ch=getch();
if(ch=='q')
return;
else if(ch=='r')
{
init();
break;
}
}
}
Goto_Top();
for(i=0; i<20; i++)
{
for(j=0; j<40; j++)
printf("%c",map[i][j]);
printf("\n");
}
}
}
void menu()
{
char ch;
printf("--------------------------------------------\n");
printf("|游戏指南: |\n");
printf("|向上按'w' 向下按's' 向左按'a' 向右按'd'|\n");
printf("|碰到墙壁和自身死亡! 蛇越长跑得越快!!|\n");
printf("|请按任意键开始游戏 |\n");
printf("--------------------------------------------\n");
ch=getch();
}
void main()
{
init();
show_map();
}
使用EGE图形库代码:
#include<graphics.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include<time.h>
#include<string.h>
int map[10][20];
int dx[4]= {0,0,-1,1};
int dy[4]= {-1,1,0,0};
int len=4;
int speed=500;
int counts=0;
struct Snake
{
int x;
int y;
int dire;
PIMAGE img;
} S[100];
void Goto_Top()
{
COORD pos= {0,0};
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout,pos);
}
void food()
{
int x,y;
while(1)
{
x=rand()%19+1;
y=rand()%9+1;
if(map[y][x]==' ')
{
map[y][x]='Q';
break;
}
}
}
void init()
{
int i,j;
for(i=0; i<10; i++)
for(j=0; j<20; j++)
map[i][j]='@';
for(i=1; i<9; i++)
for(j=1; j<19; j++)
map[i][j]=' ';
for(i=0; i<100; i++)
{
S[i].x=0;
S[i].y=0;
S[i].dire=0;
}
S[0].y=1;
S[0].x=1;
S[1].y=1;
S[1].x=2;
S[2].y=1;
S[2].x=3;
S[3].y=1;
S[3].x=4;
S[3].dire=3;
for(i=0; i<len-1; i++)
map[S[i].y][S[i].x]='X';
map[S[3].y][S[3].x]='H';
srand(time(0));
food();
}
void turn()
{
char dir;
if(kbhit())
{
dir=getch();
switch (dir)
{
case 'w':
S[len-1].dire=0;
break;
case 's':
S[len-1].dire=1;
break;
case 'a':
S[len-1].dire=2;
break;
case 'd':
S[len-1].dire=3;
break;
}
}
}
void check()
{
int x,y;
x=S[len-1].x+dx[S[len-1].dire];
y=S[len-1].y+dy[S[len-1].dire];
if(map[y][x]=='@'||map[y][x]=='X')
{
counts = 1;
return;
}
else if(map[y][x]=='Q')
{
len++;
speed=((600-len*20)>100)?(600-len*20):100;
}
}
void moves()
{
int i,t=len;
turn();
check();
if(t==len)
{
for(i=0; i<len-1; i++)
{
if(i==0)
{
map[S[i].y][S[i].x]=' ';
S[i].y=S[i+1].y;
S[i].x=S[i+1].x;
}
else
{
S[i].y=S[i+1].y;
S[i].x=S[i+1].x;
}
map[S[i].y][S[i].x]='X';
}
S[len-1].x=S[len-1].x+dx[S[len-1].dire];
S[len-1].y=S[len-1].y+dy[S[len-1].dire];
map[S[len-1].y][S[len-1].x]='H';
}
else if(t<len)
{
map[S[len-2].y][S[len-2].x]='X';
S[len-1].x=S[len-2].x+dx[S[len-2].dire];
S[len-1].y=S[len-2].y+dy[S[len-2].dire];
S[len-1].dire=S[len-2].dire;
map[S[len-1].y][S[len-1].x]='H';
food();
}
}
void menu()
{
printf("--------------------------------------------\n");
printf("|游戏指南: |\n");
printf("|向上按'w' 向下按's' 向左按'a' 向右按'd'|\n");
printf("|碰到墙壁和自身死亡! 蛇越长跑得越快!!|\n");
printf("|请按任意键开始游戏 |\n");
printf("--------------------------------------------\n");
}
void show_map()
{
int i,j;
char ch;
PIMAGE img1=newimage();
PIMAGE img2=newimage();
PIMAGE img3=newimage();
S[len-1].img=newimage();
S[0].img=newimage();
getimage(S[0].img, "game\\3.png");
getimage(img1, "game\\hua.jpg");
getimage(img2, "game\\fsf.png");
getimage(img3, "game\\22.png");
getimage(S[len-1].img, "game\\zly.png");
putimage(0, 0, img1);
for(i=0; i<10; i++)
{
for(j=0; j<20; j++)
{
if(map[i][j]=='Q')
putimage_transparent(NULL,img2,j*50,i*50,0);
else if(map[i][j]=='@')
putimage_transparent(NULL,img3,j*50,i*50,0);
else if(map[i][j]=='H')
putimage_transparent(NULL,S[len-1].img,j*50,i*50,0);
else if(map[i][j]=='X')
putimage_transparent(NULL,S[0].img,j*50,i*50,0);
}
//printf("%c",map[i][j]);
//printf("\n");
}
}
int main()
{
initgraph(1000,500);
init();
//menu();
show_map();
while(1)
{
Sleep(speed);
moves();
if(counts==1)
{
printf("game over ");
return 0;
}
//Goto_Top();
show_map();
}
getch();
closegraph();
return 0;
}