坦克大战,及源代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
采用双向循环链表作太极形式旋转的图案,图案的变化采用刷新屏幕的方法做到。首先,建立一个二维字符数组,保存图形数据,然后通过更改该二维字符数组和清屏,再显示,做到图像的变化。用它提示坦克大战游戏的操作方法。
再显示问题解决后,通过无回显读取函数getch();和输入流检查函数kbhit();读取输入的方向键或回车键进入下一页面。
用同样的方法,读取方向键和回车键,更改内部图案方法,使用户选择关:
第一关:仅有4个坦克同时作战,总数为30个!
第二关:仅有5个坦克同时作战,总数为40个!
第三关:有6个坦克同时作战,总数为50个!
第四关:有7个坦克同时作战,总数为60个!
第五关:有8个坦克同时作战,总数为70个!
选择关卡后,进入下一页面:
进行相关提示。最后进入游戏界面。
也可以通过按左方向键返回上一级重新选择!!!
第一关到第三关:都是宽80,高42的。
最后两关:都是宽160,高42的。
右击标题栏选择属性,进入设置。
接着就是进入最重要的坦克大战游戏了:这时采用的就不是刷新屏幕能解决的问题了。
由于界面太大,不能刷新屏幕,仅能用光标移动函数来更改图像。光标移动函数为gotoxy(int ,int );读者自己查看定义。采用同样输入流读取方法。
接着是游戏规则,操作者用W.w.A.a.S.s.D.d移动坦克,空格是停下。用方向键改变炮筒的方向,回车键是开火。但当自己的炮弹还在运行时,不得开火!!!
用链表保存每一辆坦克(包括主坦克)的数据。电脑控制的坦克,被控制者的坦克炮弹击中,就会发生爆炸,并死亡。当界面上的所有坦克小于特定值时,如果内部还有未出现的坦克,就会在上方的随机位置,产生新坦克。如果操作者的坦克被击中,它的HP(我称为生命值)就会减一点。刚开始游戏时的HP=5;
但升级进入下一关时保留上一局的最后分数和HP。不会重置。
但游戏中有补血包,可以补充生命值(HP)补血包每90秒出现一次,出现的时间长为60秒。如果在这期间操作者的坦克运动到它的位置,补血包将给操作者的坦克补血。补血包不会给其它坦克补血,仅会给操作者的坦克补血。补血包会闪烁,提示它的出现。
界面还提供了每局的游戏时间。和剩敌数,及一些操作命令。当游戏结束或胜利要进入下一关时,界面还会运行5秒钟。
B.b.的暂停是用getch();读取做到的。
退出是直接将循环条件重置为0;
重载视图会在视图为80×42的视图中显示边界,或消失边界。操作者可以自己调整。
为了更好的游戏,让操作者的坦克跑得比其它坦克块。
当电脑控制的坦克在正前方发现操作者的坦克就准备并等待着开火。开火完就跑。
游戏的目的是反映的挑战。
当游戏结束或退出时会回到关卡的选择界面,在那里选择退出,就会有留恋的告别对话,此时仍然可以返回上一级,继续游戏。
通过设置颜色改变字体和背景颜色,使界面更好看:
以下是总结:
在这个有点大的游戏中最大的难题,不是显示问题,也不是同时控制多个对象的问题。
最难的有两个:一、坦克的智能化处理。二、修复同
时控制最多有23个对象时共用数据时产生的bug。
如,当坦克被击中,就应该扫描是谁被击中,否则不
可能知道是谁。可是扫描到链表的最后一个节点时,
直接往下就将指针重置为NULL了,可是返回主函数
我还在求那个指针所指向的链表节点的数据。直接接
bug,并且把所有的函数分开测或,重新检查,再100
年也检查不出问题的所在。这就是最大的痛苦,前一
次尝试,就是吃了这个苦头,前一天晚上检差到第二
天的晚上都检查不出来。心理陷入极度的痛苦,最终
放弃。这就是最大的教训之一!!!
又比如:前一次尝试中,采用同一种方法控制所有内
部的坦克,结果所有的坦克,聚成一团,怎么也拆不
开。用统一的“引力”和“排斥力”都不管用。写了
一个又一个方案都只能宣告失败。自信受到了极大的
打击,十分痛苦。
经过演示版本(操作者的坦克阵亡后,不自动退出)
的测试:
在长达13小时多的运行中没有任何bug的出现。
这是一张代表图:
图案不同于其它的是
操作者控制的坦克。
有一辆坦克将炮筒指
向了它。它却先跑了
一段。圆球都是敌方
坦克的炮弹。它身陷
危险之中。因为这些
坦克是猛兽而并不像
表面那么温和。
它的右上方有一个补
血包正在闪烁。下方
有很多重要的提示信
息。
#include
#include
#include
#include
#include
using std::cin;using std::cout;
const int S_X=80;
const int S_Y=40;
int welcome(void);
void start_restart_end(int cammand);
void message(int cammand);
void new_tank(void);
void auto_aim(void);
void find_control_tank(void);
void through_all_aim(void);
int tank_move(void);
void fire(void);
void shell_move(void);
void shell_explode(void);
void delete_tank(void);
void tank_die(void);
void renew_tank(void);
int HP_plus(int cammand);
void gotoxy(int x, int y);
void write_1(int x,int y,char type);
void write_3(int x,int y,char type);
void write_3_no(int x,int y,char type);
char S_S[S_Y][S_X];
int the_right;
char tank_xx[3][7]= {"■■■"," █","■■■"},tank_yy[3][7]= {"■■","■█■","■■"};
char tank_0_xx[3][7]={"███"," █","███"},tank_0_yy[3][7]={"██","███","██"};
char clear_3[3][7]={" "," "," "};
char HP_showing[3][7]={"┏┓"," ╋","┗┛"};
char explode_showing_0[3][7]={"╳╋╳","╋╳╋","╳╋╳"},explode_showing_1[3][7]={"╋╳╋","╳╋╳","╋╳╋"};
char fire_xx[3]="━",fire_yy[3]="┃";
char shell[3]="●";
char clear_1[3]=" ";
char well[3]="▓";
int control_tank_HP;
int auto_tank_sum,auto_tank_now;
int grade=0,score;
struct tank{int tank_direction_and_life;int change_direction_temporary;int tank_x;int tank_y;int shell_direction;int shell_explode;int shell_x;int shell_y;int aim_x;int aim_y;int fire_direction;
int found_enemy_and_wasting_fire;tank *next;}*head=NULL,*here;
void main(){while(welcome()){int control_upgrade=1;score=0;control_tank_HP=5;
do{int control_gaming=1,control_out=200;
start_restart_end(1);
message(1);int time_to_message=(int)time(0);
int time_to_plus_HP=(int)time(0),have_HP_plus=0,time_pause_save;
int control_tank_wasting_go=0,control_tank_going=0;
int auto_tank_wasting_go=0,auto_tank_going=1;
here=head->next;do{Sleep(25);
int direction_key=0,cammand_to_control_tank=0;
while(kbhit()){switch(getch()){case(224):direction_key=1;break;
case(72):if(direction_key)cammand_to_control_tank=11;break;case(77):if(direction_key)cammand_to_control_tank=12;break;
case(75):if(direction_key)cammand_to_control_tank=14;break;case(80):if(direction_key)cammand_to_control_tank=13;break;
case(13):cammand_to_control_tank=5;break;