[原创]用C++(TC3.0)做的贪吃蛇游戏---(1)

类别:编程语言 点击:0 评论:0 推荐:

//游戏中使用链表的思路来自于金色甲虫站点,在此表示感谢。

/*贪吃蛇游戏引擎:MADE BY EMILMATTHEW 05/1/16
COMPILE ENVIROMENT TC3.0
注意事宜
1请设定好BGI文件路径
2上下左右键控制蛇移动,回车键暂停,ESC键退出.
*/
/*
难点及重点:
1) 采用链表的结构来表示蛇对象,要求我们学会用用一个链表类.
2) 画图时,使用一个抽象类AbstractDraw,它的派生类有三个:
 Drawhead,Drawbody,Drawtail,DrawBean;分别用以画头,身体,尾部及豆子.
 一开始都要画,游戏过程中,只要重画头及擦去尾巴即可。
3) 由于TC3不支持友元,所以对链表的插入工作需要放在Snake类本身中,稍显不适。
3) 碰撞检测:
 a)用一个数组加一个随机数过程生成不与蛇相交的一个位置,画出豆子.用以标识蛇头的坐标与豆子坐标重合时,蛇增长一节。
 b)与墙的碰撞检测,进行X,Y是否出界的CHECK 即可.

核心算法描述:

1声明游戏中相关的对象及标志变量:
ScreenLayOut Test; Drawhead sDh; Drawbody sDb ;Cleantail   sCt…
 2初始化图形库,绘制场景图形及一开始的完整的蛇。
  sDh.Draw(h.getx(),h.gety());sDb.Draw(b1.getx(),b1.gety());….
  同时用一个检测函数在不与蛇相交处随机生成一粒豆子.
  3利用一个while(Gamestatur!=Exit)来控制整个游戏的进程{
      4.1利用while(bioskey(1)==0)进入一个不按键时的循环{
                a)Render,首先进入的动态绘制区,通过每次传回的GotBean来确定以何种方式画新的一帧:是否要增长一节?
       if(GotBean)
        在头部与第二节处做链表插入动作,并改变相关的方向值及mx,my,mdir值。   
       蛇头变蛇身,在MDIR(方向标识变量)处画蛇头。并生成新的豆子.
       Else 
       遍历蛇的链表,把前一节的DIR(方向标识变量)传给一节(注意是从链表尾部往头部遍历),
       并相应的改变mx,my及dir的值.
       蛇头变蛇身,在MDIR(方向标识变量)处画蛇头,擦蛇尾.
       Delay2(0.1);//自编的DELAY函数,精度0.05秒,不随机器性能而有过大变动
        b)DataChecking{
        1碰边检测:是,则GameStatur=Failure;
        2是否咬到自己的检测.:是,则GameStatur=Failure
        3是否碰到障碍物:是,GameStatur=Failure
        4是否吃到豆子的检测:是,则GotBean=true;
        }
     4.2按下键后,用key=bioskey(0);得到键值,再用
         switch(key){
     case keyUp:…来做相应的数据处理。
       其中:上下左右键将改变头部的dir方向。
             ESC使GameStatur变成Exit;
             Enter使游戏处于暂停状态,用一个内嵌的键盘检测来做.     
         }//LOOPING BODY
这就是贪吃游戏的核心实现了,采用链表使得算法的设计上轻松的不少,当然,实现起来其中细节另有一番推敲及改进。
*/
#include <dos.h>
#include <bios.h>
#include <time.h>
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
char address[]="C:\\TC\\bgi";
int Score=0;
typedef int bool;
const int true=1;
const int false=0;

const int fudu=10;

int const KeyUp=0x4800;
int const KeyDown=0x5000;
int const KeyLeft=0x4b00;
int const KeyRight=0x4d00;
int const KeyEnter=0x1c0d;
int const KeyEsc=0x11b;

void Delay2(double Times,float SecPerFrame);
enum GameStaturs{Gaming,Win,Failure,Exit};
enum Direction{Up,Down,Left,Right};
GameStaturs GameStatur=Gaming;
float SecPerFrame=0.05;

struct Obstacle{
 public:
  int x;
  int y;
  bool flag;
  Obstacle(){x=0;y=0;flag=false;}
};
struct Bean{
  public:
  int x;
  int y;
  bool flag;
  Bean(){x=0;y=0;flag=false;}
};


//一个集成化的画图类
class SuperCol{
       public:
       void rect2(int tx,int ty,int bx,int by,int col=10);
       void printword(int x, int y, const char far *textstring,int font=1,
    int direction=0,int charsize=0,int col=12);
       void bar2(int tx,int ty,int bx,int by,int patternCol=BLUE,int patterns=SOLID_FILL);
       void shapefill(int x,int y,int BorderCol,int patternCol=BLUE,int patterns=SOLID_FILL);
       void circle2(int x,int y,int r,int col=RED);
       void circle3(int x,int y,int r,int scol=RED,int fcol=RED,int patterns=SOLID_FILL);
       void line2(int tx,int ty,int bx,int by,int col=10);
       void ellipse2(int x, int y,int xradius, int yradius, int col=GREEN,int stangle=0,
        int endangle=360);
       void backOutWord(int tx,int ty,int bx,int by,const char far *textstring,
        int colB=YELLOW,int colF=GREEN,int font=1,int charsize=0,int direction=0);
       };
void  SuperCol::rect2(int tx,int ty,int bx,int by,int col){
  setcolor(col);
  rectangle(tx,ty,bx,by);
  }
void SuperCol::printword(int x, int y, const char far *textstring,int font,int direction,int charsize,int col){
  setcolor(col);
  settextstyle(font, direction, charsize);
  outtextxy(x,y,textstring);
  }
void SuperCol::bar2(int tx,int ty,int bx,int by,int patternCol,int patterns){
  setfillstyle(patterns,patternCol);
  bar(tx, ty, bx,by);
}
void SuperCol::shapefill(int x,int y,int BorderCol,int patternCol,int patterns){
  setfillstyle(patterns,patternCol);
  floodfill(x,y,BorderCol);
 }
void SuperCol::circle2(int x,int y,int r,int col){
  setcolor(col);
  circle(x,y,r);
 }
void SuperCol::line2(int tx,int ty,int bx,int by,int col){
  setcolor(col);
  line(tx,ty,bx,by);
 }
void SuperCol::circle3(int x,int y,int r,int scol,int fcol,int patterns){
 circle2(x,y,r,scol);
 shapefill(x,y,scol,fcol,patterns);
 }
void SuperCol::ellipse2(int x, int y,int xradius, int yradius, int col,int stangle, int endangle){
  setcolor(col);
  ellipse(x,y,stangle,endangle,xradius,yradius);
}
void SuperCol::backOutWord(int tx,int ty,int bx,int by,const char far *textstring,int colB,
 int colf,int font,int charsize,int direction){
  bar2(tx,ty,bx,by,colB);
  printword(tx+3, ty+3, textstring,font,direction,charsize,colf);
 }

本文地址:http://com.8s8s.com/it/it23605.htm