贪吃蛇问题:
小时候我们都玩过贪吃蛇,如今,学习了编程,我们不妨将其实现一下,这对我们的编程学习有很大好处。下文,小编会以讲解程序所使用的函数的方式详解贪吃蛇的编写。
A,定义的全局变量及其功能:
int food[2]; //定义全局变量food,以储存food坐标
int direction; //定义全局变量direction,以储存snake的运动方向
int length=2; //蛇的长度,初始长度为2
int headX=1,headY=2; //蛇的头,初始坐标为(1,2)
int snake[1000][2]; //蛇的坐标
B,定义的函数及其功能:
1.getoxy函数:使用该函数能定点输出字符位置,在往期文章曾经讲过,就不详细叙述了。
2.Direction函数(用w,a,s,d控制蛇的上下左右移动):在这个函数中需要用到_kbhit(),检查当前是否有键盘输入。若有输入,则判断输入的字符ch是不是w,a,s,d或空格中的一种,将w,a,s,d分别对应全局变量direction中的某一整形数值,比如:1,2,3,4,以此标记蛇移动的方向。空格则是暂停键,用system(“pause”)实现。
3.changesnake函数(改变蛇运动后的坐标):首先通过direction的值判断蛇运动方向,改变headX和headY的值,即蛇头坐标,遍历蛇的所有坐标,将当前蛇身坐标赋值为前一位蛇身的坐标,将蛇头坐标用headX和headY的值赋值,以实现蛇向前一步走的功能。
4.其他函数功能比较简单,就不需要讲解了。
C,main函数:
利用死循环,每隔一段时间便将屏幕清空,重新输出新的蛇,边界和食物的位置。
代码如下:
#include
#include
#include
#include
#include
#include
using namespace std;
/*所有需要使用的全局变量 */
int food[2]; //定义全局变量food,以储存food坐标
int direction; //定义全局变量direction,以储存snake的运动方向
int length=2; //蛇的长度
int headX=1,headY=2; //蛇的头
int snake[1000][2];
/*所有需要使用的函数 */
void getoxy(); //定位函数
void Start(); //开始函数
void Boundary(); //边界函数
void Direction(); //方向函数
void changesnake(); //改变蛇坐标的函数
void newFood(); //随机创建新食物的函数
void printfood(); //输出食物
void printsnake(); //输出蛇
void EatorNot(); //判断蛇是否吃到食物
bool judgeLife(); //判断蛇是否存活
void getoxy(SHORT x,SHORT y)
{
COORDposition=; //COORD:字符在控制台屏幕上的坐标
HANDLEhOut=GetStdHandle(STD_OUTPUT_HANDLE); // GetStdHandle:顾名思义,取得一个句柄。
//SetConsoleCursorPosition是API中定位光标位置的函数。
SetConsoleCursorPosition(hOut,position); //参数一个句柄,一个坐标
//STD_OUTPUT_HANDLE:指向标准输出设备
};
void Start()
{
cout
cin.get();
system("cls"); //清屏函数
};
void Boundary() //边界为100,20
{
for(inta=0;a
{
getoxy(100,a);
};
for(inta=0;a
{
getoxy(a,20);
cout
};
};
void Direction()
{
charch;
if(_kbhit())
{
ch=_getch();
if(ch=='w')
{
direction=1;
};
if(ch=='s')
{
direction=2;
};
if(ch=='a')
{
direction=3;
};
if(ch=='d')
{
direction=4;
};
if(ch=='')
{
cout
system("pause");
};
};
};
void changesnake()
{
if(direction==1) headY--;
if(direction==2) headY++;
if(direction==3) headX--;
if(direction==4) headX++;
for(inta=length-1;a>0;a--)
{
snake[a][0]=snake[a-1][0];
snake[a][1]=snake[a-1][1];
};
snake[0][0]=headX;
snake[0][1]=headY;
};
void newFood()
{
srand((unsigned)time(NULL));
food[0]=rand()%100;
food[1]=rand()%20;
for(intx=0;x
{
if(food[0]==snake[x][0]&&food[1]==snake[x][1])
newFood();
break;
};
};
void printfood()
{
getoxy(food[0],food[1]);
cout
};
void printsnake()
{
getoxy(snake[0][0],snake[0][1]);
cout
for(inta=1;a
{
getoxy(snake[a][0],snake[a][1]);
cout
};
};
void EatorNot()
{
if(food[0]==snake[0][0]&&food[1]==snake[0][1])
{
length++;
newFood();
};
};
bool judgeLife()
{
for(inti=1;i
{
if(snake[0][0]==snake[i][0]&&snake[0][1]==snake[i][1])
{
returnfalse;
break;
};
};
if(snake[0][0]100snake[0][1]20) return false;
elsereturn true;
}
void Change()
{
Boundary();
EatorNot();
changesnake();
printsnake();
printfood();
}
int main()
{
Start();
food[0]=5;
food[1]=5;
snake[0][0]=1;snake[0][1]=2;
snake[1][0]=1;snake[1][1]=1;
direction=4;
while(true)
{
if(!judgeLife()) break;
Direction();
Change();
Sleep(500);
system("cls");
};
cout
return0;
}
领取专属 10元无门槛券
私享最新 技术干货