c语言贪吃蛇黑方框,[求助][贪吃蛇]源程序,请教其中一个问题。
[求助][貪吃蛇]源程序,請(qǐng)教其中一個(gè)問題。
源程序如下: 我的問題是,調(diào)節(jié)游戲速度時(shí),數(shù)字為什么越大時(shí),有時(shí)候竟然越快?
#define N 200
#include
#include
#include
#define LEFT 0x4b00 /* 將這些特殊字符的ACSII值(這里主要的是擴(kuò)展的)定義宏,來方便使用 */
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;/*得分*/
int gamespeed=60000;/*游戲速度自己調(diào)整 這個(gè)值應(yīng)該是越小蛇運(yùn)動(dòng)的越快,但是我在Win-TC1.9.1運(yùn)行時(shí),當(dāng)我把gamespeed增大時(shí),在某些值下會(huì)反而會(huì)增快,不知道為什么*/
struct Food
{
int x;/*食物的橫坐標(biāo)*/
int y;/*食物的縱坐標(biāo)*/
int yes;/*判斷是否要出現(xiàn)食物的變量*/
}food;/*食物的結(jié)構(gòu)體*/
struct Snake
{
int x[N];
int y[N];
int node;/*蛇的節(jié)數(shù)*/
int direction;/*蛇移動(dòng)方向*/
int life;/* 蛇的生命,0活著,1死亡*/
}snake;
void Init(void);/*圖形驅(qū)動(dòng)*/
void Close(void);/*圖形結(jié)束*/
void DrawK(void);/*開始畫面*/
void GameOver(void);/*結(jié)束游戲*/
void GamePlay(void);/*玩游戲具體過程*/
void PrScore(void);/*輸出成績(jī)*/
/*主函數(shù)*/
void main(void)
{
Init();/*圖形驅(qū)動(dòng)*/
DrawK();/*開始畫面*/
GamePlay();/*玩游戲具體過程*/
Close();/*圖形結(jié)束*/
}
/*圖形驅(qū)動(dòng)*/
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"d:\\tc\program"); /* 初始化圖形系統(tǒng), d:\\tc\program 為EGA VGA.bgi所在路徑 */
cleardevice(); /* 清除屏幕函數(shù) */
}
/*開始畫面,左上角坐標(biāo)為(50,40),右下角坐標(biāo)為(610,460)的圍墻,不過畫完后圍墻的內(nèi)圈是(60,50)(600,450)*/
void DrawK(void)
{
/*setbkcolor(LIGHTGREEN);*/ /* 設(shè)置背景顏色,可以添加 */
setcolor(11);/* 函數(shù)setcolor()設(shè)置當(dāng)前繪圖顏色(或稱做前景色)。 */
setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*設(shè)置線型 為畫線函數(shù)設(shè)置當(dāng)前線型,包括線型、線圖樣和線寬。此處為實(shí)線加寬 */
for(i=50;i<=600;i+=10)/*畫圍墻*/
{
rectangle(i,40,i+10,49); /*上邊 畫矩形函數(shù)用當(dāng)前繪圖色、線型及線寬,畫一個(gè)給定左上角與右下角的矩形 */
rectangle(i,451,i+10,460);/*下邊 此函數(shù)調(diào)用方式為void rectangle(int left,int top,int right,int bottom); */
}/* 以一個(gè)小格為一個(gè)單位來畫圍墻的上下兩行 */
for(i=40;i<=450;i+=10)
{
rectangle(50,i,59,i+10); /*左邊*/
rectangle(601,i,610,i+10);/*右邊*/
}/* 以一個(gè)小格為一個(gè)單位來畫圍墻的左右兩行 */
}
/*玩游戲具體過程*/
void GamePlay(void)
{
randomize();/*隨機(jī)數(shù)發(fā)生器*/
food.yes=1;/*1表示需要出現(xiàn)新食物,0表示已經(jīng)存在食物*/
snake.life=0;/*活著*/
snake.direction=1;/*方向往右*/
snake.x[0]=100;snake.y[0]=100;/*蛇頭 初始化位置*/
snake.x[1]=110;snake.y[1]=100;
snake.node=2;/*節(jié)數(shù)*/
PrScore();/*輸出得分*/
while(1)/*可以重復(fù)玩游戲,壓ESC鍵結(jié)束*/
{
while(!kbhit())/*檢查當(dāng)前按下的鍵 在沒有按鍵的情況下,蛇自己移動(dòng)身體*/
{/* 關(guān)于kbhit()的返回值,查找有些地方都說檢查到按鍵返回1沒有檢查到返回0但本人在Win-TC1.9.1上測(cè)試為檢查到返回-1沒檢查到返回0 */
/* 所以kbhit()沒檢查到時(shí)返回0檢查到返回非0相對(duì)準(zhǔn)確些 */
/* 再說一點(diǎn),該函數(shù)只是檢查當(dāng)前是否有按鍵信息,卻不捕獲該信息。也就是說你按下一個(gè)'Q'它知道你有按下鍵,后面如果有捕獲按鍵信息的函數(shù),那么那個(gè)函數(shù)仍然可以捕獲這個(gè)'Q'信息的 */
if(food.yes==1) /*需要出現(xiàn)新食物*/
{
food.x=rand()%400+60;/* rand()產(chǎn)生隨機(jī)數(shù)。rand()%400+60這個(gè)表達(dá)式說明產(chǎn)生的隨機(jī)數(shù)范圍是[60,460) */
food.y=rand()%350+60;
while(food.x%10!=0)/*食物隨機(jī)出現(xiàn)后必須讓食物能夠在整格內(nèi),這樣才可以讓蛇吃到,因?yàn)樽髡甙衙總€(gè)小格的大小定義為10*10,所以蛇頭的位置必然在橫(列)中是10的整數(shù)倍 */
food.x++;
while(food.y%10!=0)
food.y++;
food.yes=0;/*畫面上有食物了*/
}
if(food.yes==0)/*畫面上有食物了就要顯示*/
{
setcolor(GREEN);
rectangle(food.x,food.y,food.x+10,food.y-10);/* 根據(jù)剛才設(shè)置的食物的位置畫出食物來 */
}
for(i=snake.node-1;i>0;i--)/*蛇的每個(gè)環(huán)節(jié)往前移動(dòng),也就是貪吃蛇的關(guān)鍵算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1];
}
/*1,2,3,4表示右,左,上,下四個(gè)方向,通過這個(gè)判斷來移動(dòng)蛇頭*/
switch(snake.direction)
{
case 1:snake.x[0]+=10;break; /* 向右 */
case 2: snake.x[0]-=10;break; /* 向左 */
case 3: snake.y[0]-=10;break; /* 向上 */
case 4: snake.y[0]+=10;break; /* 向下 */
}
for(i=3;i
{
if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
{
GameOver();/*顯示失敗*/
snake.life=1;
break;
}
}
if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||snake.y[0]>455)/*蛇是否撞到墻壁這里的數(shù)字都是內(nèi)壁與外壁的中點(diǎn),來判斷蛇頭是否超過了內(nèi)壁*/
{
GameOver();/*本次游戲結(jié)束*/
snake.life=1; /*蛇死*/
}
if(snake.life==1)/*以上兩種判斷以后,如果蛇死就跳出內(nèi)循環(huán),重新開始*/
break;
if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
{
setcolor(0);/*把畫面上的食物東西去掉*/
rectangle(food.x,food.y,food.x+10,food.y-10);
snake.x[snake.node]=-20;snake.y[snake.node]=-20;
/*新的一節(jié)先放在看不見的位置,下次循環(huán)就取前一節(jié)的位置,此時(shí)雖然這節(jié)沒有顯示出來,不過蛇結(jié)構(gòu)確實(shí)已經(jīng)有了這節(jié)的數(shù)據(jù)*/
snake.node++;/*蛇的身體長(zhǎng)一節(jié)*/
food.yes=1;/*畫面上需要出現(xiàn)新的食物*/
score+=10;
PrScore();/*輸出新得分*/
}
setcolor(4);/*畫出蛇 這里4是紅色 */
for(i=0;i
rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]-10);
delay(gamespeed);/* 將程序的執(zhí)行暫停一段時(shí)間(毫秒) void delay(unsigned milliseconds); 程序暫停就是蛇在停止 */
setcolor(0);/*用黑色(作者說是黑色不過我測(cè)試的結(jié)果為setcolor(0)是設(shè)置成背景色,也就是說不管你的背景色設(shè)置成什么顏色,該函數(shù)都會(huì)使得繪圖色于背景色一樣,從而實(shí)現(xiàn)"不顯色"蛇最后一節(jié),但setbkcolor(0)確實(shí)將背景色設(shè)置為黑色)去除蛇的的最后一節(jié)*/
rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1]+10,snake.y[snake.node-1]-10); /* 當(dāng)程序休息過,先去掉蛇的最后一節(jié),因?yàn)樵谥匦庐嬌叩臅r(shí)候(for語句)并沒有去掉蛇尾巴的過程 */
} /*end:while(!kbhit)*/
if(snake.life==1)/*如果蛇死就跳出循環(huán)*/
break;
key=bioskey(0);/*接收按鍵函數(shù)bioskey()的原型為: int bioskey(int cmd); */
/* 當(dāng)cmd==0時(shí),bioskey()返回按健的鍵值,該值是2 個(gè)字節(jié)的整型數(shù)。當(dāng)按下時(shí),若返回值的低8 位為非零,則表示為普通鍵,其值代表該鍵的ASCII 碼。若返回值的低8 位為0,則高8 位表示為擴(kuò)展的ASCII碼,表示按下的是特殊功能鍵*/
/* 由于while(!kbhit())的“再說一點(diǎn)”所以這里bioskey()函數(shù)仍然能捕獲這個(gè)按鍵的信息。 */
if(key==ESC)/*按ESC鍵退出*/
break;
else if(key==UP&&snake.direction!=4)
/*判斷是否往相反的方向移動(dòng),如果不是相反方向才確認(rèn)新的方向*/
snake.direction=3;
else if(key==RIGHT&&snake.direction!=2)
snake.direction=1;
else if(key==LEFT&&snake.direction!=1)
snake.direction=2;
else if(key==DOWN&&snake.direction!=3)
snake.direction=4;
}/*end:while(1)*/
}
/*游戲結(jié)束*/
void GameOver(void)
{
cleardevice(); /* 清除整個(gè)屏幕,并且將當(dāng)前位置移到屏幕原點(diǎn)。該函數(shù)類似于文本模式下的函數(shù)clrscr(),但clrscr()函數(shù)不能在圖形方式下工作;同樣cleardevice()函數(shù)不能在文本模式下工作。 */
PrScore();
setcolor(15); /* 以下三個(gè)函數(shù)見PrScore()中說明 */
settextstyle(0,0,4);
outtextxy(200,200,"GAME OVER");
getch();
}
/*輸出成績(jī)*/
void PrScore(void)
{
char str[10];
setfillstyle(SOLID_FILL,14); /* 為各種圖形函數(shù)設(shè)置填充圖樣和顏色 */
bar(50,15,220,35); /* 用當(dāng)前填充圖樣和填充色(注意不是給圖色)畫出一個(gè)指定上左上角與右下角的實(shí)心長(zhǎng)條形(長(zhǎng)方塊或正方塊),但沒有四條邊線 */
/* bar()函數(shù)調(diào)用方式為void bar(int left,int top,int right,int bottom);調(diào)用此函數(shù)前,可用setfillstyle()或setfillpattern()設(shè)置當(dāng)前填充圖樣和填充色。 */
setcolor(6); /* 函數(shù)setcolor()設(shè)置當(dāng)前繪圖顏色(或稱做前景色)。voids setcolor(int color);在低分辨率顯示模式(320X200)下,選取的color是調(diào)色板顏色號(hào),不是實(shí)際色彩值。 */
settextstyle(0,0,2); /* 為圖形輸出設(shè)置當(dāng)前的文本屬性 void far settextstyle (int font, int direction, char size); 設(shè)置圖形文本當(dāng)前字體、文本顯示方向(水平顯示或垂直顯示)以及字符大小。 */
sprintf(str,"score:%d",score); /* score已經(jīng)被定義成了全局變量,score內(nèi)容格式化到str */
outtextxy(55,20,str); /* 在(x,y)處顯示字符串 */
}
/*圖形結(jié)束*/
void Close(void)
{
getch();
closegraph(); /* 關(guān)閉圖形系統(tǒng) */
}
總結(jié)
以上是生活随笔為你收集整理的c语言贪吃蛇黑方框,[求助][贪吃蛇]源程序,请教其中一个问题。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 百度地图开发 怎么减小包
- 下一篇: 简单的python画图代码_python