其实还是比较简单的,总的来说就是运行的时候注意上下左右调整为大写输入,
WASD控制上下左右,
在程序内部有解释程序的构造。
# include "snack.h"
int main()
{
int counter = 50;
InitFrame();
Wall();
InitSnack();
Create_apple();
char ch = 'D';
char ch1 = ch;
while(1)
{
Handle(0,N+2);
if(_kbhit())//判断是否键入
{
ch = _getch();
if(!(ch1 == ch+3 || ch1 == ch-3 || ch1 == ch+4 || ch1 == ch-4))//判断
ch1 = ch;
Shift_Snack(ch1);
counter = 0;
}
else{
Sleep(10);
counter++;
}
if(counter >= 50)
{
Shift_Snack(ch1);
counter = 0;
}
if (flag_1 == 0)
break;
}
//getchar();
Handle(0,N+2);
return 0;
}
下面为.h文件
#include <iostream>
using namespace std;
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#define N 20
#define ERROR 0
#define OK 1
typedef struct Snack
{
int x;
int y;
int flag;
char way;
}Snack;
bool flag_1 = 1;
Snack snack[N+1][N+1];//构建数据结构
Snack *head;
Snack *nail;
Snack *m_head;
Snack *m_nail;
Snack apple;
void InitFrame();//函数声明
void InitSnack();//创建蛇身
void Wall();//创建城墙
void Handle(int x,int y);//光标位置
void Color(int color);//控制台颜色函数
int Shift_Snack();//移动蛇身函数
void Remove_nail();//去除蛇尾函数
void Create_apple();//产生苹果函数
void Create_apple()
{
int x,y;
srand(time(NULL));//产生随机种子
do{
x = (int)(N * rand() / (RAND_MAX + 1.0));//产生随机数
y = (int)(N * rand() / (RAND_MAX + 1.0));//产生随机数
}while(snack[x][y].flag != 0);
apple = snack[x][y];
Handle(apple.x,apple.y);
cout<<char(15);
}
void Remove_nail()
{
if(head->x == apple.x && head->y == apple.y)//吃到苹果则产生下一个苹果
{
Create_apple();
}
else//如果没有吃到苹果则需要修改尾部位置
{
switch(nail->way)
{
case 'W':
nail = &snack[nail->x][nail->y-1];break;
case 'A':
nail = &snack[nail->x-1][nail->y];break;
case 'S':
nail = &snack[nail->x][nail->y+1];break;
case 'D':
nail = &snack[nail->x+1][nail->y];break;
}
m_nail->flag = 0;//归零
Handle(m_nail->x,m_nail->y);
cout<<" ";//抹去尾巴
}
}
int Shift_Snack(char ch)//转移蛇身
{
m_head = &snack[head->x][head->y];
m_nail = &snack[nail->x][nail->y];
switch(ch)
{
case 'W':
head = &snack[head->x][head->y-1]; m_head->way = 'W'; break;
case 'A':
head = &snack[head->x-1][head->y]; m_head->way = 'A'; break;
case 'S':
head = &snack[head->x][head->y+1]; m_head->way = 'S'; break;
case 'D':
head = &snack[head->x+1][head->y]; m_head->way = 'D'; break;
}
if (head->flag == 1){//如果撞墙或着撞蛇身,则死亡
flag_1 = 0;
return ERROR;
}
head->flag = 1;
Handle(head->x,head->y);
cout<<char(2);
Handle(m_head->x,m_head->y);//把原来的舌头替换为蛇身状态
cout<<char(3);
Remove_nail();
return OK;
}
void InitFrame()//构造整体框架,并对数据结构赋值
{
int i = 0, j = 0;
for(;i <= N+1 ;i++)
for(j = 0; j <= N+1; j++)
{
snack[i][j].x = i;
snack[i][j].y = j;
snack[i][j].flag = 0;//使每个点状态值均为零
}
}
void InitSnack()
{
head = &snack[2][1]; head->flag = 1; head->way = 'D';
nail = &snack[1][1]; nail->flag = 1; nail->way = 'D';//初始状态水平向右
Handle(nail->x,nail->y);
//Color(4);
cout<<char(3);
Handle(head->x,head->y);
//Color(4);
cout<<char(2);
head->flag = nail->flag = 1;
}
void Handle(int x,int y)//使光标至于当前位置
{
HANDLE hOut;
COORD pos = {short(x),short(y)};
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
}
void Color(int color)//颜色分布函数,得到不同的配色
{
HANDLE hOut;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut,color);
}
void Wall()
{
int i,j;
for(i = 0,j = 0; j <= N+1; j++)
{
snack[i][j].flag = 1;
Handle(i,j);
cout<<char(4);
}
for(i = 0,j = 0; i <= N+1; i++)
{
snack[i][j].flag = 1;
Handle(i,j);
cout<<char(4);
}
for(i = N+1,j = 0; j <= N+1; j++)
{
snack[i][j].flag = 1;
Handle(i,j);
cout<<char(4);
}
for(i = 0,j = N+1; i <= N+1; i++)
{
snack[i][j].flag = 1;
Handle(i,j);
cout<<char(4);
}
}
如果有问题请留下