誰有用c++寫的貪吃蛇源代碼分享壹個給我吧, 好人壹生平安!
遊戲描述如下:
1. 貪吃蛇可以自動直線前進,或者玩家可以通過方向鍵操縱貪吃蛇上下左右前進,每次前進壹格。
2. 貪吃蛇在規定的區域內活動,當:
①貪吃蛇觸碰到墻壁時;
②貪吃蛇的蛇頭觸碰到蛇身或者蛇尾時;
③玩家的鍵盤輸入不是方向鍵時;
命令行顯示“Game Over!”並且退出遊戲。
3. 貪吃蛇活動的區域內每次隨機產生壹顆“豆豆”,當貪吃蛇吃到“豆豆”後蛇身增長壹格,自動前進時間縮
短100ms(默認是1000ms,且不能少於100ms)。貪吃蛇長度每為8的倍數Improve a Level。
C++代碼如下:
#include?<bios.h>?#include?<conio.h>?
#include?<dos.h>?
#include?<graphics.h>?
#include?<stdlib.h>?
#include?<time.h>?
using?namespace?std;?
inline?void?display(char?gsDomain[][22],?int?level,?int?moveSpeed)?
{?
system("cls");?//清屏?
cout?<<?endl?<<?endl;?
for?(int?i?=?0;?i?<?22;?i++)?
{?
cout?<<?"\t";?
for?(int?j?=?0;?j?<?22;?j++)?
cout?<<?gsDomain[i][j]?<<?"?";?
if?(i?==?0)?
{?
cout?<<?"\tLevel:"?<<?level;?
}?
else?if?(i?==?3)?
{?
cout?<<?"\t自動前進時間";?
}?
else?if?(i?==?5)?
{?
cout?<<?"\t間隔:"?<<?moveSpeed?<<?"?ms";?
}?
cout?<<?endl;?
}?
}?
int?main()?
{?
char?gsDomain[22][22];?//貪吃蛇活動區域(包括墻壁)?
//初始化貪吃蛇活動區域(不包括墻壁)?
for?(int?i?=?1;?i?<=?21;?i++)?
{?
for?(int?j?=?1;?j?<=?21;?j++)?
gsDomain[i][j]?=?'?';?
}?
//初始化貪吃蛇活動區域的上下墻壁?
for?(int?i?=?0;?i?<?22;?i++)?
gsDomain[0][i]?=?gsDomain[21][i]?=?'-';?
//初始化貪吃蛇活動區域的左右墻壁?
for?(int?i?=?1;?i?<?21;?i++)?
gsDomain[i][0]?=?gsDomain[i][21]?=?'|';?
//初始化蛇身?
for?(int?i?=?1;?i?<=?3;?i++)?
gsDomain[1][i]?=?'*';?
//初始化蛇頭?
gsDomain[1][4]?=?'#';?
int?snake[2][100];?//記錄貪吃蛇每次出現的位置的坐標?
for?(int?i?=?0;?i?<?4;?i++)?
{?
snake[0][i]?=?1;?//記錄貪吃蛇所在位置的x坐標?
snake[1][i]?=?i?+?1;?//記錄貪吃蛇所在位置的y坐標?
}?
int?head?=?3,?tail?=?0,?length?=?4;?
int?beanX,?beanY;?//豆豆出現的位置?
srand(time(0));?
do
{?
beanX?=?rand()?%?20?+?1;?
beanY?=?rand()?%?20?+?1;?
}?while?(gsDomain[beanX][beanY]?!=?'?');?
gsDomain[beanX][beanY]?=?'*';?//豆豆?
cout?<<?"\n\n\t\t貪吃蛇遊戲即將開始!\n";?
long?start;?
int?level?=?1,?moveSpeed?=?1000;?
for?(int?i?=?3;?i?>=?0;?i--)?
{?
start?=?clock();?
while?(clock()?-?start?<=?1000){}?
system("cls");?
if?(i)?
{?
cout?<<?"\n\n\t\t進入遊戲倒計時:"?<<?i?<<?endl;?
}?
else
display(gsDomain,?level,?moveSpeed);?
}?
char?direction?=?77;?//貪吃蛇默認自動向右直線前進?
while?(true)?
{?
bool?timeFlag?=?true;?
int?x,?y;?
start?=?clock();?
//若時間超過自動前進時間或者鍵盤上有鍵按下則終止循環?
while?((timeFlag?=?(clock()?-?start?<=?moveSpeed))?&&?!kbhit()){}?
if?(timeFlag)?
{?
//鍵盤上有鍵按下時讀取鍵盤輸入?
getch();?
direction?=?getch();?
}?
switch?(direction)?
{?
//向上?
case?72:?x?=?snake[0][head]?-?1,?y?=?snake[1][head];?
break;?
//向下?
case?80:?x?=?snake[0][head]?+?1,?y?=?snake[1][head];?
break;?
//向左?
case?75:?x?=?snake[0][head],?y?=?snake[1][head]?-?1;?
break;?
//向右?
case?77:?x?=?snake[0][head],?y?=?snake[1][head]?+?1;?
break;?
default:?cout?<<?"\tGame?Over!\n";?
return?0;?
}?
if?(x?==?0?||?x?==?21?||?y?==?0?||?y?==?21)?
{?
//貪吃蛇觸碰到墻壁?
cout?<<?"\tGame?Over!\n";?
return?0;?
}?
if?(gsDomain[x][y]?!=?'?'?&&?!(x?==?beanX?&&?y?==?beanY))?
{?
//貪吃蛇的蛇頭觸碰到蛇身或者蛇尾?
cout?<<?"\tGame?Over!\n";?
return?0;?
}?
if?(x?==?beanX?&&?y?==?beanY)?
{?
//吃豆豆?
length++;?//長度加1?
if?(length?>=?8)?
{?
//遊戲升級處理?
length?-=?8;?
level++;?
if?(moveSpeed?>?100)?
moveSpeed?-=?100;?
}?
gsDomain[snake[0][head]][snake[1][head]]?=?'*';?
gsDomain[x][y]?=?'#';?
head?=?(head?+?1)?%?100;?
snake[0][head]?=?x;?
snake[1][head]?=?y;?
do
{?
beanX?=?rand()?%?20?+?1;?
beanY?=?rand()?%?20?+?1;?
}?while?(gsDomain[beanX][beanY]?!=?'?');?
gsDomain[beanX][beanY]?=?'*';?
display(gsDomain,?level,?moveSpeed);?//屏幕上顯示?
}?
else
{?
//不吃豆豆?
gsDomain[snake[0][tail]][snake[1][tail]]?=?'?';?//蛇尾前移壹格?
tail?=?(tail?+?1)?%?100;?
gsDomain[snake[0][head]][snake[1][head]]?=?'*';?
head?=?(head?+?1)?%?100;?
snake[0][head]?=?x;?
snake[1][head]?=?y;?
gsDomain[x][y]?=?'#';?//蛇頭前移壹格?
display(gsDomain,?level,?moveSpeed);?//屏幕上顯示?
}?
}?
return?0;?
}