大一学生能看懂的贪吃蛇

/*
游戏
1.实现地图的初始化 (√)
2.在初始化区域后产生一个能控制的蛇 (√)
3.随机产生food (√)
4.蛇吃到food后续及蛇的生长 (√)
5.蛇咬到自己以及撞墙的判断 (√)
*/
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<windows.h>
using namespace std;
#define N 24 //从此修改区域大小
/******************************** 定位光标的函数以及光标处字符的颜色函数 *************************/
void XY(int x,int y) //定位光标(x,y)位置
{
//HANDLE hout;
COORD pos; //={0,2};;
pos.X=2*x; //pos为一个结构体变量
pos.Y=y; //y=2x;
//定义hout为句柄,可边定义边赋值,也可先定义再赋值
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);//输出句柄
SetConsoleCursorPosition(hout,pos);//API中定位光标的函数
}
void Color(int num) //设置颜色
{
HANDLE hout;
hout=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hout,num);
}
/*************************** 初始化 ********************** ************/
void Init()
{
int wall[N+2][N+2]={0},i,j;
for(i=1;i<N+1;i++)
for(j=1;j<N+1;j++)
wall[i][j]=1;
for(i=0;i<N+2;i++)
{
{
for(j=0;j<N+2;j++)
if(wall[i][j])
cout<<" ";//一个□相当于两个space * y=2x*
else cout<<"■";
}
cout<<endl;
}
XY(N+3,10);
cout<<"按下任意键暂停"<<endl;
XY(N+3,11);
cout<<"按下w,s,a,d进行移动"<<endl;
XY(N+3,1);
cout<<"******************"<<endl;
XY(N+3,15);
cout<<"******************"<<endl;
XY(N+3,13);
cout<<"当前分数:"<<endl;
}
/************************* 游戏总过程 *****************************************/
void game()
{
int sneak[30][2],food[2],back[2],score=0,len=1;
char ch;
//sneak[0] 保存坐标x , wall[1]保存坐标y
Init();
//菜单
int n,i;
XY(N+3,3);
cout<<"请选择你要挑战的难度:"<<endl;
XY(N+3,4);
cout<<"难度一(10节) -- 1"<<endl;
XY(N+3,5);
cout<<"难度二(20节) -- 2"<<endl;
XY(N+3,6);
cout<<"难度三(30节) -- 3"<<endl;
i=getch();
switch(i)
{
case '1':n=100;break;
case '2':n=200;break;
case '3':n=300;break;
default : break;
}
//先初始化地图再在地图里画蛇
sneak[0][0]=N/2; //一维数组只能保存一节蛇,二维数组才能保存多节蛇
sneak[0][1]=N/2+1; //蛇的初始位置
XY(sneak[0][0],sneak[0][1]);
Color(6);
cout<<"◎";
cout<<endl;
srand((unsigned)time(NULL));
food[0]=rand()%N+1; //x的随机坐标
food[1]=rand()%N+1; //y的随机坐标
XY(food[0],food[1]);
Color(11);
cout<<"¤";
cout<<endl;
int flag=1;
////////////////////////////////////////////////////// 循环区域 ////////////////////////////////////////////////////////////////////////
while(1)
{
if(flag)
{
back[0]=sneak[len-1][0];
back[1]=sneak[len-1][1];
XY(back[0],back[1]);
cout<<" "<<endl;
}
for(i=len-1;i>0;i--)
{
sneak[i][0]=sneak[i-1][0];
sneak[i][1]=sneak[i-1][1];
XY(sneak[i][0],sneak[i][1]);
Color(6);
cout<<"◎"<<endl;
}
flag=1;
if(kbhit()) //让蛇按下键后自己动
{
XY(N+3,12); //按下其他键停止(ch始终为该值,在switch处没有位移,循环止于下次循环的kbhit处)
ch=getche();
}//除去"Press any key to continue"
switch(ch)
{
case 'W':
case 'w':sneak[0][1]--;break;
case 'S':
case 's':sneak[0][1]++;break;
case 'A':
case 'a':sneak[0][0]--;break;
case 'D':
case 'd':sneak[0][0]++;break;
default:break;
}
XY(sneak[0][0],sneak[0][1]);
Color(6);
cout<<"◎";
cout<<endl;
Sleep(200-(score/2));
////////////////////////////////////////////////////吃到食物
if(sneak[0][0]==food[0]&&sneak[0][1]==food[1])
{
score+=10,len++,flag=0;
srand((unsigned)time(NULL));
food[0]=rand()%N+1; //x的随机坐标
food[1]=rand()%N+1;
XY(food[0],food[1]);
Color(11);
cout<<"¤";
cout<<endl;
}
////////////////////////////////////////////////////////////////撞墙
if(sneak[0][0]==0||sneak[0][1]==0||sneak[0][0]==N+1||sneak[0][1]==N+1)
{
XY(N+5,8);
Color(5);
cout<<"GAME OVER"<<endl;
exit(0);
}
////////////////////////
////////////////////////////////////撞自己(长度大于1)
for(i=1;i<len;i++)
{
if(sneak[0][0]==sneak[i][0]&&sneak[0][1]==sneak[i][1])
{
XY(N+5,8);
Color(5);
cout<<"GAME OVER"<<endl;
exit(0);
}
}
XY(N+8,13);
Color(6);
cout<< score <<endl;
/////////////////////游戏成功
if(score==n)
{
XY(N+5,8);
Color(5);
cout<<"YOU WIN"<<endl;
exit(0);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
/**************************** 主函数 ********************************/
int main()
{
game();
return 0;
}