c 语言贪吃蛇游戏,用C/C++语言实现贪吃蛇游戏

无意间听说贪吃蛇这个游戏可以用C语言做出来。对此,本人很感兴趣,顺便也是在国庆假期期间,闲着也是闲着,用空余时间写出了一个小小的贪吃蛇游戏。

但由于没有涉及什么算法知识,所以代码比较冗长。但我觉得好理解。

对贪吃蛇游戏还有一个没有考虑过的就是,蛇头撞到自身,游戏会结束。

还有一个地方就是,游戏一开始,就有两节长。

我这个代码中的蛇头的创建没有用随机生成,这个好实现。

地图是用一个二维数组来实现的。

主要用到的知识有:二维数组,结构体,srand函数,rand函数,kbhit()函数,getch()函数,_sleep()函数,还有几个函数的几个基本知识

/**************************************************************************

***************************www.njtcstudent.com*****************************

******************************2014年10月6日********************************

******************************-by puhaiyang********************************

*******************************内江师范学院********************************

********************************13级计科系*********************************

**************************************************************************/

#include

#include//kbhit()函数需要调用,用来检查键盘输入

#include//time函数需要调用,用来生成随机数

using namespace std;

#define COL 15 //height 游戏地图高度

#define COW 30 //width 游戏地图宽度

int speed = 100; //游戏速度 100即 : 100*0.1

sconst char head = '@'; //蛇头

const char body='#'; //蛇身

const char food ='&'; //食物

const char brige = '!'; //边界

const char space = ' '; //空白区域

void rightMove(char map[COL][COW]); //定义几个函数

void upMove(char map[COL][COW]);

void downMove(char map[COL][COW]);

void leftMove(char map[COL][COW]);

void otherMove(char map[COL][COW]);

void createFood(char map[COL][COW]);

void eatFood(char map[COL][COW]);int gameState=0;// 0 as running , 1 as over 游戏标志 1表示游戏结束

int sum = 0; //蛇的宽度

int fx,fy; //食物在地图上的位置

int score = 0; //游戏分数,吃一个食物,加10分 ,开始时是0分

void createMap(char map[COL][COW] ) //创建游戏地图

void createMap(char map[COL][COW] )

{

int i,j;

for(i=0;i

for(j=0;j

if(i==0 || j==0 || i==COL-1 || j==COW-1)

{

map[i][j]=brige;

}

else

map[i][j]=space;

}

}

void show(char map[COL][COW])//显示游戏地图

{

int i,j;

for(i=0;i

for(j=0;j

cout<

}

cout<

}

cout<

}

struct snake//创建蛇的结构体

{

int x,y;//创建蛇的结构体

int now; //蛇的方向

}SNAKE[COL*COW];

void addNode(char map[COL][COW])//添加蛇身函数

{

SNAKE[sum].x=(SNAKE[0].x);

SNAKE[sum].y=(SNAKE[0].y);

SNAKE[sum].now=SNAKE[0].now;

map[SNAKE[sum].x][SNAKE[sum].y]=body;

sum++;

}

void createSnake(char map[COL][COW])//创建蛇头函数

{

int x,y;

x=3;y=5;

map[x][y]=head;

SNAKE[0].x=x;

SNAKE[0].y=y;

SNAKE[0].now=3;

sum = 1;

}

void snakeMove(char map[COL][COW])//蛇的移动过程

{

char key; //定义一个用来存放键盘输入的值

addNode(map);

createFood(map);

while(1){

system("cls");

_sleep(speed);

eatFood(map);

if(kbhit()!=0)//kbhit()函数用法 自己去查下

{

while(kbhit() != 0) //kbhit()函数用法 自己去查下

key = getch();

switch(key)//可以通过w,s,a,d的大小写 或上下左右键来控制方向

{

case 'w': case 'W': case 72: //向上键的ascii码是:72

if(SNAKE[0].now!=1)

SNAKE[0].now=0;break;

case 's': case 'S': case 80://下的asc:80

if(SNAKE[0].now!=0)

SNAKE[0].now=1;break;

case 'a': case 'A': case 75://下的asc:80

if(SNAKE[0].now!=3)

SNAKE[0].now=2;break;

case 'd': case 'D': case 77://右的asc:77

if(SNAKE[0].now!=2)

SNAKE[0].now=3;break;

}

}

switch(SNAKE[0].now)//我定义蛇的结构体中 上下左右分别是0,1,2,3

{

case 0:

upMove(map);break;

case 1:

downMove(map);break;

case 2:

leftMove(map);break;

default:

rightMove(map);

}

show(map);

if(gameState==1)//判断游戏的状态,通过gameState变量判断

{

cout<

break;

}

}

}

/*对于移动中的具体代码,可以画出游戏地图,标出具体位置,再分加讨论上下左右的位置移动*/

void downMove(char map[COL][COW])//蛇头向下移动

{

otherMove(map);

SNAKE[0].x++;

map[SNAKE[0].x][SNAKE[0].y]=head;

SNAKE[0].now=1;

}

void leftMove(char map[COL][COW])//蛇头向左移动

{

otherMove(map);

SNAKE[0].y--;

map[SNAKE[0].x][SNAKE[0].y]=head;

SNAKE[0].now=2;

}

void upMove(char map[COL][COW])//蛇头向上移动

{

otherMove(map);

SNAKE[0].x--;

map[SNAKE[0].x][SNAKE[0].y]=head;

SNAKE[0].now=0;

}

void rightMove(char map[COL][COW])//蛇头向右移动

{

otherMove(map);

SNAKE[0].y++;

map[SNAKE[0].x][SNAKE[0].y]=head;

SNAKE[0].now=3;

}

void otherMove(char map[COL][COW])//蛇体移动 ,就是不是蛇头的部分移动

{

int i;

for(i=1;i

if(i==1)

map[SNAKE[i].x][SNAKE[i].y]=space;

if(i==sum-1){

SNAKE[i].x=SNAKE[0].x;

SNAKE[i].y=SNAKE[0].y;

SNAKE[i].now=SNAKE[0].now;

}

else

{

SNAKE[i].x=SNAKE[i+1].x;

SNAKE[i].y=SNAKE[i+1].y;

SNAKE[i].now=SNAKE[i+1].now;

}

map[SNAKE[i].x][SNAKE[i].y]=body;

}

}

void createFood(char map[COL][COW])//创建食物

{

//random create food 随机创建食物

srand(time(0));

while(1){

fx=(rand()%(COL-2))+1;//不能让食物创建在

fy=(rand()%(COW-2))+1;//游戏边界线上

if(map[fx][fy]!=head && map[fx][fy]!=body)//不能让食物创建在蛇身上

{

map[fx][fy]=food;

break;

}

}

}

void eatFood(char map[COL][COW])

{

if((SNAKE[0].x==fx)&&(SNAKE[0].y==fy))//蛇吃食物

{

score+=10;//分数加10分

createFood(map);//再创建一个食物

addNode(map);//蛇身加1个结点

}

if(SNAKE[0].x==0 || SNAKE[0].x==COL-1 || SNAKE[0].y==0 || SNAKE[0].y==COW-1)

{

gameState=1;//如果蛇头碰上了边界,设置游戏标志为1,即游戏结束标志

}

}

void main(){

char map[COL][COW];

system("title snake"); //system函数用来调用dos命令

createMap(map);

createSnake(map);

show(map);

cout<

getch();//等待用户输入任意一个字符,游戏就可以开始

snakeMove(map);

}

运行截图:

b194bbdd60724dd0b1e3e8a82debd8bb.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值