亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

利用C/C++實現較完整貪吃蛇游戲

2020-05-23 13:34:11
字體:
來源:轉載
供稿:網友

記得在大一時剛學習c/c++語言,學到一半突然想用這門語言做一些小游戲出來,首先想到的便是貪吃蛇。于是本人利用空余時間寫出了這么一個簡單的小游戲。

由于當時的我還沒有能力構造出用戶界面,故直接使用dos界面運行。那么問題來了,如何讓一個字符在dos界面上自由移動???對于這個問題我采用的解決方案是實現gotoxy函數來控制指針位置從而實現字符的移動。那么我們就先來實現這個函數。

gotoxy 函數并非系統函數,我將其儲存于 gotoxy.h 的頭文件中方便調用。

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); } 

現在我們已經能夠利用 gotoxy 函數對指針進行控制,那么實現字符的移動則只需將原來位置的字符清除,然后利用此函數移動指針到想去的坐標后打印字符即可。

在對此函數進行測試的時候,我發現了一個重要的問題,因為代碼是一行一行的運行,那么在等待我輸入方向的時候,其他代碼是無法執行的,這意味這我的蛇只能是我給一下方向它移動一下,那么該如何使得字符在等待我輸出方向的同時自行移動呢???對于這個問題有兩個解決方案:一、創建線程(對于當時的我來說線程還很陌生) 二、利用 kbhit() 非阻塞函數(百度一下,你就知道)。當然我選擇的是第二個方案,再配合使用 getch() 函數即可完美實現方向的輸入。

該游戲的兩個難點都解決了,話不多說 ↓

(由于沒有涉及什么算法,加之年少,代碼顯得過于冗長)

這里主要運用到的知識有這些:結構體,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坐標、食物y坐標 bool end;    //結束標記 struct node    //蛇身結點 {  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();    //食物的出現以及食物被吞 void isEnd();    //結束判斷 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 非阻塞函數   {   direction_a=getch(); //使用 getch 函數獲取鍵盤輸入   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<<"您的分數為: "<<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(); } 

效果圖:

C++,貪吃蛇,游戲C++,貪吃蛇,游戲C++,貪吃蛇,游戲

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品videosex性欧美| 羞羞色国产精品| 国产成人av网| 久久久亚洲网站| 欧美性猛交xxxx久久久| 97在线视频观看| 米奇精品一区二区三区在线观看| 国产精品成av人在线视午夜片| 亚洲成人av在线| 亚洲黄一区二区| 日韩av在线高清| 欧美一区二区三区艳史| 成人精品久久av网站| 日韩av网址在线| 伊人久久五月天| 日韩一区二区三区国产| 色黄久久久久久| 亚洲美女福利视频网站| 欧美极品少妇全裸体| 最近2019中文字幕第三页视频| 国产精品视频网| 亚洲女人被黑人巨大进入al| 久久精品亚洲国产| 这里精品视频免费| 亚洲aaaaaa| 亚洲电影免费观看| 欧美精品在线视频观看| 国产欧洲精品视频| 九色精品免费永久在线| 国产精品h在线观看| 国外色69视频在线观看| 91爱爱小视频k| 亚洲精品v欧美精品v日韩精品| 亚洲人成电影网| 国产精品久久色| 久久精品亚洲一区| 久热爱精品视频线路一| 日韩在线视频播放| 精品中文字幕乱| 一区二区在线视频播放| 亚洲精品电影网| 亚洲性视频网址| 91久久久久久久久久久| 成人网欧美在线视频| 在线观看中文字幕亚洲| 日韩欧美国产黄色| 91国产一区在线| 欧美精品在线免费观看| 成人激情视频网| 欧美日韩在线另类| 在线亚洲午夜片av大片| 91av免费观看91av精品在线| 亚洲天堂成人在线视频| 欧美在线视频一区| 欧美大尺度在线观看| 亚洲女同性videos| 一本色道久久综合狠狠躁篇的优点| 尤物yw午夜国产精品视频明星| 在线视频免费一区二区| 国产视频观看一区| 国产欧美一区二区三区视频| 欧美日韩一区二区在线播放| 欧美成aaa人片在线观看蜜臀| 97热在线精品视频在线观看| 性色av一区二区三区红粉影视| 97视频免费看| 亚洲一区美女视频在线观看免费| 成人性生交大片免费看视频直播| 欧美国产日本在线| xxxx欧美18另类的高清| 国产日韩换脸av一区在线观看| 亚洲视频在线观看视频| 国产精品久久久久久av| 国产成人精品在线视频| 亚洲欧美色图片| 一区二区成人精品| 亚洲国产小视频在线观看| 国产精品久久久久久久久久东京| 992tv成人免费影院| 欧美激情精品久久久久久黑人| 色综合男人天堂| 国产91精品不卡视频| 亚洲男人天堂古典| 日韩精品一区二区视频| 一区二区在线视频播放| 欧美男插女视频| 日韩精品视频在线免费观看| 亚洲日本成人网| 国产精品女人久久久久久| 亚洲综合在线中文字幕| 久久偷看各类女兵18女厕嘘嘘| 日本午夜人人精品| 久久久久国色av免费观看性色| 欧美视频在线免费| 国产精品国语对白| 欧美激情一区二区三区成人| 91精品久久久久久久久| 91久久精品视频| 午夜精品一区二区三区在线播放| 中文字幕亚洲综合久久筱田步美| 国产成人一区二区三区电影| 蜜臀久久99精品久久久久久宅男| 美女视频黄免费的亚洲男人天堂| 国产日本欧美一区二区三区| 国产精品久久久久aaaa九色| 一区二区欧美激情| 亚洲第一网站免费视频| 国产精品一区二区在线| 精品激情国产视频| 欧美另类极品videosbest最新版本| 亚洲一区制服诱惑| 亚洲女人天堂成人av在线| 亚洲精品成a人在线观看| 欧美成人免费一级人片100| 日韩不卡在线观看| 久久在线免费视频| 欧美成人小视频| 国产日本欧美一区二区三区| 91久久精品视频| 亚洲国产高清自拍| 97在线看免费观看视频在线观看| 国产丝袜一区视频在线观看| 精品国产依人香蕉在线精品| 亚洲第一国产精品| 亚洲欧美日本伦理| 日韩在线www| 国产亚洲精品久久久久久牛牛| 亚洲天堂色网站| 久久久精品2019中文字幕神马| 中文字幕国内精品| yellow中文字幕久久| 亚洲精品欧美日韩专区| 亚洲国产一区二区三区在线观看| 亚洲区中文字幕| 中文欧美日本在线资源| 日韩在线观看你懂的| 91久久久久久| 国产精品白嫩初高中害羞小美女| 欧美孕妇与黑人孕交| 2020国产精品视频| 91精品国产自产91精品| 欧美精品xxx| 欧美放荡办公室videos4k| 久久91精品国产91久久跳| 国产精品日韩在线播放| 日本亚洲欧洲色| 国产精品白嫩美女在线观看| 欧美激情a∨在线视频播放| 中文字幕日韩精品在线观看| 国产偷国产偷亚洲清高网站| 亚洲www视频| 日韩中文字幕在线视频| 亚洲成人av资源网| 欧美性xxxxxx| 欧美午夜精品久久久久久人妖| 亚洲一区中文字幕在线观看| 亚洲第五色综合网| 成人精品福利视频| 国内精品400部情侣激情| 精品福利在线视频| 亚洲精品自产拍| 欧美成人免费一级人片100| 91精品国产91久久久久久久久| 日本一区二区三区四区视频|