思路分析:
(1)使用該函數(shù)首先應(yīng)在開(kāi)頭包含頭文件stdlib.h
#include<stdlib.h>(C++建議使用#include<cstdlib>,下同)
(2)在標(biāo)準(zhǔn)的C庫(kù)中函數(shù)rand()可以生成0~RAND_MAX之間的一個(gè)隨機(jī)數(shù),其中RAND_MAX是stdlib.h 中定義的一個(gè)整數(shù),它與系統(tǒng)有關(guān)。
(3)rand()函數(shù)沒(méi)有輸入?yún)?shù),直接通過(guò)表達(dá)式rand()來(lái)引用;例如可以用下面的語(yǔ)句來(lái)打印兩個(gè)隨機(jī)數(shù):
printf(“Random numbers are: %i %i ”,rand(),rand());
(4)因?yàn)閞and()函數(shù)是按指定的順序來(lái)產(chǎn)生整數(shù),因此每次執(zhí)行上面的語(yǔ)句都打印相同的兩個(gè)值,所以說(shuō)C語(yǔ)言的隨機(jī)并不是真正意義上的隨機(jī),有時(shí)候也叫偽隨機(jī)數(shù)。
(5)為了使程序在每次執(zhí)行時(shí)都能生成一個(gè)新序列的隨機(jī)值,我們通常通過(guò)為隨機(jī)數(shù)生成器提供一粒新的隨機(jī)種子。函數(shù)srand()(來(lái)自stdlib.h)可以為隨機(jī)數(shù)生成器播散種子。只要種子不同rand()函數(shù)就會(huì)產(chǎn)生不同的隨機(jī)數(shù)序列。srand()稱(chēng)為隨機(jī)數(shù)生成器的初始化器。
修改部分及bug:
1.速度值反show函數(shù)及操作中的bug
2.源代碼注釋
3.新增最高紀(jì)錄變量
源碼展示:(CSDN:Shawn Hou)
#include <windows.h>#include <stdlib.h>#include <conio.h>#include <time.h>#include <cstring>#include <cstdio>#include <iostream>#define N 25using namespace std;int gameover;//游戲失敗的值int x1, y1; // 隨機(jī)生成食物的坐標(biāo)int x,y;int record=0; //當(dāng)前用戶(hù)最高紀(jì)錄long start;//下面定義貪吃蛇的坐標(biāo)類(lèi)class snake_position{public:int x,y;snake_position(){};void initialize(int &);//坐標(biāo)初始化};snake_position position[(N-2)*(N-2)+1]; //定義貪吃蛇坐標(biāo)類(lèi)數(shù)組,有(N-2)*(N-2)個(gè)坐標(biāo)void snake_position::initialize(int &j){x = 1;y = j;}//下面定義貪吃蛇的棋盤(pán)圖class snake_map{private:char s[N][N];//定義貪吃蛇棋盤(pán),包括墻壁。int grade, length;int gamespeed; //前進(jìn)時(shí)間間隔char direction; // 初始情況下,向右運(yùn)動(dòng)int head,tail;//頭和尾int score;//分?jǐn)?shù)bool gameauto;public:snake_map(int h=4,int t=1,int l=4,char d=77,int s=0):length(l),direction(d),head(h),tail(t),score(s){}void initialize(); //初始化函數(shù)void show_game();int updata_game();void tpoint();void getgrade();void display();};//定義初始化函數(shù),將貪吃蛇的棋盤(pán)圖進(jìn)行初始化void snake_map::initialize(){int i,j;for(i=1;i<=3;i++)s[1][i] = '*';s[1][4] = '#';for(i=1;i<=N-2;i++)for(j=1;j<=N-2;j++)s[i][j]=' '; // 初始化貪吃蛇棋盤(pán)中間空白部分for(i=0;i<=N-1;i++)s[0][i] = s[N-1][i] = '+'; //初始化貪吃蛇棋盤(pán)上下墻壁for(i=1;i<=N-2;i++)s[i][0] = s[i][N-1] = '+'; //初始化貪吃蛇棋盤(pán)左右墻壁}//============================================//輸出貪吃蛇棋盤(pán)信息void snake_map::show_game(){system("cls"); // 清屏int i,j;cout << endl;for(i=0;i<N;i++){cout << ' ';for(j=0;j<N;j++)cout<<s[i][j]<<' '; // 輸出貪吃蛇棋盤(pán)if(i==2) cout << " 等級(jí):" << grade;if(i==6) cout << " 得分:" << score << "分" ;if(i==10) cout<<" 最高紀(jì)錄:"<<record<<"分" ;if(i==14) cout << " 暫停:按一下空格鍵" ;if(i==18) cout << " 繼續(xù):按兩下空格鍵" ;if(i==20) cout<<" 提示:按住方向鍵可以加速,分?jǐn)?shù)計(jì)算公式為個(gè)數(shù)*等級(jí)" ;if(i==24) cout<<" 非空格鍵結(jié)束游戲" ;cout<<endl;}}//輸入選擇等級(jí)void snake_map::getgrade(){cin>>grade;while( grade>7 || grade<1 ){cout << "請(qǐng)輸入數(shù)字1-7選擇等級(jí)" << endl;cin >> grade;}switch(grade){ca 1: gamespeed = 1000;gameauto = 0;break;ca 2: gamespeed = 800;gameauto = 0;break;ca 3: gamespeed = 600;gameauto = 0;break;ca 4: gamespeed = 400;gameauto = 0;break;ca 5: gamespeed = 200;gameauto = 0;break;ca 6: gamespeed = 100;gameauto = 0;break;ca 7: grade = 1;gamespeed = 1000;gameauto = 1;break;}}//輸出等級(jí),得分情況以及稱(chēng)號(hào)void snake_map::display(){cout << "
等級(jí):" << grade;cout << "
得分:" << score << "分" ;cout << "
最高紀(jì)錄:"<<record<<"分" ;cout << "
www.omegaxyz.com";}//隨機(jī)產(chǎn)生米void snake_map::tpoint(){srand(time(0));do{x1 = rand() % (N-2) + 1;y1 = rand() % (N-2) + 1;}while(s[x1][y1]!=' ');s[x1][y1]='*';}char key;int snake_map::updata_game(){gameover = 1;key = direction;start = clock();while((gameover=(clock()-start<=gamespeed))&&!kbhit());//如果有鍵按下或時(shí)間超過(guò)自動(dòng)前進(jìn)時(shí)間間隔則終止循環(huán)if(gameover){getch();key = getch();}if(key == ' '){while(getch()!=' '){};//這里實(shí)現(xiàn)的是按空格鍵暫停,按空格鍵繼續(xù)的功能,但不知為何原因,//需要按兩下空格才能繼續(xù)。這是個(gè)bug。}eldirection = key;switch(direction){ca 72: x= position[head].x-1; y= position[head].y;break; // 向上ca 80: x= position[head].x+1; y= position[head].y;break; // 向下ca 75: x= position[head].x; y= position[head].y-1;break; // 向左ca 77: x= position[head].x; y= position[head].y+1; // 向右}if(!(direction==72||direction==80||direction==75 ||direction==77))// 按鍵非方向鍵gameover = 0;el if(x==0 || x==N-1 ||y==0 || y==N-1) // 碰到墻壁gameover = 0;el if(s[x][y]!=' '&&!(x==x1&&y==y1)) // 蛇頭碰到蛇身gameover = 0;el if(x==x1 && y==y1){ // 吃米,長(zhǎng)度加1length ++;if(length>=8 && gameauto){length -= 8;grade ++;if(gamespeed>=200)gamespeed -= 200; // 改變貪吃蛇前進(jìn)速度elgamespeed = 100;}s[x][y]= '#'; //更新蛇頭s[position[head].x][position[head].y] = '*'; //吃米后將原先蛇頭變?yōu)樯呱韍ead = (head+1) % ( (N-2)*(N-2) ); //取蛇頭坐標(biāo)position[head].x = x;position[head].y = y;show_game();gameover = 1;score += grade*1; //加分if(snake_map::score>record)record=score;tpoint(); //產(chǎn)生米}el{ // 不吃米s[position[tail].x][position[tail].y]=' ';//將蛇尾置空tail= (tail+1) % ( (N-2) * (N-2) );//更新蛇尾坐標(biāo)s[position[head].x][position[head].y]='*'; //將蛇頭更為蛇身head= (head+1) % ( (N-2) * (N-2) );position[head].x = x;position[head].y = y;s[position[head].x][position[head].y]='#'; //更新蛇頭gameover = 1;}return gameover;}//====================================//主函數(shù)部分//====================================int main(){char ctn = 'y';int nodead;cout<<" -----------------------------------------------------";cout<<"
貪吃蛇"<<endl;cout<<"
感謝Shawn Hou提供源代碼"<<endl;cout<<"
xyjigsaw修改"<<endl;cout<<"
修改內(nèi)容:
1.速度bug
2.隨機(jī)生成選擇的固定性
3.源代碼注釋
4.新增最高紀(jì)錄變量"<<endl;cout<<"
空格暫停問(wèn)題未優(yōu)化,請(qǐng)大家指正"<<endl;cout<<"
按任意鍵開(kāi)始----->>"<<endl;cout<<"
www.omegaxyz.com";cout<<"
-----------------------------------------------------"<<endl;getch();while( ctn=='y' ){system("cls");snake_map snake;snake.initialize();cout << "
請(qǐng)選擇游戲等級(jí):" << endl;cout << "
1.辣雞:速度 100
2.菜鳥(niǎo):速度 200
3.入門(mén):速度 400 ";cout << "
4.中等:速度 600
5.較快:速度 800
6.飛:速度 1000
7.隨機(jī)" << endl;snake.getgrade();//獲取等級(jí)for(int i=1;i<=4;i++){position[i].initialize(i);//初始化坐標(biāo)}snake.tpoint(); // 產(chǎn)生第一個(gè)食物do{snake.show_game();nodead = snake.updata_game();}while(nodead);system("cls"); //清屏cout<<" -----------------------------------------";cout << "
Gameover!
"<<endl;snake.display();//輸出等級(jí)/得分情況cout << "
是否繼續(xù)?輸入 y 繼續(xù),n 退出"<<endl;cout<<" -----------------------------------------"<<endl;cin >> ctn;}return 0;}
效果展示:
希望對(duì)大家有幫助,有什么C/C++學(xué)習(xí)上的問(wèn)題也可以來(lái)和我交流!
寫(xiě)在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!
編程學(xué)習(xí)書(shū)籍分享:
編程學(xué)習(xí)視頻分享:
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
對(duì)于C/C++感興趣可以關(guān)注小編在后臺(tái)私信我:【編程交流】一起來(lái)學(xué)習(xí)哦!可以領(lǐng)取一些C/C++的項(xiàng)目學(xué)習(xí)視頻資料哦!已經(jīng)設(shè)置好了關(guān)鍵詞自動(dòng)回復(fù),自動(dòng)領(lǐng)取就好了!
本文發(fā)布于:2023-02-28 19:58:00,感謝您對(duì)本站的認(rèn)可!
本文鏈接:http://www.newhan.cn/zhishi/a/167764677273019.html
版權(quán)聲明:本站內(nèi)容均來(lái)自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。
本文word下載地址:c語(yǔ)言編程(c語(yǔ)言編程入門(mén)自學(xué)).doc
本文 PDF 下載地址:c語(yǔ)言編程(c語(yǔ)言編程入門(mén)自學(xué)).pdf
| 留言與評(píng)論(共有 0 條評(píng)論) |