分享
 
 
 

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

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

/*贪吃蛇游戏引擎: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);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有