最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用C/C++實(shí)現(xiàn)較完整貪吃蛇游戲

 更新時(shí)間:2020年04月28日 09:23:42   作者:CoderLC  
這篇文章主要為大家詳細(xì)介紹了利用C/C++實(shí)現(xiàn)較完整貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

記得在大一時(shí)剛學(xué)習(xí)c/c++語(yǔ)言,學(xué)到一半突然想用這門語(yǔ)言做一些小游戲出來(lái),首先想到的便是貪吃蛇。于是本人利用空余時(shí)間寫出了這么一個(gè)簡(jiǎn)單的小游戲。

由于當(dāng)時(shí)的我還沒(méi)有能力構(gòu)造出用戶界面,故直接使用dos界面運(yùn)行。那么問(wèn)題來(lái)了,如何讓一個(gè)字符在dos界面上自由移動(dòng)???對(duì)于這個(gè)問(wèn)題我采用的解決方案是實(shí)現(xiàn)gotoxy函數(shù)來(lái)控制指針位置從而實(shí)現(xiàn)字符的移動(dòng)。那么我們就先來(lái)實(shí)現(xiàn)這個(gè)函數(shù)。

gotoxy 函數(shù)并非系統(tǒng)函數(shù),我將其儲(chǔ)存于 gotoxy.h 的頭文件中方便調(diào)用。

gotoxy.h

#include <windows.h> 
void gotoxy(int x,int y) 
{ 
 COORD pos; 
 pos.X = x - 1; 
 pos.Y = y - 1; 
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); 
} 

現(xiàn)在我們已經(jīng)能夠利用 gotoxy 函數(shù)對(duì)指針進(jìn)行控制,那么實(shí)現(xiàn)字符的移動(dòng)則只需將原來(lái)位置的字符清除,然后利用此函數(shù)移動(dòng)指針到想去的坐標(biāo)后打印字符即可。

在對(duì)此函數(shù)進(jìn)行測(cè)試的時(shí)候,我發(fā)現(xiàn)了一個(gè)重要的問(wèn)題,因?yàn)榇a是一行一行的運(yùn)行,那么在等待我輸入方向的時(shí)候,其他代碼是無(wú)法執(zhí)行的,這意味這我的蛇只能是我給一下方向它移動(dòng)一下,那么該如何使得字符在等待我輸出方向的同時(shí)自行移動(dòng)呢???對(duì)于這個(gè)問(wèn)題有兩個(gè)解決方案:一、創(chuàng)建線程(對(duì)于當(dāng)時(shí)的我來(lái)說(shuō)線程還很陌生) 二、利用 kbhit() 非阻塞函數(shù)(百度一下,你就知道)。當(dāng)然我選擇的是第二個(gè)方案,再配合使用 getch() 函數(shù)即可完美實(shí)現(xiàn)方向的輸入。

該游戲的兩個(gè)難點(diǎn)都解決了,話不多說(shuō) ↓

(由于沒(méi)有涉及什么算法,加之年少,代碼顯得過(guò)于冗長(zhǎng))

這里主要運(yùn)用到的知識(shí)有這些:結(jié)構(gòu)體,srand(), rand(), kbhit(), getch(), Sleep().

/*******************http://blog.csdn.net/lcsy000**********************/ 
 
#include<iostream> 
#include"gotoxy.h" 
#include<windows.h> 
#include<conio.h> 
#include<time.h> 
using namespace std; 
char direction_a,direction_b; //方向a、b,用于方向的限制 
int scores,num,fool_x,fool_y,speed=100; //得分、num用于蛇身起步、食物x坐標(biāo)、食物y坐標(biāo) 
bool end; //結(jié)束標(biāo)記 
struct node //蛇身結(jié)點(diǎn) 
{ 
 int x,y; 
 node *next; 
}*head=NULL,*p,*tail; 
 
void init(); //初始化開始界面 
void start(); //游戲開始入場(chǎng) 
void init_snake(); //初始化蛇身 
void delete_snake(); //刪除蛇身 
void control(); //方向控制 
void move(); //蛇身移動(dòng) 
void limit(); //方向限制 
void panduan(); //配合limit限制方向 
void fool(); //食物的出現(xiàn)以及食物被吞 
void isEnd(); //結(jié)束判斷 
void zhuangwei(); //撞尾判斷 
void zhuangqiang(); //撞墻判斷 
 
int main () 
{ 
 srand((unsigned)time(NULL)); 
 init(); 
 cin>>direction_a; 
 if(direction_a!='y'&&direction_a!='Y') 
 return 0; 
 do 
 { 
 system("cls"); //清除屏幕 
 end=false; 
 start(); 
 delete_snake(); 
 init_snake(); 
 scores=0; 
 num=0; 
 fool_x=(rand() % (79-2+1))+ 2; 
 fool_y=(rand() % (22-2+1))+ 2; 
 gotoxy(fool_x,fool_y); 
 cout<<"0"; 
 direction_a=getch(); 
 while(direction_a!='d'&&direction_a!='s'&&direction_a!='w') direction_a=getch(); 
 while(true) 
 { 
 if(num&&direction_a!='d'&&direction_a!='s'&&direction_a!='w'&&direction_a!='a') 
 { 
 direction_a=direction_b; 
 } 
 control(); 
 fool(); 
 Sleep(speed); 
 if(kbhit()) //kbhit 非阻塞函數(shù) 
 { 
 direction_a=getch(); //使用 getch 函數(shù)獲取鍵盤輸入 
 limit(); 
 } 
 panduan(); 
 num=1; 
 zhuangqiang(); 
 zhuangwei(); 
 if(end) break; 
 } 
 }while(direction_a=='y'||direction_a=='Y'); 
 return 0; 
} 
void init() 
{ 
 gotoxy(35,8); 
 cout<<"★貪 吃 蛇★"; 
 gotoxy(36,10); 
 cout<<"開始請(qǐng)輸入y:"; 
} 
void start() 
{ 
 for(int i=0;i<=79;i++) 
 { 
 Sleep(10); 
 cout<<"*"; 
 gotoxy(i+1,24); 
 cout<<"*"; 
 gotoxy(i+2,1); 
 } 
 gotoxy(1,2); 
 for(int i=0;i<=21;i++) 
 { 
 Sleep(20); 
 cout<<"*"; 
 for(int j=0;j<=77;j++) cout<<" "; 
 cout<<"*"; 
 } 
} 
void init_snake()  
{ 
 int n=3; 
 head=new node; 
 tail=head; 
 head->x=40; 
 head->y=12; 
 while(n--) 
 { 
 p=new node; 
 tail->next=p; 
 p->x=tail->x-1; 
 p->y=tail->y; 
 tail=p; 
 } 
 tail->next=NULL; 
 node *q=head->next; 
 gotoxy(head->x,head->y); 
 cout<<'#'; 
 while(q!=NULL) 
 { 
 gotoxy(q->x,q->y); 
 cout<<'*'; 
 q=q->next; 
 } 
} 
void delete_snake() 
{ 
 while(head!=NULL) 
 { 
 node *q=head; 
 head=q->next; 
 delete q; 
 } 
} 
void move() 
{ 
 gotoxy(tail->x,tail->y); 
 cout<<" "; 
 gotoxy(head->next->x,head->next->y); 
 cout<<'*'; 
 gotoxy(head->x,head->y); 
 cout<<'#'; 
 node *q=tail; 
 tail=head; 
 while(tail->next!=q) 
 { 
 tail=tail->next; 
 } 
 tail->next=NULL; 
 delete q; 
} 
void control() 
{ 
 node *q=new node; 
 q->next=head; 
 q->x=head->x; 
 q->y=head->y; 
 head=q; 
 switch(direction_a) 
 { 
 case 'w': head->y--;break; 
 case 's': head->y++;break; 
 case 'a': head->x--;break; 
 case 'd': head->x++;break; 
 default : break; 
 } 
 move(); 
} 
void limit() 
{ 
 
 if(direction_b=='s'&&direction_a=='w') direction_a='s'; 
 if(direction_b=='w'&&direction_a=='s') direction_a='w'; 
 if(direction_b=='a'&&direction_a=='d') direction_a='a'; 
 if(direction_b=='d'&&direction_a=='a') direction_a='d'; 
} 
void panduan() 
{ 
 if(direction_a=='s') direction_b='s'; 
 if(direction_a=='w') direction_b='w'; 
 if(direction_a=='d') direction_b='d'; 
 if(direction_a=='a') direction_b='a'; 
} 
void fool() 
{ 
 node *q; 
 if(head->x==fool_x&&head->y==fool_y) 
 { 
 fool_x=(rand() % (79-2+1))+ 2; 
 fool_y=(rand() % (22-2+1))+ 2; 
 gotoxy(fool_x,fool_y); 
 cout<<"0"; 
 num=0; 
 scores++; 
 node *q=new node; 
 q->x=tail->x; 
 q->y=tail->y; 
 tail->next=q; 
 tail=q; 
 tail->next=NULL; 
 } 
 q=head; 
 while(q!=NULL) 
 { 
 if(q->x==fool_x&q->y==fool_y) 
 { 
 fool_x=(rand() % (79-2+1))+ 2; 
 fool_y=(rand() % (22-2+1))+ 2; 
 gotoxy(fool_x,fool_y); 
 cout<<"*"; 
 q=head; 
 continue; 
 } 
 q=q->next; 
 } 
} 
void isEnd() 
{ 
 end=true; 
 Sleep(600); 
 system("cls"); 
 gotoxy(35,8); 
 cout<<"您 輸 啦 ~"; 
 gotoxy(33,10); 
 cout<<"您的分?jǐn)?shù)為: "<<scores; 
 gotoxy(31,12); 
 cout<<"重新開始請(qǐng)輸入y:"; 
 cin>>direction_a; 
} 
void zhuangwei() 
{ 
 node *q=head->next; 
 while(q!=NULL) 
 { 
 if(head->x==q->x&&head->y==q->y) 
 { 
 isEnd(); 
 break; 
 } 
 q=q->next; 
 } 
} 
void zhuangqiang() 
{ 
 if(head->x==80||head->x==1||head->y==24||head->y==1) 
 isEnd(); 
} 


效果圖:

>

由于考慮到游戲的各種 BUG 故自定義函數(shù)很多,有興趣的朋友可以自行改動(dòng)一些函數(shù)對(duì)比效果。

關(guān)于C++小游戲的更多精彩內(nèi)容請(qǐng)點(diǎn)擊專題: 《C++經(jīng)典小游戲》 學(xué)習(xí)了解

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言SetConsoleTextAttribute函數(shù)使用方法

    C語(yǔ)言SetConsoleTextAttribute函數(shù)使用方法

    這篇文章介紹了C語(yǔ)言SetConsoleTextAttribute函數(shù)的使用方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 擴(kuò)展KMP算法(Extend KMP)

    擴(kuò)展KMP算法(Extend KMP)

    我們這里說(shuō)的KMP不是拿來(lái)放電影的(雖然我很喜歡這個(gè)軟件),而是一種算法。KMP算法是拿來(lái)處理字符串匹配的。今天我們談到的是對(duì)KMP算法的拓展
    2014-08-08
  • Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程

    Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程

    這篇文章主要介紹了Visual Studio Code (vscode) 配置 C / C++ 環(huán)境的流程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析

    C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析

    這篇文章主要介紹了C++?基本數(shù)據(jù)類型中int、long等整數(shù)類型取值范圍及原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 北郵計(jì)算機(jī)考研復(fù)試題的C語(yǔ)言解答精選

    北郵計(jì)算機(jī)考研復(fù)試題的C語(yǔ)言解答精選

    這篇文章主要介紹了北郵計(jì)算機(jī)考研復(fù)試題目的C語(yǔ)言解答精選,選自2012年的一些基礎(chǔ)的上機(jī)題目,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言實(shí)現(xiàn)的一個(gè)萬(wàn)年歷小程序

    C語(yǔ)言實(shí)現(xiàn)的一個(gè)萬(wàn)年歷小程序

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的一個(gè)萬(wàn)年歷小程序,具有一定的參考價(jià)值,做C語(yǔ)言日期計(jì)算的朋友可以參考下
    2014-07-07
  • 詳解c++ 繼承

    詳解c++ 繼承

    這篇文章主要介紹了c++ 繼承的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C語(yǔ)言一篇精通鏈表的各種操作

    C語(yǔ)言一篇精通鏈表的各種操作

    鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)。它是動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的一種結(jié)構(gòu),是根據(jù)需要開辟內(nèi)存單元,鏈表這種數(shù)據(jù)結(jié)構(gòu),必須利用指針變量才能實(shí)現(xiàn),即一個(gè)結(jié)點(diǎn)中應(yīng)包含一個(gè)指針變量,用它存放下一結(jié)點(diǎn)的地址
    2022-04-04
  • C++ 如何實(shí)現(xiàn)一個(gè)日期類

    C++ 如何實(shí)現(xiàn)一個(gè)日期類

    通過(guò)對(duì)類和對(duì)象的學(xué)習(xí),理解了類是對(duì)象的抽象描述,實(shí)現(xiàn)日期類涉及定義年月日屬性及成員函數(shù)如打印日期、日期加減,重點(diǎn)介紹了運(yùn)算符重載的概念和作用,通過(guò)代碼示例展示了如何實(shí)現(xiàn)一個(gè)日期類,包括頭文件和源文件的分離編寫
    2024-10-10
  • 從頭學(xué)習(xí)C語(yǔ)言之for語(yǔ)句和循環(huán)嵌套

    從頭學(xué)習(xí)C語(yǔ)言之for語(yǔ)句和循環(huán)嵌套

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之for語(yǔ)句和循環(huán)嵌套,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01

最新評(píng)論

台湾省| 汾阳市| 海原县| 临猗县| 河西区| 白银市| 酉阳| 红桥区| 若尔盖县| 景洪市| 呼伦贝尔市| 长垣县| 得荣县| 都江堰市| 额尔古纳市| 岫岩| 绩溪县| 宜宾市| 封开县| 报价| 兴山县| 洪雅县| 清原| 通辽市| 天镇县| 阜康市| 龙里县| 蒲江县| 锦州市| 焉耆| 芜湖市| 分宜县| 花垣县| 绥宁县| 武穴市| 玛曲县| 汉川市| 冀州市| 大安市| 九寨沟县| 绥棱县|