贪吃蛇
贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。
贪吃蛇的初步制作以及不断完善
利用我们之前所学的“自顶向下,逐步求精”的编程思想,一步步地写出“贪吃蛇”这款游戏
会走的蛇
我们先要做出一个会走的、可操作的蛇的模型
程序的头部
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'
void snakeMove(int,int);//控制蛇的移动
void output(void);//输出蛇的位置
int gameover(void);//判断游戏结束条件
char map[12][12]={"************",
"*XXXXH *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"************"};
int snakeX[SNAKE_MAX_LENGTH]={1,2,3,4,5};
int snakeY[SNAKE_MAX_LENGTH]={1,1,1,1,1};
int snakeLength=5;
main函数
根据伪代码框架写出main函数的大概框架
输出字符矩阵
WHILE not 游戏结束 DO
ch=等待输入
CASE ch DO
‘A’:左前进一步,break
‘D’:右前进一步,break
‘W’:上前进一步,break
‘S’:下前进一步,break
END CASE
输出字符矩阵
END WHILE
输出 Game Over!!!
int main()
{
char input;
output();
while(1)
{
input=getch();//使用getch()函数是因为输入无回显,且无需enter结束输入
switch(input)
{
case'A':snakeMove(-1,0);break;
case'D':snakeMove(1,0);break;
case'W':snakeMove(0,-1);break;
case'S':snakeMove(0,1);break;
default:break;
}
fflush(stdin);
if(gameover()!=0)
{
output();
continue;
}
return 0;
}
}
snakeMove函数
void snakeMove(int dx,int dy)/*假设地图是一个坐标轴,蛇的移动表示在当前点(x,y)加上dx,dy
'W':dx=0,dy=-1
'A':dx=-1,dy=0
'S':dx=0,dy=1
'D':dx=1,dx=0*/
{
int turn=0;
int tempX=snakeX[snakeLength-1];
int tempY=snakeY[snakeLength-1];
int tempX1=0;
int tempY1=0;
snakeY[snakeLength-1]+=dy;
snakeX[snakeLength-1]+=dx;
for(turn=snakeLength-2;turn>=0;turn--)
{
tempX1=snakeX[turn];
tempY1=snakeY[turn];
snakeX[turn]=tempX;
snakeY[turn]=tempY;
tempX=tempX1;
tempY=tempY1;
}
}
output函数
void output(void)
{
int turnx=0;
int turny=0;
for(turnx=1;turnx<11;turnx++)
{
for(turny=1;turny<11;turny++)
{
map[turnx][turny]=BLANK_CELL;
}
}
for(turnx=0,turny=0;turnx<snakeLength;turnx++,turny++)
{
if(map[snakeY[turny]][snakeX[turnx]]!=SNAKE_FOOD)
{
map[snakeY[turny]][snakeX[turnx]]=SNAKE_BODY;
}
}
map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]=SNAKE_HEAD;
system("cls");
for(turnx=0;turnx<12;turnx++)
{
for(turny=0;turny<12;turny++)
{
printf("%c",map[turnx][turny]);
}
printf("\n");
}
}
gameover函数
int gameover(void)
{
if(map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]==WALL_CELL)
{
printf("Game Over!!!");
return 0;
}
return 1;
}
会吃的蛇
顾名思义,贪吃蛇要会吃
所以需要补充两个函数
put_money函数
void put_money(void)
{
int x , y = 0;
srand((unsigned)time(NULL));
while(map[x][y]!=BLANK_CELL)
{
x=rand()%10+1;
y=rand()%10+1;
}
map[x][y]=SNAKE_FOOD;
}
eat_food函数
void eat_food(void)
{
int turn = 0;
if(map[snakeY[snakeLength-1]][snakeX[snakeLength-1]]==SNAKE_FOOD)
{
snakeLength++;
if(snakeLength>20)
{
return;
}
for(turn=snakeLength-1;turn>0;turn--)
{
snakeX[turn]=snakeX[turn-1];
snakeY[turn]=snakeY[turn-1];
}
snakeX[turn]=tempX;
snakeY[turn]=tempY;
put_money();
}
}
此外,还需对gameover()函数进行一些修改,增加一些游戏的条件
gameover()函数
int gameover(void)
{
int turn = 0;
if(map[snakeX[snakeLength-1]][snakeY[snakeLength-1]]==WALL_CELL)
{
printf("Game Over!!!");
return 0;
}
else if(snakeLength>SNAKE_MAX_LENGTH)
{
printf("Game Over!!!");
return 0;
}
for(turn=snakeLength-2;turn>=0;turn--)
{
if(snakeX[turn]==snakeX[snakeLength-1]&&snakeY[turn]==snakeY[snakeLength-1])
{
printf("Game Over!!!");
return 0;
}`
}
return 1;
}
有颜色的蛇(Ubuntu)
利用VT-100控制码编程
再改变output函数
有障碍的地图(Ubuntu)
定义一个BLOCKS常量
#define BLOCKS '#'
编写一个新的函数set_blocks()函数
另外需要做的修改(荧光笔画的地方)
加入 积分显示
定义全局变量Score
每次eat_food,Score=Score+100;
End
基本完成了一个贪吃蛇的制作
示例图片
更多玩法会在下一篇博客中写出!!