贪吃蛇,绝对是每个人童年记忆里的游戏了吧。记得我小时候玩的贪吃蛇,还是诺基亚手机里自带的小游戏。而且当时对此特别着迷,经常与小伙伴们比赛刷新分数
而如今,诺基亚已经停产,也再也没有哪一款手机会自带贪吃蛇游戏了。但这款游戏早已经成为经典,成为记忆。今天让我们看下如何编写一个简单的贪吃蛇游戏。
由简入难,我们想象一下这个游戏的基本原理和操作
输出字符矩阵
WHILE not 游戏结束
DO
ch=等待输入
CASE ch DO
‘A’:左前进一步,break
‘D’:右前进一步,break
‘W’:上前进一步,break
‘S’:下前进一步,break
END CASE
输出字符矩阵
END WHILE
输出 Game Over!
以上就是这个游戏的伪代码
然后呢,就该用代码将其补充完整
// main.c
// snake
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#define SNAKE_MAX_LENGTH 20
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define SNAKE_FOOD '$'
#define WALL_CELL '*'
//move by providing the x_index and y_index
void snake_move(int x_index,int y_index);
//randomly put money
void put_money();
//print the frame
void output();
//check for over
int gameover();
char map[12][13]=
{
"************",
"*XXXXH *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"************"
};
struct Point
{
int x;
int y;
};
/*Point x1;
Point x2;
Point x3;
Point x4;
Point x5;*/
struct Point snake_arr[20];
//={x1,x2,x3,x4,x5};
int snake_length=5;
struct Point * head=&snake_arr[4];
struct Point * tail=&snake_arr[0];
int fruit_x=5,fruit_y=5;
void random_generator_fruit()
{
fruit_x=rand()%10+1;
fruit_y=rand()%10+1;
map[fruit_y][fruit_x]='$';
for(int i=0;i<snake_length;i++)
{
if(snake_arr[i].x==fruit_x&&snake_arr[i].y==fruit_y)
random_generator_fruit();
}
}
int process=1;
int main()
{
srand((unsigned)time(NULL));
/*for(i=0;i<12;i++)
{
for(j=0;j<12;j++)
{
if(map[i][j]=='H')
{
break;
}
}
}*/
for(int k=4;k>=0;k--)
{
snake_arr[k].x=k+1;
snake_arr[k].y=1;
/* for(int i=0;i<snake_length-1;i++)
{
snake_arr[i].x=snake_arr[i+1].x;
snake_arr[i].y=snake_arr[i+1].y;
}*/
}
random_generator_fruit();
for(;gameover()!=-1&&process!=0;)
{
system("cls");
output();
char ch=getch();
switch(ch)
{
case 'w':
case 'W':
snake_move(0,-1);
break;
case 's':
case 'S':
snake_move(0,1);
break;
case 'a':
case 'A':
snake_move(-1,0);
break;
case 'd':
case 'D':
snake_move(1,0);
break;
}
}
printf("game over");
return 0;
}
void output()
{
for(int i=0;i<12;i++)
{
printf("%s\n",map[i]);
}
}
void snake_move(int x_index,int y_index)
{
int temp_x=head->x+x_index,temp_y=head->y+y_index;
for(int i=0;i<snake_length;i++)
{
if(snake_arr[i].x==temp_x&&snake_arr[i].y==temp_y)
{
process=0;
return ;
}
}
if(temp_x!=fruit_x||temp_y!=fruit_y)
{
map[tail->y][tail->x]=' ';
map[head->y][head->x]='X';
map[head->y+y_index][head->x+x_index]='H';
for(int i=0;i<snake_length-1;i++)
{
snake_arr[i].x=snake_arr[i+1].x;
snake_arr[i].y=snake_arr[i+1].y;
}
snake_arr[snake_length-1].x=temp_x;
snake_arr[snake_length-1].y=temp_y;
}
else
{
map[head->y][head->x]='X';
map[head->y+y_index][head->x+x_index]='H';
snake_arr[snake_length].x=temp_x;
snake_arr[snake_length].y=temp_y;
head=&snake_arr[snake_length];
snake_length++;
random_generator_fruit();
}
}
int gameover()
{
int flag=1;
for(int i=0;i<snake_length;i++)
{
if(snake_arr[i].x<=0||snake_arr[i].x>=11||snake_arr[i].y<=0||snake_arr[i].y>=11)
{
flag=0;
break;
}
}
if(flag==0)
{
return -1;
}
return 1;
}
然后最后结果就是这样的