直入正题
思路
1.绘制地图,利用一个二维数组将地图绘制出来
2.创建蛇 利用一个结构体来构造蛇的结点,然后用数组表示一整只蛇
3.蛇的移动,利用kbhit()函数检测按键响应 并改变蛇的方向
4.蛇的添加结点,
代码如下
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <conio.h> #include <time.h> const int H = 8;//地图的高 const int L = 16;//地图的宽 char GameMap[H][L];//地图 char key = ' ';//按键 int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//上下左右 int GameState = 0;//游戏状态 void Check_Broder(); void Check_Head(int x,int y); void CreateFood(); void input(); int sum =1;//蛇的长度 struct snake{// 蛇 int x,y;//蛇每个节点位置 int now;//方向 }snake[H*L]; char sbody = '@',food = '*';//定义蛇的符号 食物的符号 void MapCreate(){ system("title 贪吃蛇");//标题改成贪吃蛇 memset (GameMap,'.',sizeof(GameMap));//将GameMap中字符全部替换成'.' system("cls");//清屏 srand(time(0));//置随机数种子 snake[0].x = rand()%H;//产生蛇头 snake[0].y = rand()%L; GameMap[snake[0].x][snake[0].y]=sbody;//画出蛇头 CreateFood(); for(int i =0;i<H;i++){//绘制地图 for(int j = 0;j<L;j++){ printf("%c",GameMap[i][j]); } printf("\n"); } //getch(); input(); } void CreateFood() { int i=0,j=0;//定义食物坐标变量 while(1){ i = rand()%H;//随机食物x坐标 j = rand()%L;//随机食物y坐标 if(GameMap[i][j]!=sbody){//检查是否在蛇的位置 GameMap[i][j] = food; break; } } } void input(){ if(kbhit()!=0){//判断键盘是否输入 while(kbhit()!=0){//可能有多个按键一次取完 以最后一个为基准 key = getch(); } } switch(key){ case 'w'://上 snake[0].now=0; break; case 's'://下 snake[0].now=1; break; case 'a'://左 snake[0].now=2; break; case 'd'://右 snake[0].now=3; break; } } void Move(){ int i ,x,y; int t =sum;//保存当前蛇长度; x = snake[0].x; y = snake[0].y; GameMap[x][y]='.'; snake[0].x = x + dx[snake[0].now]; snake[0].y = y + dy[snake[0].now]; Check_Broder();//蛇头是否越界 Check_Head(x,y);//蛇头移动情况 if(sum == t){ //未吃到食物即蛇身移动哦 for(i = 1; i < sum; i++) //要从蛇尾节点向前移动哦,前一个节点作为参照 { if(i == 1) //尾节点设置为空再移动 GameMap[ snake[i].x ][ snake[i].y ] = '.'; if(i == sum-1) //为蛇头后面的蛇身节点,特殊处理 { snake[i].x = x; snake[i].y = 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; } GameMap[ snake[i].x ][ snake[i].y ] = '#'; //移动后要置为'#'蛇身 } } } void Check_Broder() {//检查蛇头是否越界 if(snake[0].x<0||snake[0].x>=H||snake[0].y<0||snake[0].y>=L){ printf("Check_Broder"); GameState = 1; } } void Check_Head(int x,int y) {//检查蛇头的移动情况 if(GameMap[snake[0].x][snake[0].y]=='.'){//假如是空 GameMap[snake[0].x][snake[0].y]=sbody; }else if(GameMap[snake[0].x][snake[0].y]=='*'){//假如是食物 GameMap[snake[0].x][snake[0].y]=sbody; snake[sum].x=x;snake[sum].y=y;snake[sum].now = snake[0].now; GameMap[snake[sum].x][snake[sum].y]=sbody; sum++; CreateFood();//吃完生成 食物 }else{//假如是自己的身体 printf("Check_Head"); GameState = 1; } } void Show(){ int i,j; while(1){ _sleep(500);//每半秒刷新一次地图 input(); Move(); if(GameState == 1){ printf("游戏失败!"); system("pause"); break; } system("cls"); for(i = 0; i < H; i++) { for(j = 0; j < L; j++) { printf("%c", GameMap[i][j]); } printf("\n"); } } } int main(){ MapCreate(); Show(); return 0; }代码略显繁琐,笔者初学,请见谅!