大一學(xué)生能看懂的貪吃蛇

/*
游戲
? 1.實(shí)現(xiàn)地圖的初始化 (√)
? 2.在初始化區(qū)域后產(chǎn)生一個(gè)能控制的蛇? ? (√)
? 3.隨機(jī)產(chǎn)生food (√)
? 4.蛇吃到food后續(xù)及蛇的生長(zhǎng) (√)
? 5.蛇咬到自己以及撞墻的判斷 (√)
*/
#include<stdio.h>
#include<conio.h>
#include<iostream>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
#include<time.h>
#include<stdlib.h>
#include<windows.h>
using namespace std;
#define N 24 //從此修改區(qū)域大小
/******************************** 定位光標(biāo)的函數(shù)以及光標(biāo)處字符的顏色函數(shù) *************************/
void XY(int x,int y)? ?//定位光標(biāo)(x,y)位置
{
//HANDLE hout;
COORD pos;? ? ? ? ?//={0,2};;
pos.X=2*x;? ? ? ?//pos為一個(gè)結(jié)構(gòu)體變量
pos.Y=y;? ? ? ? //y=2x;
? ? ? ? ? ? ? ? //定義hout為句柄,可邊定義邊賦值,也可先定義再賦值
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);//輸出句柄
SetConsoleCursorPosition(hout,pos);//API中定位光標(biāo)的函數(shù)
}
?
void Color(int num)? ?//設(shè)置顏色
{
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<<"? ";//一個(gè)□相當(dāng)于兩個(gè)space? ? ?* y=2x*
else cout<<"■";
}
cout<<endl;
}??
XY(N+3,10);
cout<<"按下任意鍵暫停"<<endl;
XY(N+3,11);
cout<<"按下w,s,a,d進(jìn)行移動(dòng)"<<endl;
XY(N+3,1);
cout<<"******************"<<endl;
XY(N+3,15);
cout<<"******************"<<endl;
XY(N+3,13);
cout<<"當(dāng)前分?jǐn)?shù):"<<endl;
}
/*************************? 游戲總過(guò)程? *****************************************/
void game()
{
int sneak[30][2],food[2],back[2],score=0,len=1;
char ch;
? ? ? ? ? //sneak[0] 保存坐標(biāo)x ,? wall[1]保存坐標(biāo)y
Init();
//菜單
int n,i;
XY(N+3,3);
cout<<"請(qǐng)選擇你要挑戰(zhàn)的難度:"<<endl;
XY(N+3,4);
cout<<"難度一(10節(jié)) -- 1"<<endl;
XY(N+3,5);
cout<<"難度二(20節(jié)) -- 2"<<endl;
XY(N+3,6);
cout<<"難度三(30節(jié)) -- 3"<<endl;
i=getch();
switch(i)
{
case '1':n=100;break;
case '2':n=200;break;
case '3':n=300;break;
default : break;
}
? ? ? ? //先初始化地圖再在地圖里畫(huà)蛇
sneak[0][0]=N/2; ? ?//一維數(shù)組只能保存一節(jié)蛇,二維數(shù)組才能保存多節(jié)蛇
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的隨機(jī)坐標(biāo)
food[1]=rand()%N+1; ? ?//y的隨機(jī)坐標(biāo)
XY(food[0],food[1]);
Color(11);
cout<<"¤";
cout<<endl;
int flag=1;
//////////////////////////////////////////////////////? 循環(huán)區(qū)域? ////////////////////////////////////////////////////////////////////////
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())? ? ?//讓蛇按下鍵后自己動(dòng)
{
XY(N+3,12);? ?//按下其他鍵停止(ch始終為該值,在switch處沒(méi)有位移,循環(huán)止于下次循環(huán)的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的隨機(jī)坐標(biāo)
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);
}
////////////////////////
////////////////////////////////////撞自己(長(zhǎng)度大于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);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
/**************************** 主函數(shù)? ********************************/
int main()
{? ?
game();
return 0;
}