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

首頁 > 學院 > 開發設計 > 正文

利用C++實現的貪吃蛇游戲

2019-11-17 05:00:55
字體:
來源:轉載
供稿:網友
  在tc 3.0下調試通過,因為tc 3.0不支持bool 類型,所以程序中自定義了個枚舉類型變量bool
  假如在vc或者bc中運行,可以把這個bool類型注釋掉.
  貪吃蛇的核心算法時如何實現移動和吃掉食物.
  沒有碰到食物的時候,把當前運動方向上的下個節點入隊,并以蛇節點的顏色重繪這個節點.
  然后把頭指針所指的節點出隊,并以游戲框架內部背景色重繪出隊的節點,這樣就可以達到移動的效果.
  而在吃到食物的時候,則只需把食物入隊即可.

  // greedsnake.cpp
  #include <bios.h>
  #include <conio.h>
  #include <dos.h>
  #include <graphics.h>
  #include <stdlib.h>
  #include <time.h>
  #include "conf.h"  typedef strUCt node
  {
  int x,y;
  struct node *next;
  }Node;  typedef struct
  {
  Node *head,*tail;
  int length;
  }Snake;
  typedef struct                   
  {
  int left,top,right,bottom;
  }Frame;  typedef enum                    //四個方向
  {
  up,down,left,right
  }Direction;
  typedef enum
  {
  false,true
  }bool;  void InitGraphMode();                     //初始化圖形驅動
  void CloseGraphMode();               
  void Foot(int,int);                           
  void Head(int,int);
  void CreateFrame();                    //完成整個游戲框架的繪制   
  void CreateSnake();                    //創建一條兩個節點的蛇,蛇的每一節是隊列中的一個節點
  bool PlayGame();                        //游戲的主體函數,
  int Hit(int,int);                               //判定是否越界,或者撞到自身,兩個參數分別是新的頭接點的x,y坐標
  bool GameOver();                        //繪制游戲結束時彈出的對話框                      
  void Enqueue(Node);                    //入隊函數

  Node Dequeue();                        //出隊函數
  void ClearKeyBuf();                       //清除鍵盤緩沖,此函數可以消除不停的按無效鍵的影響
  Snake snake;
  Frame frame;
  void main()
  {
  InitGraphMode();
  do
  {
  CreateFrame();
  }while(PlayGame());
  CloseGraphMode();
  }
  void InitGraphMode()
  {
  int gdriver=DETECT,gmode;
  initgraph(&gdriver,&gmode,"../bgi/");
  cleardevice();
  }
  void CloseGraphMode()
  {
  cleardevice();
  closegraph();
  }
  void CreateFrame()
  {
  setbkcolor(CYAN);                   
  //下面的四行代碼用于計算主框架的左上角和右下角的坐標
  frame.left=(getmaxx()+1-BlockWidth*RowOfFrame)/2;
  frame.top=(getmaxy()+1-BlockHeight*ColumnOfFrame)/2;
  frame.right=frame.left+BlockWidth*RowOfFrame;
  frame.bottom=frame.top+BlockHeight*ColumnOfFrame;
  Head(frame.left+100,frame.top-20);
  setfillstyle(SOLID_FILL,LIGHTGRAY);
  bar(frame.left,frame.top,frame.right,frame.bottom);
  setlinestyle(SOLID_LINE,1,1);
  setcolor(DARKGRAY);
  line(frame.left,frame.top,frame.right,frame.top);
  line(frame.left,frame.top,frame.left,frame.bottom);
  setlinestyle(SOLID_LINE,1,1);
  setcolor(WHITE);
  line(frame.left,frame.bottom,frame.right,frame.bottom);
  line(frame.right,frame.top,frame.right,frame.bottom);
  setlinestyle(DOTTED_LINE,1,1);
  setcolor(BLUE);
  for(int row=1;row<RowOfFrame;row++)
  line(frame.left+row*BlockWidth,frame.top,frame.left+row*BlockWidth,frame.bottom);
  for(int column=1;column<ColumnOfFrame;column++)
  line(frame.left,frame.top+column*BlockHeight,frame.right,frame.top+column*BlockHeight);
  Foot(frame.left,frame.bottom+20);
  }


  void CreateSnake()
  {
  Node *node1=new Node;
  Node *node2=new Node;
  node1->x=frame.left+BlockWidth;
  node1->y=frame.top;
  node1->next=NULL;
  snake.tail=node1;
  node2->x=frame.left;
  node2->y=frame.top;
  node2->next=snake.tail;
  snake.head=node2;
  snake.length=2;
  setfillstyle(SOLID_FILL,BLUE);
  bar(snake.head->x+1,snake.head->y+1,snake.head->x+BlockWidth-1,snake.head->y+BlockHeight-1);
  bar(snake.tail->x+1,snake.tail->y+1,snake.tail->x+BlockWidth-1,snake.tail->y+BlockHeight-1);
  }  bool PlayGame()
  {
  int speed=300,key;
  Direction CurrentDirection=right;
  Node randomNode;
  Node newNode,outNode;
  bool neednode=true;
  bool overlap=false;
  int randx,randy;
  CreateSnake();  while(true)
  {
  if(neednode==true)
  {
  randomize();

  do
  {
  randx=frame.left+rand()%RowOfFrame*BlockWidth;
  randy=frame.top+rand()%ColumnOfFrame*BlockHeight; 
  for(Node *p=snake.head;p!=NULL;p=p->next)//hit itself
  if(randx==p->x&&randy==p->y)
  {overlap=true;break;}
  }
  while(overlap==true);
  randomNode.x=randx;
  randomNode.y=randy;
  randomNode.next=NULL;
  setfillstyle(SOLID_FILL,RED);
  bar(randomNode.x+1,randomNode.y+1,randomNode.x+BlockWidth-1,randomNode.y+BlockHeight-1);
  neednode=false;
  }
  if((key=bioskey(1))!=0)
  {
  switch(key)
  {
  case ESC:  return false;
  case UP:
  if(CurrentDirection!=down)
  CurrentDirection=up;
  ClearKeyBuf();
  break;
  case DOWN:
  if(CurrentDirection!=up)
  CurrentDirection=down;
  ClearKeyBuf();
  break;
  case LEFT:
  if(CurrentDirection!=right)
  CurrentDirection=left;
  ClearKeyBuf();
  break;
  case RIGHT:
  if(CurrentDirection!=left)
  CurrentDirection=right;
  ClearKeyBuf();
  break;
  case PAGEUP:speed=speed-100;
  if(speed<100)
  speed=100;
  ClearKeyBuf();
  break;
  case PAGEDOWN:speed=speed+100;
  if(speed>500)
  speed=500;
  ClearKeyBuf();
  break;
  default :break;
  }
  }
  int headx=snake.tail->x;
  int heady=snake.tail->y;
  switch(CurrentDirection)
  {
  case up: heady-=BlockHeight;break;
  case down: heady+=BlockHeight;break;
  case left: headx-=BlockWidth;break;
  case right: headx+=BlockWidth;break;
  }
  if(Hit(headx,heady))    //whether the snake hit the wall or itself
  return GameOver();
更多文章 更多內容請看C/C++技術專題  網絡游戲攻略  游戲開發專題,或


  else
  {       //eat
  if(headx==randomNode.x&&heady==randomNode.y)
  {
  Enqueue(randomNode);
  setfillstyle(SOLID_FILL,BLUE);
  bar(randomNode.x+1,randomNode.y+1,randomNode.x-1+BlockWidth,randomNode.y-1+BlockHeight);
  neednode=true;
  }
  else     //no eat
  {
  newNode.x=headx;
  newNode.y=heady;
  newNode.next=NULL;
  Enqueue(newNode);
  outNode=Dequeue();
  setfillstyle(SOLID_FILL,LIGHTGRAY);
  bar(outNode.x+1,outNode.y+1,outNode.x+BlockWidth-1,outNode.y+BlockHeight-1);
  setfillstyle(SOLID_FILL,BLUE);
  bar(newNode.x+1,newNode.y+1,newNode.x-1+BlockWidth,newNode.y-1+BlockHeight);
  }
  }
  delay(speed);
  }
  }
  void ClearKeyBuf()
  {
  do
  bioskey(0);
  while(bioskey(1));
  }  void Foot(int x,int y)
  {
  setcolor(BLUE);
  outtextxy(x,y,"writer:[T]RealXL E-MAIL:realgeneral@hotmail.com");
  }
  void Head(int x,int y)
  {
  setcolor(RED);

  outtextxy(x,y,"GREEDY SNAKE");
  }
  void Enqueue(Node inNode)
  {
  Node *p=new Node;
  p->x=inNode.x;
  p->y=inNode.y;
  p->next=inNode.next;
  snake.tail->next=p;
  snake.tail=p;
  snake.length++;
  }

更多文章 更多內容請看C/C++技術專題  網絡游戲攻略  游戲開發專題,或


  Node Dequeue()
  {
  Node *p=snake.head;
  Node outNode=*p;
  snake.head=p->next;
  snake.length--;
  delete p;
  return outNode;
  }  int Hit(int x,int y)
  {
  if(x<frame.leftx>=frame.righty<frame.topy>=frame.bottom)//hit the wall
  return 1;
  Node *p=snake.head->next;
  for(int i=snake.length-1;i>3;i--,p=p->next)//hit itself
  if(x==p->x&&y==p->y)
  return 1;
  return 0;
  }  bool GameOver()
  {
  int x=getmaxx()/2-50;
  int y=getmaxy()/2-20;
  setfillstyle(SOLID_FILL,DARKGRAY);
  bar(x+3,y+3,x+103,y+43);
  setfillstyle(SOLID_FILL,MAGENTA);
  bar(x,y,x+100,y+40);
  setlinestyle(0,3,1);
  setcolor(RED);
  rectangle(x,y,x+100,y+40);
  outtextxy(x+20,y+10,"GAGE OVER!");
  char c;
  while(true)                                        //按q或Q表示退出程序,按r或R表示重新開始游戲
  {
  c=getch();
  if(c=='q'c=='Q')
  return false;
  else if(c=='r'c=='R')
  return true;
  }
  }
  //conf.h                                                          
  #ifndef _conf_h
  #define _conf_h
  #define RowOfFrame    20         //主框架的行數
  #define ColumnOfFrame 20         //主框架的列數
  #define BlockWidth    15        //每個蛇節點的寬度
  #define BlockHeight   15        //每個蛇節點的高度
  #define UP   18432
  #define DOWN  20480
  #define LEFT  19200
  #define RIGHT  19712
  #define ESC   283
  #define ENTER  7181
  #define PAGEUP  18688
  #define PAGEDOWN 20736
  #endif

上一篇:socket編程原理

下一篇:makefile規則

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产高清va在线播| 国产精品白嫩美女在线观看| 国产视频精品一区二区三区| 免费不卡在线观看av| 国产精品久久久久久久久久三级| 日韩久久午夜影院| 国产69久久精品成人看| 精品女厕一区二区三区| 欧美午夜精品久久久久久人妖| 亚洲天堂网站在线观看视频| 国产日韩在线播放| 日韩在线观看免费全集电视剧网站| 亚洲午夜精品久久久久久性色| 欧美激情一级欧美精品| 国产成人中文字幕| 国产精品亚发布| 精品网站999www| 国产福利成人在线| 日韩一二三在线视频播| 亚洲精品视频免费在线观看| 日韩精品在线免费| 一区二区三区国产在线观看| 欧亚精品在线观看| 亚洲欧美一区二区三区久久| 国产成人精品最新| 自拍视频国产精品| 国产精品久久久久久久久久久新郎| 成人福利视频在线观看| 一区二区亚洲精品国产| 久久最新资源网| 国产99久久精品一区二区 夜夜躁日日躁| 国产精品亚洲激情| 欧美成人午夜激情视频| 欧美日韩在线观看视频小说| 国产在线精品播放| 久久这里只有精品99| 97视频免费在线看| 久久精品99久久久久久久久| 国产区精品视频| 日韩av在线免播放器| 国产午夜精品美女视频明星a级| 亚洲美女www午夜| 欧美精品第一页在线播放| 97精品国产97久久久久久| 成人一区二区电影| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧美日本另类| 久久精品中文字幕| 亚洲黄色成人网| 日韩av在线一区二区| 91色在线观看| 久久视频国产精品免费视频在线| 91热福利电影| 亚洲第一视频网站| 欧美中文字幕精品| 91久久久久久久久| 欧美日韩性生活视频| 欧美福利视频网站| 亚洲国产精品久久精品怡红院| 国产成人综合精品| 亚洲国产精彩中文乱码av在线播放| 国产精品久久久av久久久| 国产成人在线一区二区| 国产精品网红福利| 日韩国产高清视频在线| 久久久久国产精品一区| 性欧美在线看片a免费观看| 国产精品aaa| 视频在线观看一区二区| 18性欧美xxxⅹ性满足| 国产精品国产三级国产专播精品人| 91久久精品久久国产性色也91| 国产一区二区三区直播精品电影| 国产日韩亚洲欧美| 亚洲美女动态图120秒| 高清视频欧美一级| 国产日韩欧美黄色| 免费97视频在线精品国自产拍| 97香蕉久久超级碰碰高清版| 欧美性生活大片免费观看网址| 最近2019中文免费高清视频观看www99| 国产欧美亚洲精品| 欧美精品少妇videofree| 亚洲午夜未满十八勿入免费观看全集| 亚洲а∨天堂久久精品喷水| 欧美xxxx做受欧美| 久久中文字幕在线视频| 日韩电影中文字幕在线| 国产精品99一区| 欧美日韩在线视频首页| 日韩美女av在线| xvideos亚洲| 在线精品91av| 亚洲一区二区日本| 久久色精品视频| 国产精品99久久久久久久久| 日本精品久久电影| 久久69精品久久久久久国产越南| 亚洲福利视频在线| 国产剧情久久久久久| 国产精品老牛影院在线观看| 日韩欧美在线观看视频| 日韩欧美国产一区二区| 成人写真视频福利网| 日韩欧美在线观看视频| 国产精品成人v| 大荫蒂欧美视频另类xxxx| 国产91精品最新在线播放| 久久成人精品一区二区三区| 亚洲精品91美女久久久久久久| 国产精品嫩草影院久久久| 欧美肥老太性生活视频| 日韩天堂在线视频| 岛国av一区二区在线在线观看| 青草成人免费视频| 国产精品成人va在线观看| 国产精品影院在线观看| 久久久久这里只有精品| 在线丨暗呦小u女国产精品| 正在播放亚洲1区| 一区二区三区无码高清视频| 成人深夜直播免费观看| www.日韩av.com| 欧美成人小视频| 欧美最猛性xxxxx(亚洲精品)| 国产欧美日韩免费看aⅴ视频| 欧美自拍视频在线| 亚洲美女性视频| 日韩中文字幕在线免费观看| 日韩欧美aⅴ综合网站发布| 538国产精品一区二区在线| 国产精品黄色影片导航在线观看| 成人免费网站在线| 国产精品久久久久久久久久三级| 欧美最近摘花xxxx摘花| 欧美最猛性xxxxx亚洲精品| 在线a欧美视频| 欧美高清在线视频观看不卡| 久久99热这里只有精品国产| 亚洲伊人久久大香线蕉av| 精品视频偷偷看在线观看| 日韩精品久久久久久福利| 午夜精品www| 日韩欧美亚洲国产一区| 久久频这里精品99香蕉| 亚洲性夜色噜噜噜7777| 狠狠躁夜夜躁人人爽天天天天97| 亚洲mm色国产网站| 欧美性xxxx在线播放| 亚洲缚视频在线观看| 亚洲激情中文字幕| 一区二区成人精品| 精品视频久久久久久久| 欧美日韩中文字幕日韩欧美| 亚洲国产精品va在看黑人| 91a在线视频| 亚洲人成电影网站色xx| 欧美一级电影久久| 91亚洲精品在线观看| 理论片在线不卡免费观看| 日韩国产在线看| 久久精品色欧美aⅴ一区二区| 日韩亚洲一区二区| 亚洲精品aⅴ中文字幕乱码|