#include<iostream>
#include<windows.h>
#include<time.h>
#include<stdlib.h>
#include<conio.h>
using namespace std;
#define high 20 //定義地圖的高度
#define width 30 //定義地圖的寬度
#define snake_maxlength 200 //蛇長最大值
int snake_x[snake_maxlength],snake_y[snake_maxlength]; //蛇的坐標
int snake_length; //蛇現在的長度
int map[high][width]={0}; //初始化地圖,0表示空格,1表示蛇身,2表示食物,
//3表示墻,4表示蛇頭,現在地圖中什么也沒有
int food_x,food_y; //食物的坐標
int score; //本局分數
char input; //讀取用戶鍵入的字符
char primeinput='.'; //primeinput在input脫離wasd時,用來存盤input
int op; //速度控制全域變數
//資料的初始化函式
void setdata()
{
snake_x[0]=high/2;snake_y[0]=width/3; //初始化蛇頭,在地圖內的位置隨意
snake_x[1]=high/2;snake_y[1]=width/3+1; //初始化蛇身
snake_length=2; //蛇的原始尺寸(一格頭一格身子)
food_x=high/3,food_y=width/3; //初始化食物的位置,在地圖內位置隨意
score=0;
int i,j;
map[snake_x[0]][snake_y[0]]=4; //蛇頭
map[snake_x[1]][snake_y[1]]=1; //蛇身
map[food_x][food_y]=2; //食物
for(i=0;i<high;i++) //墻
for(j=0;j<width;j++)
if(i==0||j==0||i==high-1||j==width-1)
map[i][j]=3;
}
//畫面列印
void gotoxy(int x,int y)
{
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X=x;
pos.Y=y;
SetConsoleCursorPosition(handle,pos);
}
void show()
{
gotoxy(0,0);
int i,j;
for(i=0;i<high;i++)
{
for(j=0;j<width;j++)
{
if(map[i][j]==0)
cout<<" ";
else if(map[i][j]==1)
cout<<"+";
else if(map[i][j]==2)
cout<<"@";
else if(map[i][j]==3)
cout<<"*";
else if(map[i][j]==4)
cout<<"0";
}
printf("\n");
}
printf("得分:%d",score);
}
//與輸入無關的更新
void updatewithoutinput()
{
int i;
if(snake_x[0]==food_x&&snake_y[0]==food_y)
{
score++;
srand((unsigned)time(NULL)); //srand和rand函式連用產生亂數,一般以時間作為產生亂數的種子
food_x=rand()%(high-3)+1;
food_y=rand()%(width-3)+1;
map[food_x][food_y]=2;
snake_length++;
}
if(snake_x[0]==0||snake_x[0]==high-1||snake_y[0]==0||snake_y[0]==width-1) //碰墻了
{
cout<<"游戲結束!"<<endl;
getch();
exit(1);
}
for(i=1;i<snake_length;i++) //碰到自己了 ,遍歷蛇身找是否和蛇頭重復
if(snake_x[0]==snake_x[i]&&snake_y[0]==snake_y[i])
{
cout<<"咬到自己"<<endl;
getch();
exit(1);
}
}
void updatewithinput()
{
int i=1;
if(kbhit())
input=getch();
if(input!='\0') //input!='\0'(空)表示當有輸入的時候開始更新畫面,這是游戲開始的條件
{
if(input=='w'||input=='a'||input=='s'||input=='d'||input=='W'||input=='A'||input=='S'||input=='D')
{
if(primeinput=='w'&&input=='s'||primeinput=='s'&&input=='w'||primeinput=='a'&&input=='d'||primeinput=='d'&&input=='a'||primeinput=='W'&&input=='S'||primeinput=='S'&&input=='W'||primeinput=='A'&&input=='D'||primeinput=='D'&&input=='A')
{
cout<<endl <<endl <<"貪吃蛇教會你的,是世上沒有回頭路,回頭等于自焚"<<endl;
exit(0); //退出程式
}
else
primeinput=input;
}
else if(primeinput=='.')
primeinput='w';
else if(input=='p')
{
while(1)
{
char op;
op=getch();
if(op=='p')
{
input='.';
break;
}
}
}
else if(input=='+')
{
if(op>=50) //表示最快速度為25 ms重繪一次
op=op/2;
}
else if(input=='-')
{
if(op<=1000) //表示最慢速度為 2000 ms重繪一次
op=op*2;
}
map[snake_x[snake_length-1]][snake_y[snake_length-1]]=0;//蛇走過一格,蛇尾處變為空格
for(i=snake_length-1;i>0;i--)
{
snake_x[i]=snake_x[i-1]; //走過一格后蛇身的坐標覆寫前面的坐標 (從后往前覆寫,蛇頭也會被蛇身覆寫)
snake_y[i]=snake_y[i-1];
map[snake_x[i]][snake_y[i]]=1;
}
}
if(primeinput=='w'||primeinput=='W')
snake_x[0]--;
else if(primeinput=='s'||primeinput=='S')
snake_x[0]++;
else if(primeinput=='a'||primeinput=='A')
snake_y[0]--;
else if(primeinput=='d'||primeinput=='D')
snake_y[0]++;
map[snake_x[0]][snake_y[0]]=4; //蛇頭的坐標覆寫前面的坐標
}
int main()
{
setdata();//資料初始化
cout <<"(ASDW移動)請輸入你的速度(10-100):";
cin >>op;
op=105-op;
while(1)
{
show(); //畫面列印
Sleep(op);
updatewithoutinput(); //與輸入無關的更新
updatewithinput(); //與輸入有關的更新
}
return 0;
}
如果對大家有幫助,請多多支持,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297934.html
標籤:其他
