題主看下這個(gè)。
創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需定制設(shè)計(jì),是成都網(wǎng)站營(yíng)銷推廣公司,為成都報(bào)廢汽車回收提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開發(fā)等。成都網(wǎng)站建設(shè)熱線:13518219792
//******友情提示:如想速度快點(diǎn),請(qǐng)改小_sleep(500)函數(shù)中參數(shù)*****??
#include?stdio.h??
#include?stdlib.h??
#include?conio.h??
#include?string.h??
#include?time.h??
const?int?H?=?8;???//地圖的高??
const?int?L?=?16;??//地圖的長(zhǎng)??
char?GameMap[H][L];???//游戲地圖??
int??key;??//按鍵保存??
int??sum?=?1,?over?=?0;??//蛇的長(zhǎng)度,?游戲結(jié)束(自吃或碰墻)??
int??dx[4]?=?{0,?0,?-1,?1};??//左、右、上、下的方向??
int??dy[4]?=?{-1,?1,?0,?0};??
struct?Snake???//蛇的每個(gè)節(jié)點(diǎn)的數(shù)據(jù)類型??
{??
int?x,?y;??//左邊位置??
int?now;???//保存當(dāng)前節(jié)點(diǎn)的方向,?0,1,2,3分別為左右上下??
}Snake[H*L];??
const?char?Shead?=?'@';??//蛇頭??
const?char?Sbody?=?'#';??//蛇身??
const?char?Sfood?=?'*';??//食物??
const?char?Snode?=?'.';??//'.'在地圖上標(biāo)示為空??
void?Initial();??//地圖的初始化??
void?Create_Food();?//在地圖上隨機(jī)產(chǎn)生食物??
void?Show();???//刷新顯示地圖??
void?Button();??//取出按鍵,并判斷方向??
void?Move();???//蛇的移動(dòng)??
void?Check_Border();??//檢查蛇頭是否越界??
void?Check_Head(int?x,?int?y);???//檢查蛇頭移動(dòng)后的位置情況??
int?main()???
{??
Initial();??
Show();??
return?0;??
}??
void?Initial()??//地圖的初始化??
{??
int?i,?j;??
int?hx,?hy;??
system("title?貪吃蛇");??//控制臺(tái)的標(biāo)題??
memset(GameMap,?'.',?sizeof(GameMap));??//初始化地圖全部為空'.'??
system("cls");??
srand(time(0));???//隨機(jī)種子??
hx?=?rand()%H;????//產(chǎn)生蛇頭??
hy?=?rand()%L;??
GameMap[hx][hy]?=?Shead;??
Snake[0].x?=?hx;??Snake[0].y?=?hy;??
Snake[0].now?=?-1;??
Create_Food();???//隨機(jī)產(chǎn)生食物??
for(i?=?0;?i??H;?i++)???//地圖顯示??
{???
for(j?=?0;?j??L;?j++)??
printf("%c",?GameMap[i][j]);??
printf("\n");??
}??
printf("\n小小C語(yǔ)言貪吃蛇\(yùn)n");??
printf("按任意方向鍵開始游戲\n");??
getch();???//先接受一個(gè)按鍵,使蛇開始往該方向走??
Button();??//取出按鍵,并判斷方向??
}??
void?Create_Food()??//在地圖上隨機(jī)產(chǎn)生食物??
{??
int?fx,?fy;??
while(1)??
{??
fx?=?rand()%H;??
fy?=?rand()%L;??
if(GameMap[fx][fy]?==?'.')??//不能出現(xiàn)在蛇所占有的位置??
{???
GameMap[fx][fy]?=?Sfood;??
break;??
}??
}??
}??
void?Show()??//刷新顯示地圖??
{??
int?i,?j;??
while(1)??
{????
_sleep(500);?//延遲半秒(1000為1s),即每半秒刷新一次地圖??
Button();???//先判斷按鍵在移動(dòng)??
Move();??
if(over)??//自吃或碰墻即游戲結(jié)束??
{???
printf("\n**游戲結(jié)束**\n");??
printf("?????_\n");??
getchar();??
break;??
}??
system("cls");???//清空地圖再顯示刷新吼的地圖??
for(i?=?0;?i??H;?i++)???
{???
for(j?=?0;?j??L;?j++)??
printf("%c",?GameMap[i][j]);??
printf("\n");??
}??
printf("\n小小C語(yǔ)言貪吃蛇\(yùn)n");??
printf("按任意方向鍵開始游戲\n");??
}??
}??
void?Button()??//取出按鍵,并判斷方向??
{??
if(kbhit()?!=?0)?//檢查當(dāng)前是否有鍵盤輸入,若有則返回一個(gè)非0值,否則返回0??
{???
while(kbhit()?!=?0)??//可能存在多個(gè)按鍵,要全部取完,以最后一個(gè)為主??
key?=?getch();?//將按鍵從控制臺(tái)中取出并保存到key中??
switch(key)??
{???//左??
case?75:??Snake[0].now?=?0;??
break;??
//右??
case?77:??Snake[0].now?=?1;???????
break;??
//上??
case?72:??Snake[0].now?=?2;??
break;??
//下??
case?80:??Snake[0].now?=?3;??
break;??
}??
}??
}??
void?Move()???//蛇的移動(dòng)??
{??
int?i,?x,?y;??
int?t?=?sum;??//保存當(dāng)前蛇的長(zhǎng)度??
//記錄當(dāng)前蛇頭的位置,并設(shè)置為空,蛇頭先移動(dòng)??
x?=?Snake[0].x;??y?=?Snake[0].y;??GameMap[x][y]?=?'.';??
Snake[0].x?=?Snake[0].x?+?dx[?Snake[0].now?];??
Snake[0].y?=?Snake[0].y?+?dy[?Snake[0].now?];??
Check_Border();???//蛇頭是否越界??
Check_Head(x,?y);??//蛇頭移動(dòng)后的位置情況,參數(shù)為:?蛇頭的開始位置??
if(sum?==?t)??//未吃到食物即蛇身移動(dòng)哦??
for(i?=?1;?i??sum;?i++)??//要從蛇尾節(jié)點(diǎn)向前移動(dòng)哦,前一個(gè)節(jié)點(diǎn)作為參照??
{??
if(i?==?1)???//尾節(jié)點(diǎn)設(shè)置為空再移動(dòng)??
GameMap[?Snake[i].x?][?Snake[i].y?]?=?'.';??
if(i?==?sum-1)??//為蛇頭后面的蛇身節(jié)點(diǎn),特殊處理??
{??
Snake[i].x?=?x;??
Snake[i].y?=?y;??
Snake[i].now?=?Snake[0].now;??
}??
else???//其他蛇身即走到前一個(gè)蛇身位置??
{??
Snake[i].x?=?Snake[i+1].x;??
Snake[i].y?=?Snake[i+1].y;??
Snake[i].now?=?Snake[i+1].now;??
}??
GameMap[?Snake[i].x?][?Snake[i].y?]?=?'#';?//移動(dòng)后要置為'#'蛇身???
}??
}??
void?Check_Border()??//檢查蛇頭是否越界??
{??
if(Snake[0].x??0?||?Snake[0].x?=?H??
||?Snake[0].y??0?||?Snake[0].y?=?L)??
over?=?1;??
}??
void?Check_Head(int?x,?int?y)??//檢查蛇頭移動(dòng)后的位置情況??
{??
if(GameMap[?Snake[0].x?][?Snake[0].y?]?==?'.')??//為空??
GameMap[?Snake[0].x?][?Snake[0].y?]?=?'@';??
else?
if(GameMap[?Snake[0].x?][?Snake[0].y?]?==?'*')??//為食物??
{??
GameMap[?Snake[0].x?][?Snake[0].y?]?=?'@';????
Snake[sum].x?=?x;???//新增加的蛇身為蛇頭后面的那個(gè)??
Snake[sum].y?=?y;??
Snake[sum].now?=?Snake[0].now;??
GameMap[?Snake[sum].x?][?Snake[sum].y?]?=?'#';???
sum++;??
Create_Food();??//食物吃完了馬上再產(chǎn)生一個(gè)食物??
}??
else?
over?=?1;??
}
這是因?yàn)間etchar前面有一個(gè)scanf("%lf",a);
你輸入完a的值后,是否會(huì) 輸入回車 這個(gè)回車就是一個(gè)字符啊,這個(gè)字符就被getchar當(dāng)做你輸入的字符了,所以看起來(lái)像沒有執(zhí)行,其實(shí)是執(zhí)行了。
可以在getchar()前使用
fflush(stdin);
刷新標(biāo)準(zhǔn)輸入緩沖區(qū),把輸入緩沖區(qū)里的東西丟棄
這樣就可以輸入字符了。
C語(yǔ)言的gets函數(shù)一般包含在stdio.h頭文件里,如果沒有包含比頭文件那可能會(huì)有問題。第二種情況包含了還出問題,說(shuō)明你的編譯器已經(jīng)不支持這個(gè)函數(shù)了,這個(gè)函數(shù)非常不安全,容易造成溢出,建議換成fgets函數(shù)。
函數(shù)原型:
char *fgets(char *buf, int bufsize, FILE *fp);
參數(shù)解釋:
參數(shù)一是輸入字符串存放地址,
參數(shù)二是存放地址最大容量,
參數(shù)三是從哪里輸入,可以從文件也可從輸入設(shè)備,如果從輸入設(shè)備輸入這個(gè)參數(shù)可以寫成stdin,如果從文件輸入此參數(shù)為文件指針。
返回值:
輸入成功返回參數(shù)一,失敗返回NULL.
補(bǔ)充知識(shí):
為什么gets不讓用呢,我們可以看它的原型:char *gets(char *buf);
這個(gè)函數(shù)可以一直輸入知道換行或者EOF,它并不考慮buf空間是否足夠大能放下,這就容易導(dǎo)致溢出,有些別有用心的人就會(huì)利用這個(gè)漏洞去攻擊你的程序。
而fgets可以通過第二參數(shù)保證不會(huì)讀入超過buf空間的字符。
談不上“危險(xiǎn)”,
gets()
函數(shù)從標(biāo)準(zhǔn)輸入讀入
一行文本,直到讀到
新行符
或
EOF
字符
之前,不會(huì)停止讀入文本。也就是:gets()
不檢查邊界。因此,當(dāng)變量空間
小于
一行字符串
時(shí),
使用
gets()
會(huì)造成
溢出,程序出錯(cuò)。
例如:
#includestdio.h
int
main(
)
{
char
s[5];
printf
("input
one
line:
");
gets(s);
printf
("%s\n",s);
return
0;
}
這里,char
s[5];
最多存放
5個(gè)字符,如果
輸入一行字符
太多,
例如
輸入了
10
個(gè)字符,程序會(huì)
出錯(cuò)。出錯(cuò)其實(shí)沒什么大不了,發(fā)現(xiàn)問題,你可以修改
成
char
s[15];
或
輸入語(yǔ)句提示
printf
("input
one
line,
less
than
5
chars:
");
談不上“危險(xiǎn)”.
當(dāng)前標(biāo)題:c語(yǔ)言get函數(shù)為何不好 c語(yǔ)言get怎么用
當(dāng)前路徑:http://muchs.cn/article8/hgieop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站建設(shè)、搜索引擎優(yōu)化、網(wǎng)站制作、云服務(wù)器、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)