您的位置:首页 > 编程语言 > C语言/C++

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

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

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

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

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

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

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

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

/**************************************************************************
***************************www.njtcstudent.com*****************************
******************************2014年10月6日********************************
******************************-by puhaiyang********************************
*******************************内江师范学院********************************
********************************13级计科系*********************************
**************************************************************************/
<pre name="code" class="cpp">#include<iostream>
#include<conio.h>//kbhit()函数需要调用,用来检查键盘输入
#include<ctime>//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<COL;i++)
for(j=0;j<COW;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<COL;i++){
for(j=0;j<COW;j++){
cout<<map[i][j];
}
cout<<endl;
}
cout<<"score:"<<score<<endl;
}

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<<"Game Over!"<<endl;
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<sum;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<<endl<<"Plead enter anykey to start game"<<endl;//提示
getch();//等待用户输入任意一个字符,游戏就可以开始
snakeMove(map);
}





运行截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: