在updateWithInput() 函数中按a、s、d、w键改变moveDirection
判断游戏结束的条件
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<windows.h> #define High 20 //游戏画面尺寸
#define Width 30// 全局变量
int moveDirection; //小蛇移动的方向,上下左右分别用1234表示
int canvas[High][Width]={0}; //二位数组存储游戏画布中对应的元素 //0为空格,-1为边框#,1为蛇头@,大于1的正数为蛇身* void gotoxy(int x,int y)
{HANDLE handle =GetStdHandle(STD_OUTPUT_HANDLE); //handle把手 COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(handle,pos); //pos销售点
}//移动小车//第一部扫描数组canvas的所有元素,找到正数元素都加1
//找到最大元素(即蛇尾巴),把其变为0
//找到等于2的元素(即蛇头),根据输出的上下左右方向把对应的另一个像素值
// 设为1(新蛇头) void moveSnakeByDirection()
{int i,j;for(i=1;i<High-1;i++)for(j=1;j<Width-1;j++)if(canvas[i][j]>0)canvas[i][j]++;int oldTail_i,oldTail_j,oldHead_i,oldHead_j;int max=0;for(i=1;i<High-1;i++)for(j=1;j<Width-1;j++)if(canvas[i][j]>0){if(max<canvas[i][j]){max=canvas[i][j];oldTail_i=i;oldTail_j=j;}if(canvas[i][j]==2){oldTail_i=i;oldTail_j=j;}}canvas[oldTail_i][oldTail_j]=0;int newHead_i,newHead_j;if(moveDirection==1) // 向上移动 {newHead_i=oldHead_i-1;newHead_j=oldHead_j;}if(moveDirection==2) // 向下移动 {newHead_i=oldHead_i+1;newHead_j=oldHead_j;}if(moveDirection==3) // 向左移动 {newHead_i=oldHead_i;newHead_j=oldHead_j-1; }if(moveDirection==4) // 向右移动 {newHead_i=oldHead_i;newHead_j=oldHead_j+1; }//小蛇是否和自身撞或者和边框撞,游戏失败if(canvas[newHead_i][newHead_j]>0||canvas[newHead_i][newHead_j]==1) {printf("游戏失败!\n");exit(0);} elsecanvas[newHead_i][newHead_j]=1; } void startup() //数据初始化 startup启动
{int i,j;//初始化边框 for(i=0;i<High;i++){canvas[i][0]=-1; //最左边一趟 canvas[i][Width-1]=-1; //最右边一趟 }for(j=0;j<Width;j++){canvas[0][j]=-1; //最上边的一趟 canvas[High-1][j]=-1; //做下面一趟 }canvas[High/2][Width/2]=1; //初始化蛇头 for(i=1;i<=4;i++)canvas[High/2][Width/2-i]=i+1; //蛇身 moveDirection=4; //初始化小蛇向右移动
}void show() //显示画面 ,
//用户自定义函数名,它无返回值,根据函数名,该程序应该是完成输出操作的
{gotoxy(0,0); //光标移动到原点位置,一下重画清屏 int i,j;for(i=0;i<High;i++){for(j=0;j<Width;j++){if(canvas[i][j]==0)printf(" "); //输出空格 else if (canvas[i][j]==-1) printf("#"); //输出边框# else if(canvas[i][j]==1)printf("@"); //输出蛇头 else if (canvas[i][j]>1)printf("*"); //输出蛇身 }printf("\n");}Sleep(100); //system(“cls”)是将控制台清屏。//sleep(100)是指,“休息”100毫秒之后接着运行下面的东西
}
void updateWithoutInput() //与用户输入无光的更新
{moveSnakeByDirection();
}void updateWithInput() //与用户输入有关的更新
{char input;if(kbhit()) //判断是否有输入 {input=getch(); //根据用户的不同输入来移动 if(input=='a') //不需要输入回车 {moveDirection=3; //位置左移 moveSnakeByDirection();}else if(input=='d'){moveDirection=4; //位置右移 moveSnakeByDirection();}else if(input=='w'){moveDirection=1; //位置上移 moveSnakeByDirection();}else if(input=='s'){moveDirection=2; //位置下移 moveSnakeByDirection();}}}int main()
{startup();while(1){show(); //显示画面 updateWithoutInput(); //与用户数输入无关的更新 updateWithInput(); //与用户输入有关的更新 }return 0;
}
运行结果