利用C/C++實(shí)現(xiàn)較完整貪吃蛇游戲
記得在大一時剛學(xué)習(xí)c/c++語言,學(xué)到一半突然想用這門語言做一些小游戲出來,首先想到的便是貪吃蛇。于是本人利用空余時間寫出了這么一個簡單的小游戲。
由于當(dāng)時的我還沒有能力構(gòu)造出用戶界面,故直接使用dos界面運(yùn)行。那么問題來了,如何讓一個字符在dos界面上自由移動???對于這個問題我采用的解決方案是實(shí)現(xiàn)gotoxy函數(shù)來控制指針位置從而實(shí)現(xiàn)字符的移動。那么我們就先來實(shí)現(xiàn)這個函數(shù)。
gotoxy 函數(shù)并非系統(tǒng)函數(shù),我將其儲存于 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ù)對指針進(jìn)行控制,那么實(shí)現(xiàn)字符的移動則只需將原來位置的字符清除,然后利用此函數(shù)移動指針到想去的坐標(biāo)后打印字符即可。
在對此函數(shù)進(jìn)行測試的時候,我發(fā)現(xiàn)了一個重要的問題,因?yàn)榇a是一行一行的運(yùn)行,那么在等待我輸入方向的時候,其他代碼是無法執(zhí)行的,這意味這我的蛇只能是我給一下方向它移動一下,那么該如何使得字符在等待我輸出方向的同時自行移動呢???對于這個問題有兩個解決方案:一、創(chuàng)建線程(對于當(dāng)時的我來說線程還很陌生) 二、利用 kbhit() 非阻塞函數(shù)(百度一下,你就知道)。當(dāng)然我選擇的是第二個方案,再配合使用 getch() 函數(shù)即可完美實(shí)現(xiàn)方向的輸入。
該游戲的兩個難點(diǎn)都解決了,話不多說 ↓
(由于沒有涉及什么算法,加之年少,代碼顯得過于冗長)
這里主要運(yùn)用到的知識有這些:結(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(); //游戲開始入場 void init_snake(); //初始化蛇身 void delete_snake(); //刪除蛇身 void control(); //方向控制 void move(); //蛇身移動 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<<"開始請輸入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<<"重新開始請輸入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ù)很多,有興趣的朋友可以自行改動一些函數(shù)對比效果。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C++設(shè)計模式之觀察者模式(Observer)
欄 目:C語言
下一篇:基于C++實(shí)現(xiàn)五子棋AI算法思想
本文標(biāo)題:利用C/C++實(shí)現(xiàn)較完整貪吃蛇游戲
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/842.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-用棧實(shí)現(xiàn)表達(dá)式求值的方法詳解
- 01-10使用OpenGL實(shí)現(xiàn)3D立體顯示的程序代碼
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10求斐波那契(Fibonacci)數(shù)列通項(xiàng)的七種實(shí)現(xiàn)方法
- 01-10C語言 解決不用+、-、&#215;、&#247;數(shù)字運(yùn)算符做加法
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10深入全排列算法及其實(shí)現(xiàn)方法


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載