用c做的简单的坦克大战小游戏
- 格式:doc
- 大小:85.50 KB
- 文档页数:14
C++实现坦克⼤战⼩游戏EGE图形界⾯C++ EGE 实现坦克⼤战⼩游戏,供⼤家参考,具体内容如下因为有过⼀次⽤EGE写⼩游戏的经验,所以这⼀次写坦克⼤战快了很多。
并且使⽤对象编程也简化了很多编程时繁琐的步骤。
写出坦克⼤战使我在学习编程的道路上⼜迈出了⼀⼤步。
如果您需要图⽚素材的,我可以单独发给您。
技术环节:编译环境:Windows VS2019需求:控制坦克移动发射炮弹,炮弹可以消灭敌军坦克,且可以消灭砖块。
坦克遇到⽅块会被挡住。
敌军消灭我军三次或基地被毁则游戏失败,共摧毁⼗次敌⽅坦克游戏胜利。
思路:先写出坦克的⽗类,我⽅坦克类和敌⽅坦克类继承坦克⽗类,实例化我⽅坦克和敌⽅坦克。
地图使⽤list容器存储。
在代码注释中标注了每⼀步是怎么实现的。
注意:因为我在程序中⽤了⼀些不规范的写法,所以要在VS中正常编译运⾏,需要右键源⽂件->属性->C/C+±>符合模式,改为否。
包含<graphics.h>图形库需要提前配置EGE图形库。
如要在其他graphics图形库下编译,可能需要修改某些地⽅。
运⾏效果:代码:#include <graphics.h> //图形库#include <ctime> //time();#include <list> //list容器using namespace std; //标准命名空间 list等//设置图⽚对象中图⽚的宽⾼全局函数//参数:宽、⾼、对象名void setimage(int pwidth, int pheight, PIMAGE img_1);//地图全局结构struct mapstr{int m_x; //xy坐标int m_y;int prop; //属性};//地图类class Mymap{private:list<mapstr> listmap; //地图容器,存储全地图信息,全地图1350个20*20的格⼦public://设置地图Mymap(){mapstr temp;//构造函数为链表容器中的地图赋值//全地图横向45个格⼦竖向30个格⼦//基地部分{temp.prop = 0;for (int i = 0; i < 4; i++) { temp.m_x = 380 + i * 20; temp.m_y = 540; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 380 + i * 20; temp.m_y = 520; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 380; temp.m_y = 560 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 360; temp.m_y = 520 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 440; temp.m_y = 560 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 460; temp.m_y = 520 + i * 20; listmap.push_back(temp); }temp.prop = 4, temp.m_x = 400, temp.m_y = 560; listmap.push_back(temp);}//左上⾓部分{temp.prop = 0;//左上⾓单独砖块for (int i = 0; i < 2; i++) { temp.m_x = 40 + i * 20; temp.m_y = 80; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 40 + i * 20; temp.m_y = 100; listmap.push_back(temp); }//竖铁块for (int i = 0; i < 4; i++) { temp.m_x = 160; temp.m_y = i * 20; temp.prop = 1; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 180; temp.m_y = i * 20; listmap.push_back(temp); }//砖块for (int i = 0; i < 4; i++) { temp.m_x = 160; temp.m_y = 160 + i * 20; temp.prop = 0; listmap.push_back(temp); } for (int i = 0; i < 4; i++) { temp.m_x = 180; temp.m_y = 160 + i * 20; listmap.push_back(temp); }//草块for (int i = 0; i < 4; i++) { temp.m_x = 0; temp.m_y = 200 + i * 20; temp.prop = 2; listmap.push_back(temp); } for (int i = 0; i < 4; i++) { temp.m_x = 20; temp.m_y = 200 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 40 + i * 20; temp.m_y = 240; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 40 + i * 20; temp.m_y = 260; listmap.push_back(temp); }}//中上部分{//铁块for (int i = 0; i < 2; i++) { temp.m_x = 320; temp.m_y = i * 20; temp.prop = 1; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 340; temp.m_y = i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 280 + i * 20; temp.m_y = 160; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 280 + i * 20; temp.m_y = 180; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 400 + i * 20; temp.m_y = 200; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 400 + i * 20; temp.m_y = 220; listmap.push_back(temp); }//砖块for (int i = 0; i < 4; i++) { temp.m_x = 320; temp.m_y = 40 + i * 20; temp.prop = 0; listmap.push_back(temp); } for (int i = 0; i < 4; i++) { temp.m_x = 340; temp.m_y = 40 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 240; temp.m_y = 200 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 260; temp.m_y = 200 + i * 20; listmap.push_back(temp); }}//右上部分for (int i = 0; i < 4; i++) { temp.m_x = 480; temp.m_y = 40 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 500; temp.m_y = 40 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 480; temp.m_y = 160 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 500; temp.m_y = 160 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 600; temp.m_y = 40 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 620; temp.m_y = 40 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 600; temp.m_y = 160 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 620; temp.m_y = 160 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 6; i++) { temp.m_x = 680 + i * 20; temp.m_y = 200; listmap.push_back(temp); }for (int i = 0; i < 6; i++) { temp.m_x = 680 + i * 20; temp.m_y = 220; listmap.push_back(temp); }for (int i = 0; i < 6; i++) { temp.m_x = 760; temp.m_y = 0 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 6; i++) { temp.m_x = 780; temp.m_y = 0 + i * 20; listmap.push_back(temp); }//草块for (int i = 0; i < 6; i++) { temp.m_x = 560; temp.m_y = 160 + i * 20; temp.prop = 2; listmap.push_back(temp); } for (int i = 0; i < 6; i++) { temp.m_x = 580; temp.m_y = 160 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 520; temp.m_y = 160 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 540; temp.m_y = 160 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 860; temp.m_y = 80 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 880; temp.m_y = 80 + i * 20; listmap.push_back(temp); }//铁块for (int i = 0; i < 4; i++) { temp.m_x = 520 + i * 20; temp.m_y = 80; temp.prop = 1; listmap.push_back(temp); } for (int i = 0; i < 4; i++) { temp.m_x = 520 + i * 20; temp.m_y = 100; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 640 + i * 20; temp.m_y = 160; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 640 + i * 20; temp.m_y = 180; listmap.push_back(temp); }for (int i = 0; i < 6; i++) { temp.m_x = 800 + i * 20; temp.m_y = 200; listmap.push_back(temp); }for (int i = 0; i < 6; i++) { temp.m_x = 800 + i * 20; temp.m_y = 220; listmap.push_back(temp); }}//左下部分{//铁块for (int i = 0; i < 2; i++) { temp.m_x = i * 20; temp.m_y = 360; temp.prop = 1; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = i * 20; temp.m_y = 380; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 160; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 180; temp.m_y = 320 + i * 20; listmap.push_back(temp); }//砖块for (int i = 0; i < 12; i++) { temp.m_x = 40; temp.m_y = 360 + i * 20; temp.prop = 0; listmap.push_back(temp); } for (int i = 0; i < 12; i++) { temp.m_x = 60; temp.m_y = 360 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 40 + i * 20; temp.m_y = 280; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 40 + i * 20; temp.m_y = 300; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 160; temp.m_y = 400 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 180; temp.m_y = 400 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 160; temp.m_y = 560 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 180; temp.m_y = 560 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 240 + i * 20; temp.m_y = 240; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 240 + i * 20; temp.m_y = 260; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 280; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 300; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 320; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 340; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 360; temp.m_y = 400 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 380; temp.m_y = 400 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 400; temp.m_y = 400 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 420; temp.m_y = 400 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 440; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 460; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 480; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 500; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 520; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 540; temp.m_y = 320 + i * 20; listmap.push_back(temp); }//草块for (int i = 0; i < 10; i++) { temp.m_x = 200 + i * 20; temp.m_y = 280; temp.prop = 2; listmap.push_back(temp); } for (int i = 0; i < 10; i++) { temp.m_x = 200 + i * 20; temp.m_y = 300; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 200 + i * 20; temp.m_y = 320; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 200 + i * 20; temp.m_y = 340; listmap.push_back(temp); }}//右下部分{//砖块for (int i = 0; i < 8; i++) { temp.m_x = 600; temp.m_y = 320 + i * 20; temp.prop = 0; listmap.push_back(temp); } for (int i = 0; i < 8; i++) { temp.m_x = 620; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 560; temp.m_y = 520 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 580; temp.m_y = 520 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 600 + i * 20; temp.m_y = 560; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 600 + i * 20; temp.m_y = 580; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 680 + i * 20; temp.m_y = 520; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 680 + i * 20; temp.m_y = 540; listmap.push_back(temp); }for (int i = 0; i < 7; i++) { temp.m_x = 760 + i * 20; temp.m_y = 320; listmap.push_back(temp); }for (int i = 0; i < 7; i++) { temp.m_x = 760 + i * 20; temp.m_y = 340; listmap.push_back(temp); }for (int i = 0; i < 8; i++) { temp.m_x = 800; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 640; temp.m_y = 320 + i * 20; temp.prop = 1; listmap.push_back(temp); } for (int i = 0; i < 4; i++) { temp.m_x = 660; temp.m_y = 320 + i * 20; listmap.push_back(temp); }for (int i = 0; i < 2; i++) { temp.m_x = 680; temp.m_y = 320 + i * 20; temp.prop = 1; listmap.push_back(temp); } for (int i = 0; i < 2; i++) { temp.m_x = 700; temp.m_y = 320 + i * 20; temp.prop = 1; listmap.push_back(temp); } for (int i = 0; i < 4; i++) { temp.m_x = 820 + i * 20; temp.m_y = 480; listmap.push_back(temp); }for (int i = 0; i < 4; i++) { temp.m_x = 820 + i * 20; temp.m_y = 500; listmap.push_back(temp); }//草块for (int i = 0; i < 4; i++) { temp.m_x = 560; temp.m_y = 360 + i * 20; temp.prop = 2; listmap.push_back(temp); } for (int i = 0; i < 4; i++) { temp.m_x = 580; temp.m_y = 360 + i * 20; listmap.push_back(temp); }}}//显⽰地图void printmap(list<mapstr>& listmap){PIMAGE mapprop_0 = newimage();getimage(mapprop_0, "坦克⼤战完整素材\\砖块.png");setimage(20, 20, mapprop_0);PIMAGE mapprop_1 = newimage();getimage(mapprop_1, "坦克⼤战完整素材\\铁块.png");setimage(20, 20, mapprop_1);PIMAGE mapprop_2 = newimage();getimage(mapprop_2, "坦克⼤战完整素材\\草块.png");setimage(20, 20, mapprop_2);PIMAGE mapprop_4 = newimage();getimage(mapprop_4, "坦克⼤战完整素材\\⽼鹰_1.png");setimage(40, 40, mapprop_4);PIMAGE mapprop_5 = newimage();getimage(mapprop_5, "坦克⼤战完整素材\\⽼鹰_2.png");setimage(40, 40, mapprop_5);for (list<mapstr>::iterator it = listmap.begin(); it != listmap.end(); it++){switch (it->prop){case 0:putimage(it->m_x, it->m_y, mapprop_0);break;case 1:putimage(it->m_x, it->m_y, mapprop_1);break;case 2:putimage(it->m_x, it->m_y, mapprop_2);break;case 4:putimage(it->m_x, it->m_y, mapprop_4);break;case 5:putimage(it->m_x, it->m_y, mapprop_5);break;}}delimage(mapprop_0);delimage(mapprop_1);delimage(mapprop_2);delimage(mapprop_4);delimage(mapprop_5);}//获取地图容器list<mapstr> getmapves(){return listmap;}};//坦克⽗类class Tank{public:virtual void move(const list<mapstr>& tempves) = 0; //坦克移动函数int getlauch_x() //获取⼦弹x坐标{return b_m_x;}int getlauch_y() //获取⼦弹y坐标{}void setlauch_xy() //设置⼦弹坐标{b_m_x = m_x + 18; //重置位置为坦克中间b_m_y = m_y + 18;key1 = key2; //key1 = key2避免炮弹⼀直发射}int getTank_x() //获取坦克x坐标{return m_x;}int getTank_y() //获取坦克y坐标{return m_y;}char getkey2() //返回发射时的坦克⽅向信息{return key2;}//坦克攻击⼦弹位置爆炸void exploed(){PIMAGE explimg_1 = newimage();getimage(explimg_1, "坦克⼤战完整素材\\爆炸效果1.png");setimage(10, 10, explimg_1);PIMAGE explimg_2 = newimage();getimage(explimg_2, "坦克⼤战完整素材\\爆炸效果2.png");setimage(20, 20, explimg_2);PIMAGE explimg_3 = newimage();getimage(explimg_3, "坦克⼤战完整素材\\爆炸效果3.png");setimage(40, 40, explimg_3);PIMAGE explimgarr[3] = { explimg_1, explimg_2, explimg_3 }; for (int i = 0; i < 3; i++){if (key2 == 'd' || key2 == 'a')//根据坦克的攻击朝向确定爆炸的位置 putimage(b_m_x, b_m_y - 6 * i, explimgarr[i]);elseputimage(b_m_x - 6 * i, b_m_y, explimgarr[i]);delay_fps(42);}delimage(explimg_1);delimage(explimg_2);delimage(explimg_3);}//构造函数Tank(){m_x = 0; m_y = 0;m_health = 0; m_damage = 0;path_1 = NULL; path_2 = NULL;path_3 = NULL; path_4 = NULL;b_m_x = 0; b_m_y = 0;key1 = '0'; key2 = '0';}protected://从⽂件中获取坦克图⽚void gettank(const char *path){PIMAGE tankimg = newimage(); //创建图⽚对象getimage(tankimg, path); //在⽂件中获取图⽚到图⽚对象setimage(40, 40, tankimg); //设置图⽚对象⼤⼩putimage(this->m_x, this->m_y, tankimg);//在坐标处输出图⽚delimage(tankimg); //释放图⽚对象}//输出显⽰坦克void printtank(const char key2){//根据当前的键值,输出坦克switch (key2){case 'w':gettank(path_1); break; //输出坦克case 's':gettank(path_2); break;case 'a':gettank(path_4); break;}}//发射⼦弹void launch(){printtank(key2);setfillcolor(WHITE);switch (key2){case 'w':b_m_y -= 10;bar(b_m_x, b_m_y, b_m_x + 4, b_m_y + 8);break;case 'a':b_m_x -= 10;bar(b_m_x, b_m_y, b_m_x + 8, b_m_y + 4);break;case 's':b_m_y += 10;bar(b_m_x, b_m_y, b_m_x + 4, b_m_y + 8);break;case 'd':b_m_x += 10;bar(b_m_x, b_m_y, b_m_x + 8, b_m_y + 4);break;}//⼦弹越界⽬标则⼦弹坐标刷新if (b_m_x >= 900 || b_m_x <= 0 || b_m_y >= 600 || b_m_y <= 0)setlauch_xy(); //重置⼦弹位置}int m_x; //坦克xy坐标int m_y;int m_health; //坦克⾎量int m_damage; //⼦弹伤害量char* path_1; //四张不同⽅向的坦克图⽚,由派⽣类决定图⽚路径char* path_2;char* path_3;char* path_4;int b_m_x; //⼦弹坐标xyint b_m_y;char key1; //⽤于接收键盘信息char key2; //⽤于存储上⼀条键值,也是发射时的坦克的朝向};//游戏失败结束全局函数在⽣命为0 和基地被攻击时调⽤void gameoverfalse(){cleardevice();PIMAGE gameoverbackimg = newimage();getimage(gameoverbackimg, "坦克⼤战完整素材\\游戏结束背景.jpg");setimage(900,600,gameoverbackimg);putimage(0, 0, gameoverbackimg); //输出背景图⽚PIMAGE gameoverimg = newimage();getimage(gameoverimg, "坦克⼤战完整素材\\游戏结束.png");setimage(200, 200, gameoverimg);putimage_withalpha(NULL, gameoverimg, 350, 200); //透明格式输出游戏结束图⽚ delimage(gameoverbackimg);delimage(gameoverimg); //释放内存getch();getch();}//我⽅坦克,可被操控移动class TankFriend :public Tank{private:int Fridienum = 0;public://构造函数初始化坦克坐标TankFriend(){m_health = 100; //坦克⾎量m_damage = 90; //坦克伤害b_m_x = m_x + 18;b_m_x = m_x + 18;path_1 = "坦克⼤战完整素材\\⼰⽅坦克上.png"; //赋值需要将源⽂件属性语⾔中符合模式改为否 path_2 = "坦克⼤战完整素材\\⼰⽅坦克下.png";path_3 = "坦克⼤战完整素材\\⼰⽅坦克左.png";path_4 = "坦克⼤战完整素材\\⼰⽅坦克右.png";key1 = 'w'; //初始化key1⽤于输出初始的坦克}int getTankdamage() //获取坦克伤害{return m_damage;}int getTankhealth() //获取坦克⾎量{return m_health;}void setTankhealth(const int health) //设置坦克⾎量{m_health = health;}int getFridienumfun() //获取我⽅坦克被消灭次数{return Fridienum;}//坦克被操控移动virtual void move(const list<mapstr>& tempves){if (key1 != 'j')key2 = key1; //key2记录上⼀个key1的值if (kbhit()){//⽤临时变量接收键值,如果键值为wasdj中的⼀个则赋给使⽤的变量char tempkey = getch();switch (tempkey){case 'w': case 'a':case 's': case 'd':case 'j':key1 = tempkey;break;//接收的键盘值不是wasdj直接returndefault:return;}//判断坦克撞墙情况,坦克撞墙可以改变⽅向,但不会移动坐标for (list<mapstr>::const_iterator it = tempves.begin(); it != tempves.end(); it++){switch (tempkey){//这⾥的⼤于⼩于号⼀个都不能错case 'w':if ((//判断坦克原xy点(m_x >= it->m_x && m_x < it->m_x + 20) && (m_y - 20 == it->m_y) ||//判断坦克右xy点(m_x + 40 > it->m_x&& m_x + 40 <= it->m_x + 20) && (m_y - 20 == it->m_y))//判断⽅块属性&& (it->prop == 0 || it->prop == 1)//判断地图边界范围|| (m_y - 20 < 0))return;break;case 'a':if ((//判断坦克原xy点(m_y >= it->m_y && m_y < it->m_y + 20) && (m_x - 20 == it->m_x) ||//判断坦克右xy点)//⽅块属性&& (it->prop == 0 || it->prop == 1)//判断地图边界范围|| (m_x - 20 < 0))return;break;case 's':if ((//判断坦克原xy点(m_x >= it->m_x && m_x < it->m_x + 20) && (m_y + 40 == it->m_y) ||//判断坦克右xy点(m_x + 40 > it->m_x&& m_x + 40 <= it->m_x + 20) && (m_y + 40 == it->m_y) )//判断⽅块属性&& (it->prop == 0 || it->prop == 1)//判断地图边界范围|| (m_y + 60 > 600))return;break;case 'd':if ((//判断坦克原xy点(m_y >= it->m_y && m_y < it->m_y + 20) && (m_x + 40 == it->m_x) ||//判断坦克右xy点(m_y + 40 > it->m_y&& m_y + 40 <= it->m_y + 20) && (m_x + 40 == it->m_x) )//⽅块属性&& (it->prop == 0 || it->prop == 1)//判断地图边界范围|| (m_x + 60 > 900))return;break;}}//根据key1值修改坦克坐标switch (key1){case 'w':m_y -= 20; break;case 'a':m_x -= 20; break;case 's':m_y += 20; break;case 'd':m_x += 20; break;}}//如果键值为j则发射炮弹,如果键值为wasd则移动坦克if (key1 == 'j')launch();else{printtank(key1); //根据键值输出显⽰坦克b_m_x = m_x + 18; //移动时也重置⼦弹坐标b_m_y = m_y + 18; //这⾥key1值不能重置为key2值}//如果我军坦克被消灭,则被消灭次数+1,并重置坦克if (m_health <= 0){Fridienum++;m_x = 300; //坐标m_y = 560;m_health = 100; //⾎量}}};//统计所有敌军坦克次数全局变量//敌军坦克class TankEnemy :public Tank{private:int pathsch; //路线⽅案int contdir;bool Entankdie = true; //标记敌军坦克的死亡状态public://构造函数接收初始坦克坐标TankEnemy(const int x ,const int y, const int pathsch) //构造函数初始化坦克坐标{m_x = x; //敌⽅坦克初始坐标m_y = y;b_m_x = m_x + 18; //坦克⼦弹坐标b_m_x = m_x + 18;m_health = 300; //坦克⾎量m_damage = 90; //坦克伤害contdir = 0;this->pathsch = pathsch; //路线path_1 = "坦克⼤战完整素材\\敌⽅坦克上.png"; //赋值需要将源⽂件属性语⾔中符合模式改为否 path_2 = "坦克⼤战完整素材\\敌⽅坦克下.png";path_3 = "坦克⼤战完整素材\\敌⽅坦克左.png";path_4 = "坦克⼤战完整素材\\敌⽅坦克右.png";gettank(path_1);//输出⼀个坦克图⽚}int getTankdamage() //获取坦克伤害{return m_damage;}int getTankhealth() //获取坦克⾎量{return m_health;}void setTankhealth(const int health) //设置坦克⾎量{m_health = health;}bool getEntadist() //获取坦克的死亡状态{return Entankdie;}void setpathsch(const int tanknum) //修改坦克⾏动路线{switch (tanknum) //判断坦克编号{case 1:pathsch = 5; //坦克1路线切换为路线2break;case 2:pathsch = 6;break;case 3:pathsch = 7;break;case 4:pathsch = 8;break;}}//重置坦克void setEntank(const int tanknum){if (Entankdie == false && (pathsch == 5 || pathsch == 6 || pathsch == 7 || pathsch == 8))return; //如果这个坦克的路线已经被修改过,且再次死亡,则不再重置switch (tanknum){case 1:m_x = 200, m_y = 40;contdir = 2;break;case 2:m_x = 720, m_y = 120;contdir = 3;break;case 3:m_x = 560, m_y = 120;break;case 4:m_x = 80, m_y = 360;contdir = 2;}m_health = 300;Entankdie = true;}//坦克1第⼆路线//直接攻击基地void pathschfun5_1_2(){static bool temp = true; //临时变量⽤作标记if(temp == true)contdir = 2;if (m_y == 560 && temp == true) //往右contdir = 4;if (m_y == 560 && m_x == 240){m_y = 560, m_x = 240;contdir = 0;temp = false;}}//坦克2路线2void pathschfun6_2_2(){//720, 120//需要改变两次⽅向static bool temp = true;static bool temp2 = true;if (temp == true && temp2 == true)contdir = 3; //往左if (m_x == 200 && temp == true && temp2 == true) //往下 contdir = 2;if (m_x == 200 && m_y == 560 && temp == true){contdir = 4; //往右temp2 = false;}if (m_y == 560 && m_x == 280){m_y = 560, m_x = 280;contdir = 0;temp = false;}}//坦克3路线2void pathschfun7_3_2(){static bool temp = true;if (temp == true)contdir = 2; //往下if (m_y == 560 && temp == true) //往左contdir = 3;if (m_y == 560 && m_x == 480){m_y = 560, m_x = 480;contdir = 0;temp = false;}}//坦克4路线2void pathschfun8_4_2(){static bool temp = true;if(temp == true)contdir = 2;if (m_y == 560 && temp == true)contdir = 4;if (m_x == 200 && m_y == 560){m_x = 200, m_y = 560;contdir = 0;temp = false;}}//正常路线1void pathschfun_1(){static bool temp = false; //临时变量辅助控制坦克⾏⾛路线 if (m_y == 480 && m_x == 200 && temp == true) //上{b_m_x = m_x + 18; //重置⼦弹位置为坦克中间b_m_y = m_y + 18;contdir = 1;return;}else if (m_y == 40 && m_x == 200) //下{b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 2;temp = false;return;}else if (m_y == 480 && m_x == 200 && temp == false) //右 {b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 4;temp = true;return;}else if (m_x == 700 && m_y == 480) //左{b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 3;return;}}//正常路线2void pathschfun_2(){if (m_x == 720){b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 3;return;}if (m_x <= 140){b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 4;return;}}//正常路线3void pathschfun_3(){if (m_y == 120){b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 2;return;}if (m_y >= 480){b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 1;return;}}//正常路线4void pathschfun_4(){if (m_y == 360){b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 2;return;}if (m_y >= 560){b_m_x = m_x + 18;b_m_y = m_y + 18;contdir = 1;return;}}//敌军坦克⾃动移动virtual void move(const list<mapstr>& tempves) {//根据contdir值,向不同⽅向移动switch (contdir){case 1:key2 = 'w'; //⽅向gettank(path_1); //坦克图⽚m_y -= 4;break;case 2:key2 = 's';gettank(path_2);m_y += 4;break;case 3:key2 = 'a';gettank(path_3);m_x -= 4;break;case 4:key2 = 'd';gettank(path_4);m_x += 4;break;}launch(); //发射⼦弹//不同pathsch不同路线⼀个坦克两条路线switch (pathsch){case 1: pathschfun_1(); break;case 2: pathschfun_2(); break;case 3: pathschfun_3(); break;case 4: pathschfun_4(); break;case 5: pathschfun5_1_2(); break;case 6: pathschfun6_2_2(); break;case 7: pathschfun7_3_2(); break;case 8: pathschfun8_4_2();}//敌军坦克被消灭//如果坦克⾎量⼩于等于0,则将坦克从界⾯内移除 if (m_health <= 0){Endienum++; //敌军坦克被消灭次数⾃增Entankdie = false; //死亡状态为falsem_x = -40,m_y = -40;//坦克被移除⾄页⾯外b_m_x = m_x, b_m_y = m_y;//⼦弹跟随坦克 }}};//敌军坦克数量const int N = 4;//⼦弹命中检测bool hittest(TankFriend& tank_f, TankEnemy* Etankarr, list<mapstr>& listmap) //参数:我⽅坦克对象,敌军坦克对象数组,地图list容器{const int tanfirlau_x = tank_f.getlauch_x(); //友军坦克⼦弹x坐标const int tanfirlau_y = tank_f.getlauch_y(); //友军坦克⼦弹y坐标const int firtank_x = tank_f.getTank_x(); //友军坦克x坐标const int firtank_y = tank_f.getTank_y(); //友军坦克y坐标const int tankfirdam = tank_f.getTankdamage(); //友军坦克伤害const int tankfirhea = tank_f.getTankhealth(); //友军坦克⾎量for (int i = 0; i < N; i++){//发射⼦弹需要判断两个点//如果友军⼦弹和敌军坦克重合,敌军坦克⾎量减少,且友军坦克⼦弹坐标重置if ((tanfirlau_x >= Etankarr[i].getTank_x() && tanfirlau_x <= Etankarr[i].getTank_x() + 40 &&tanfirlau_y >= Etankarr[i].getTank_y() && tanfirlau_y <= Etankarr[i].getTank_y() + 40) ||(tanfirlau_x + 4 >= Etankarr[i].getTank_x() && tanfirlau_x <= Etankarr[i].getTank_x() + 4 + 40 &&tanfirlau_y >= Etankarr[i].getTank_y() + 4 && tanfirlau_y + 4 <= Etankarr[i].getTank_y() + 40)){Etankarr[i].setTankhealth(Etankarr[i].getTankhealth() - tankfirdam); //⾎量减少tank_f.exploed(); //友⽅坦克攻击导致⼦弹遇到对⽅的位置爆炸tank_f.setlauch_xy(); //友军的炮弹坐标重置}//如果敌军⼦弹和友军坦克重合,友军坦克⾎量减少,且敌军坦克⼦弹坐标重置if ((Etankarr[i].getlauch_x() >= firtank_x && Etankarr[i].getlauch_x() <= firtank_x + 40 &&Etankarr[i].getlauch_y() >= firtank_y && Etankarr[i].getlauch_y() <= firtank_y + 40) ||(Etankarr[i].getlauch_x() + 4 >= firtank_x && Etankarr[i].getlauch_x() + 4 <= firtank_x + 40 &&Etankarr[i].getlauch_y() + 4 >= firtank_y && Etankarr[i].getlauch_y() + 4 <= firtank_y + 40)){tank_f.setTankhealth(tankfirhea - Etankarr[i].getTankdamage()); //友军坦克本⾝⾎量 - 敌军坦克伤害Etankarr[i].exploed();Etankarr[i].setlauch_xy(); //敌军的炮弹坐标重置}//判断墙的状态//包括我军坦克和敌军坦克⼦弹和墙的状态for (list<mapstr>::iterator it = listmap.begin(); it != listmap.end(); it++){//⼦弹碰到墙壁需要判断两个点if ((tank_f.getlauch_x() >= it->m_x && tank_f.getlauch_x() <= it->m_x + 20 &&tank_f.getlauch_y() >= it->m_y && tank_f.getlauch_y() <= it->m_y + 20) ||(tank_f.getlauch_x() + 4 >= it->m_x && tank_f.getlauch_x() + 4 <= it->m_x + 20 &&tank_f.getlauch_y() + 4 >= it->m_y && tank_f.getlauch_y() + 4 <= it->m_y + 20)){switch (it->prop){case 0: //砖块可以被删除tank_f.exploed(); //⼦弹处发⽣爆炸tank_f.setlauch_xy(); //⼦弹重置listmap.erase(it); //删除被⼦弹击中的墙壁数据break;case 1: //铁块会爆炸不会被删除tank_f.exploed(); //⼦弹处发⽣爆炸tank_f.setlauch_xy(); //⼦弹重置break;case 2: //草块不会有作⽤break;case 4:mapstr temp;temp.m_x = it->m_x;temp.m_y = it->m_y;temp.prop = 5;listmap.insert(it, temp);listmap.erase(it); //⽼鹰被攻击游戏结束return true;}//最后breakbreak;}if ((Etankarr[i].getlauch_x() >= it->m_x && Etankarr[i].getlauch_x() <= it->m_x + 20 &&Etankarr[i].getlauch_y() >= it->m_y && Etankarr[i].getlauch_y() <= it->m_y + 20) ||(Etankarr[i].getlauch_x() + 4 >= it->m_x && Etankarr[i].getlauch_x() + 4 <= it->m_x + 20 &&Etankarr[i].getlauch_y() + 4 >= it->m_y && Etankarr[i].getlauch_y() + 4 <= it->m_y + 20)){switch (it->prop){case 0: //砖块可以被删除Etankarr[i].exploed(); //⼦弹处发⽣爆炸Etankarr[i].setlauch_xy(); //⼦弹重置listmap.erase(it); //删除被⼦弹击中的墙壁数据break;case 1: //铁块会爆炸不会被删除。
f u n c o d e C课程设计坦克大战文件编码(008-TTIG-UTITD-GKBTT-PUUTI-WYTUI-8256)课程设计一坦克大战一、游戏介绍相信大部分同学都玩过或看过“坦克大战”这款经典游戏。
现在,就由我们自己动手来开发它。
只要大家具备了C++语言和面向对象的基础知识,然后按照实验指南的指导一步一步进行下去,相信我们每个同学都能把这款经典游戏做出来。
二、实验目标综合运用C++及其面向对象的知识开发一款小游戏。
三、实验内容在一个战场上,玩家控制坦克,消灭敌方坦克,并防止敌方坦克摧毁我方基地。
游戏的具体要求如下:1、游戏有一个初始页面,如下图。
2、按下任意键开始游戏,玩家控制坦克在战场上穿梭,碰到墙时,不能通过。
3、敌方坦克自由移动,每隔2秒改变一个方向,每隔3秒发射一发子弹。
4、敌方坦克每隔5秒出现一辆,从屏幕上方的左、中、右三个位置依次出现。
5、当玩家被消灭或者我方基地被摧毁或者游戏时间大于30秒的时候,游戏结束。
游戏开始前进入游戏四、游戏的整体框架五、实验指南实验准备打开FunCode,创建一个新的C++项目。
注意:项目名称必须为英文和数字,且不能有空格。
点击“项目”→“导入地图模板”,从对话框中选取名称为TankWar的模板导入。
导入成功后,界面如下:实验一游戏开始【实验内容】1、设置游戏标题2、按空格键,提示图片消失,游戏进入开始状态.【实验运行结果】游戏开始前按下空格键后【实验思路】按下空格键是键盘按下事件,可在CSystem::OnKeyDown函数中编写响应代码。
为了保证程序结构的清晰、一致,更好的办法是在CGameMain类中添加一个相应的键盘按下事件处理函数,然后在CSystem::OnMouseClick函数中进行调用。
g_GameMain是CGameMain类的对象,它是全局变量,在程序运行时最先被创建。
【实验指导】1、C++程序的执行入口是主函数。
FunCode的主函数名称叫WinMain,写在文件中。
C语⾔完整游戏项⽬坦克⼤战详细代码话不多说我们今天就来创造出属于我们⾃⼰的《坦克⼤战》,GOGOGO直接开始吧这次的源码⽐较详细,我分了好⼏个cpp⽂件,思路更加的清晰,请耐⼼⽤⼼的观看⾸先就是我们载⼊图⽚的函数tupian.cpp# include "tanke.h"障碍物void LaoWang(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32 , 32 , &img, 32 * 5, 0 );}void tileHong(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 0, 0 );return;}void tileLv(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 2, 0 );return;}void tileBai(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 1, 0 );return;}IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 3, 0 ); }//物品void FaZhang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\fazhang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShouQiang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\shouqiang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShangDian(int *wupinx, int *wupiny){IMAGE img;loadimage(&img,_T("res\\shangdian.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void YaoShui(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\yaoshui.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void DunPai(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\dunpai.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void XieZi(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\ iezi.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void Boss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\boss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void BigBoss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\bigboss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }接下来是初始化的函数waiyuan.cpp# include "tanke.h"{setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾃⼰⽣命值:";outtextxy(0, 20, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *j) / 60.0);outtextxy(90, 20, c3);}void DShengMing(int * d,int *k){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "敌⼈⽣命值:";outtextxy(0, 0, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *d) / 60.0);outtextxy(90, 0, c3);char c4[40] = "恭喜~! 现在起⾦币到2200有惊喜!";//胜利 if ( *k >= 8000 ){setcolor(YELLOW);settextstyle(30, 0, ("宋体"));outtextxy(150, 0, c4);}}void Gold(int * gold){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾦币:";outtextxy(0, 40, c2);char c3[10] ;sprintf(c3, _T("%d"), *gold);outtextxy(40, 40, c3);}void start(void){initgraph(200, 130);TCHAR s1[10]="坦克⼤战";TCHAR s2[30]="按A 开始游戏按B 退出游戏";TCHAR s3[30]="按W S A D控制⽅向";TCHAR s4[20]="按J 发射⼦弹";TCHAR s5[20]="按C 看攻略";outtextxy(70, 0, s1);outtextxy(0, 110, s2);outtextxy(60, 90, s5);outtextxy(55, 30, s4);outtextxy(35, 60, s3);while (true){Sleep(500);if (GetAsyncKeyState('A')){BeginBatchDraw();closegraph();initgraph(640, 480);Sleep(200);Quit();return ;}if (GetAsyncKeyState('C'))GongLue();}}}void GongLue(void){initgraph(450, 300);TCHAR s1[20]="游戏攻略:";TCHAR s2[50]="再打坦克之前先吃法杖打掉⽩⾊砖块,";TCHAR s3[50]="这样敌坦克打⽩⾊就不能回⾎了,boss更应如此。
坦克大战游戏编程实现游戏编程实现坦克大战坦克大战是一款经典的电子游戏,在游戏中,玩家将控制一个坦克,通过操作坦克的移动和攻击,与其他玩家或电脑进行战斗。
本文将介绍如何使用编程语言实现坦克大战游戏。
设计思路在实现坦克大战游戏之前,首先需要明确游戏的基本要素和规则。
玩家将操作一个坦克,通过键盘或操纵杆控制坦克的移动和攻击。
游戏画面由地图、坦克、子弹等元素构成。
坦克可以向前、向后、向左、向右移动,可以发射子弹进行攻击。
玩家需要躲避敌方坦克的攻击,同时尽可能击败敌方坦克。
编程实现坦克的移动和攻击可以通过编程语言来实现。
以下是使用Java语言来编写坦克大战游戏的示例代码:```javapublic class TankGame extends JFrame {private Tank tank; // 玩家坦克private List<Tank> enemyTanks; // 敌方坦克列表private List<Bullet> bullets; // 子弹列表public TankGame() {// 初始化游戏窗口this.setSize(800, 600);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true);// 初始化玩家坦克tank = new Tank(400, 500);// 初始化敌方坦克列表enemyTanks = new ArrayList<>();enemyTanks.add(new Tank(100, 100));enemyTanks.add(new Tank(300, 200));// 初始化子弹列表bullets = new ArrayList<>();// 添加键盘监听器,控制坦克移动和攻击this.addKeyListener(new KeyListener() {@Overridepublic void keyPressed(KeyEvent e) {int keycode = e.getKeyCode();switch (keycode) {case KeyEvent.VK_UP:tank.moveUp();break;case KeyEvent.VK_DOWN: tank.moveDown();break;case KeyEvent.VK_LEFT: tank.moveLeft();break;case KeyEvent.VK_RIGHT: tank.moveRight();break;case KeyEvent.VK_SPACE: bullets.add(tank.fire());break;default:break;}// 重新绘制游戏画面repaint();}@Overridepublic void keyReleased(KeyEvent e) { }@Overridepublic void keyTyped(KeyEvent e) { }});}// 绘制游戏画面public void paint(Graphics g) {super.paint(g);// 绘制玩家坦克tank.draw(g);// 绘制敌方坦克for (Tank enemyTank : enemyTanks) { enemyTank.draw(g);}// 绘制子弹for (Bullet bullet : bullets) {bullet.draw(g);}}public static void main(String[] args) {new TankGame();}}```在上述示例代码中,我们创建了一个继承自JFrame的主窗口,并在窗口中添加了一个玩家坦克、敌方坦克和子弹的列表。
c语言简单的坦克对战代码C语言简单的坦克对战代码介绍坦克对战游戏是一个经典的游戏,它可以锻炼玩家的反应能力和策略思维。
本文将介绍如何使用C语言编写一个简单的坦克对战游戏。
准备工作在开始编写代码之前,我们需要安装一些必要的工具。
首先,我们需要下载并安装一个C语言编译器。
常见的C语言编译器有GCC、Clang等。
其次,我们需要选择一个集成开发环境(IDE),例如Code::Blocks、Visual Studio等。
游戏规则在本文中,我们将实现一个基本的坦克对战游戏。
游戏规则如下:1. 游戏场景为一个20*20的方格。
2. 游戏中有两辆坦克,分别由玩家和电脑控制。
3. 玩家可以通过键盘控制自己的坦克移动和发射子弹。
4. 电脑会随机移动并发射子弹。
5. 当一辆坦克被击中时,游戏结束。
代码实现下面是实现上述规则所需的代码:头文件和宏定义```#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <windows.h>#define WIDTH 20#define HEIGHT 20```其中,`WIDTH`和`HEIGHT`表示游戏场景的宽度和高度。
游戏场景的绘制void drawScene(char scene[WIDTH][HEIGHT]){int i, j;system("cls");for (i = 0; i < HEIGHT; i++) {for (j = 0; j < WIDTH; j++) {printf("%c", scene[i][j]);}printf("\n");}}```该函数用于绘制游戏场景。
参数`scene`是一个二维字符数组,用于表示游戏场景中每个位置的状态。
函数首先清空屏幕,然后遍历二维数组并输出对应的字符。
scratch坦克大战Scratch坦克大战引言:Scratch是一款基于编程的教育平台,它允许用户通过拖拽代码块的方式学习编程。
凭借其简单易用的界面和丰富的功能,很多学生和编程爱好者选择使用Scratch来创建有趣的项目。
其中,Scratch 坦克大战是一款备受欢迎的项目,它让玩家能够参与到一个精彩刺激的坦克对战游戏中。
本文将详细介绍Scratch坦克大战的规则和实现方法。
第一部分:规则介绍1.1 游戏目标- 在 Scratch坦克大战中,玩家的目标是击败所有敌方坦克,保持自己的坦克生存并取得胜利。
1.2 游戏界面- 游戏界面分为两部分:玩家坦克区域和敌方坦克区域。
玩家通过操作自己的坦克,发射炮弹来消灭敌人。
1.3 游戏规则- 玩家坦克和敌方坦克具有各自的生命值,当生命值减为0时,坦克将被击毁。
- 每次击败敌方坦克后,玩家将获得积分。
积分越高,表示玩家的战斗能力越强。
- 敌方坦克会在随机位置生成,并向玩家坦克移动。
玩家需要及时发现并消灭它们。
- 玩家坦克的装甲会随着游戏进行逐渐减少,玩家需要小心保护自己的坦克。
- 游戏中还可能出现一些道具,例如加血包和强化炮弹,玩家可以通过吃到这些道具来增强自己的战斗力。
第二部分:游戏实现方法2.1 创建角色- 首先,我们需要创建玩家坦克角色和敌方坦克角色。
可以使用Scratch提供的角色编辑器来设计坦克的外观和动画。
2.2 移动控制- 玩家坦克的移动可以由键盘控制,可以设置上下左右四个方向键来控制坦克的运动。
- 敌方坦克的移动可以使用随机数生成器来确定移动的方向和距离。
2.3 战斗机制- 玩家坦克可以发射炮弹来击败敌方坦克。
可以通过设置触发器和相关的代码块来实现炮弹的发射和碰撞检测。
- 敌方坦克也可以发射炮弹攻击玩家。
玩家需要躲避敌方的炮弹,保护自己的坦克不被击中。
2.4 生命值管理- 玩家坦克和敌方坦克的生命值可以使用变量来进行管理。
当坦克受到攻击时,生命值将减少,并根据生命值的变化来改变坦克的外观。
C大作业坦克大战文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]#include<iostream>#include<>#include<>#include<>#include<>usingnamespacestd;HANDLEMutex=CreateMutex(NULL,FALSE,NULL);//互斥对象intGameOver=0;intlevel=0;intmap[23][23];//坦克种类,Normal为玩家坦克#defineNormal0#defineRed1#defineBlue2#defineGreen3//方向的宏定义#defineUp0#defineDown1#defineLeft2#defineRight3//地图标记的宏定义#defineEmpty0#definePlayer1#definePlayerBullet2#defineEnemyBullet3#defineEnemy4intKill;intKillRed;intKillGreen;intEnemyExist;voidSetPos(inti,intj)//设定光标位置{COORDpos={i,j};HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out,pos);}voidHideCurSor(void)//隐藏光标{CONSOLE_CURSOR_INFOinfo={1,0};HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(Out,&info);}intsharp[4][12]={{0,1,1,0,1,1,1,2,2,0,2,2},{0,0,0,2,1,0,1,1,1,2,2,1},{0,1,0,2,1,0,1,1,2,1,2,2},{0,0,0,1,1,1,1,2,2,0,2,1},};//此数组用来保存坦克各个方向的形状信息DWORDWINAPIBulletfly(LPVOIDlpParameter);//子弹函数申明voidUpdata();//更新界面信息函数申明classTank//坦克类{private:intDirection;//方向inthotpoint[2];//活动点intSpeed;//速度intFirePower;//火力public:Tank(intdir,inthot1,inthot2,inttyp,intspe,intfirepow)//构造函数{Direction=dir;hotpoint[0]=hot1;hotpoint[1]=hot2;Type=typ;Speed=spe;FirePower=firepow;}intType;//坦克的种类(详见宏定义)intID;//坦克在MAP中的标记(详见宏定义)intFireEnable;//是否可以开火intLife;//生命值voidRunning();//运行函数intJudge(intx,inty,intID);//判断是否可以绘制坦克voidDrawTank();//重绘坦克voidRedraw();//擦除坦克intGetSpeed()//获取速度{returnSpeed;}intGetFire()//获取火力{returnFirePower;}intGetDirection()//获取方向{returnDirection;}intGetHotX()//获取活动点坐标{returnhotpoint[0];}intGetHotY(){returnhotpoint[1];}voidIncreaseFire()//火力+{FirePower++;}voidIncreaseSpeed()//速度+{Speed++;}voidChangeDirection(intnewD)//改变方向{Direction=newD;}voidChangePos(intx,inty)//改变活动点{hotpoint[0]=x;hotpoint[1]=y;}};Tankplayer(Right,0,0,Normal,1,1);//玩家Tankenemy(Left,20,0,Red,1,1);//敌人voidTank::DrawTank()//绘制坦克{inti;intnx,ny;if(Type==Red)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREG ROUND_INTENSITY|FOREGROUND_RED);elseif(Type==Blue)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREG ROUND_INTENSITY|FOREGROUND_BLUE);elseif(Type==Green)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREG ROUND_INTENSITY|FOREGROUND_GREEN);elseif(Type==Normal)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREG ROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGRO UND_BLUE);for(i=0;i<6;i++){nx=hotpoint[0]+sharp[Direction][i*2];ny=hotpoint[1]+sharp[Direction][i*2+1];SetPos((ny+1)*2,nx+1);//利用sharp数组相对于点x,y绘制形状map[nx][ny]=ID;cout<<"■";}}voidTank::Redraw()//擦除坦克,原理同上{inti;intnx,ny;for(i=0;i<6;i++){nx=hotpoint[0]+sharp[Direction][i*2];ny=hotpoint[1]+sharp[Direction][i*2+1];map[nx][ny]=Empty;SetPos((ny+1)*2,nx+1);cout<<"";}}intTank::Judge(intx,inty,intdir)//判断当前是否可以绘制坦克{inti;intnx,ny;for(i=0;i<6;i++){nx=x+sharp[dir][i*2];ny=y+sharp[dir][i*2+1];if(nx<0||nx>=23||ny<0||ny>=23||map[nx][ny]!=Empty)//不能绘制,返回1return1;}return0;}voidTank::Running()//坦克运行函数{intnewD;//坦克的运行while(1){if(Life==0){EnemyExist=0;//敌人不存在return;}if(GameOver==1)return;if(FireEnable==1&&GameOver==0)//如果可以开火{WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象FireEnable=0;//设为不可开火HANDLEbullet=CreateThread(NULL,0,Bulletfly,&ID,0,NULL);//创建子弹线程CloseHandle(bullet);ReleaseMutex(Mutex);//释放互斥对象Sleep(100);}WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象srand((int)time(0));newD=rand()%4;if(newD==Up)//随机出新的方向并重新绘制坦克{Redraw();if(Judge(hotpoint[0]-1,hotpoint[1],newD)==0){hotpoint[0]--;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0)Direction=newD;}}elseif(newD==Down){Redraw();if(Judge(hotpoint[0]+1,hotpoint[1],newD)==0){hotpoint[0]++;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0)Direction=newD;}}elseif(newD==Left){Redraw();if(Judge(hotpoint[0],hotpoint[1]-1,newD)==0){hotpoint[1]--;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0)Direction=newD;}}elseif(newD==Right){Redraw();if(Judge(hotpoint[0],hotpoint[1]+1,newD)==0){hotpoint[1]++;Direction=newD;}else{if(Judge(hotpoint[0],hotpoint[1],newD)==0)Direction=newD;}}if(GameOver==0&&Life!=0)DrawTank();ReleaseMutex(Mutex);//释放互斥对象Sleep(500-80*Speed);}}/*********************子弹线程函数*******************/ DWORDWINAPIBulletfly(LPVOIDlpParameter){int*ID=(int*)lpParameter;//ID用来获取发射子弹坦克的IDintPos[2];//子弹活动点intdirection;intSpeed;inttype;inthit=0;//击中标记intoldx,oldy;//旧活动点intflag=0;//子弹是否有移动的标记if(*ID==Player)//如果是玩家坦克{type=PlayerBullet;direction=();Speed=();Pos[0]=();Pos[1]=();}elseif(*ID==Enemy)//如果是敌人坦克{type=EnemyBullet;direction=();Speed=();Pos[0]=();Pos[1]=();}if(direction==Up)//根据坦克的位置和方向确定子弹的初始坐标{Pos[0]--;Pos[1]++;}elseif(direction==Down){Pos[0]+=3;Pos[1]++;}elseif(direction==Left){Pos[0]++;Pos[1]--;}elseif(direction==Right){Pos[0]++;Pos[1]+=3;}//子弹的运行while(1){WaitForSingleObject(Mutex,INFINITE);//这个不再注释了。
C语言课程设计--坦克大战一、游戏介绍玩家坦克与敌方坦克在街道中进行巷战,玩家坦克被击中、玩家指挥部被击中或游戏时间到,一局游戏结束。
二、实验目的综合应用C语言知识和设计知识开发一款小游戏。
三、实验内容初始界面如下图。
按下空格键后游戏开始,“空格开始”消失,载入地图,并把玩家坦克设置在指挥部左侧。
游戏时间到,比如30秒,玩家坦克被敌方坦克摧毁,或者玩家指挥部被摧毁,一局游戏结束,游戏回到初始界面,并显示上一局的分数。
游戏区域为下图中最内部的黑色区域,左上角坐标[-26, -22],右下角坐标为[26, 22]。
墙为正方形,边长为4,坦克也是正方形,比墙略小一点。
玩家用WASD键控制坦克上、下、左、右运行,按J键开炮。
玩家坦克碰到墙就停下来,需要调转方向才能继续前进。
玩家坦克开炮,一炮就能摧毁一块墙,或者一辆敌方坦克。
玩家没摧毁一辆敌方坦克,加1分。
玩家指挥部被坦克或者炮弹(不管玩家还是敌方)碰上,都会被摧毁。
每隔几秒钟,比如3秒,就会产生一辆敌方坦克。
敌方坦克每隔一段时间,比如1秒,就自动开炮。
敌方坦克遇到墙就会停下来。
停下来的坦克,前方的墙如果被摧毁了,又能继续前进。
每隔几秒钟,比如2秒,敌方坦克就会顺时针变换一个方向前进。
四、实验准备本实验中可能用到的C语言标准库函数和FunCode APIStdio.h函数原型功能与返回值参数说明与应用举例int sprintf( char *buffer, const char *format,[ argument] … ) ; 把格式化的数组写入某个字符串。
返回值:字符串长度char szName[128];int i=0;sprintf(szName, ”feichong_%d”, i);将字符串”feichong_0”写入到szName中Math.h函数原型功能与返回值参数说明与应用举例double atan2( double y, double x ); 计算y/x的反正切值。
用c做的简单的坦克大战小游戏(给初学者点动力)#include <graphics.h>#include <stdlib.h>#include <dos.h>#include <conio.h>#include <bios.h>#define KEY_ESC 0x01#define KEY_SPACE 0x39#define KEY_UP 0x48#define KEY_LEFT 0x4b#define KEY_RIGHT 0x4d#define KEY_DOWN 0x50/*1石头,2砖块,3水,5老家,8玩家,9敌人*/int map[20][20]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,2,2,2,0,0,2,2,2,2,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,2,0,0,2,0,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,1,0,1,1,1,1,3,3,3,3,0,0,0,0,0,0,0,2,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3,3,0,1,1,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,3,3,3,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,2,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,1,0,2,2,0,0,0,0,2,2,2,0,0,0,2,2,0,0,0,1,1,0,0,0,0,0,0,8,2,5,2,0,0,0,0,0,0,0,0,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};struct f{int x;int y;int direction;};struct play{int x;/*行坐标*/int y;/*列坐标*/int direction;/*方向*/struct f fire[5];/*5颗子弹*/int score;/*分数*/}Playone;struct a{int x;int y;int color;int direction;int directiontwo;/*用来判断走的路是否往返*/int fireplay;/*是否攻击的变量,随机生成*/struct f fire;}amy[5];/*敌人的结构体,其实可以添加不同的颜色来表示不同种类的坦克*/ char key_state[128],key_pressed[128];void Init();/*图象驱动开始*/void End();/*图象驱动结束*/void DrawMap();/*画地图*/void DrawWater(int x,int y);/*画水*/void DrawBrick(int x,int y);/*画砖*/void DrawTone(int x,int y);/*画石头*/void DrawHome(int x,int y);/*画老家*/void DrawBlack(int x,int y);/*去除内容*/void DrawPlay(int x,int y);/*画玩家*/void DrawAmy(int x,int y,int i);/*画敌人*/void Score();/*输出分数*/void GamePlay();/*玩游戏过程*/void GameOver();/*游戏失败*/void TimeDelay(unsigned long microsec); /*延时函数传入微秒数*/int GetKey(int ScanCode);/*这里开始都是按键函数*/void interrupt far (*OldInt9Handler)();void far interrupt NewInt9();void InstallKeyboard();void ShutDownKeyboard();void main(void){Init();DrawMap();GamePlay();End();}void TimeDelay(unsigned long microsec) /*延时函数传入微秒数*/{union REGS r;r.h.ah=0x86;r.x.cx=microsec>>16;r.x.dx=microsec;int86(0x15,&r,&r);}void Init()/*图象驱动开始*/{int gd=DETECT,gm;initgraph(&gd,&gm,"d:\\tc\\tc");cleardevice();InstallKeyboard();}void End()/*图象驱动结束*/{ShutDownKeyboard();closegraph();}void DrawTone(int x,int y)/*画石头*/{setfillstyle(SOLID_FILL,7);bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);作者:c闲人2004-8-20 00:42 回复此发言--------------------------------------------------------------------------------2 用c做的简单的坦克大战小游戏(给初学者点动力)}void DrawWater(int x,int y)/*画水*/{setfillstyle(SOLID_FILL,BLUE);bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);}void DrawBrick(int x,int y)/*画砖*/{setfillstyle(SOLID_FILL,6);bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);setcolor(15);line(100+x*20-9,50+y*20-4,100+x*20+9,50+y*20-4);line(100+x*20-9,50+y*20+4,100+x*20+9,50+y*20+4);line(100+x*20-4,50+y*20-9,100+x*20-4,50+y*20+9);line(100+x*20+4,50+y*20-9,100+x*20+4,50+y*20+9);}void DrawHome(int x,int y)/*画老家*/{setcolor(0);setfillstyle(SOLID_FILL,GREEN);fillellipse(100+x*20,50+y*20,9,9);}void DrawBlack(int x,int y)/*去除内容*/{setcolor(0);setfillstyle(SOLID_FILL,0);bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);}void DrawPlay(int x,int y)/*画玩家*/{setcolor(4);/*玩家为红色*/circle(100+x*20,50+y*20,7);switch(Playone.direction)/*判断玩家方向*/{case 1:line(100+x*20,50+y*20,100+x*20,50+y*20-9);break;/*上*/ case 2:line(100+x*20,50+y*20,100+x*20+9,50+y*20);break;/*右*/ case 3:line(100+x*20,50+y*20,100+x*20,50+y*20+9);break;/*下*/ case 4:line(100+x*20,50+y*20,100+x*20-9,50+y*20);break;/*左*/ }}void DrawAmy(int x,int y,int i)/*画敌人*/{if(amy[i].color==12)setcolor(12);else if(amy[i].color==13)setcolor(13);else/*这里是判断三种颜色的坦克*/setcolor(14);circle(100+x*20,50+y*20,7);switch(amy[i].direction)/*判断玩家方向*/{case 1:line(100+x*20,50+y*20,100+x*20,50+y*20-9);break;/*上*/ case 2:line(100+x*20,50+y*20,100+x*20+9,50+y*20);break;/*右*/ case 3:line(100+x*20,50+y*20,100+x*20,50+y*20+9);break;/*下*/ case 4:line(100+x*20,50+y*20,100+x*20-9,50+y*20);break;/*左*/ }}void Score()/*输出分数*/{char s[10];Playone.score+=10;sprintf(s,"%d",Playone.score);setfillstyle(SOLID_FILL,0);bar(550,100,640,130);settextstyle(0,0,2);setcolor(YELLOW);outtextxy(550,115,s);}void DrawMap()/*画地图*/{int i,j,k;for(i=0;i<20;i++){for(j=0;j<20;j++)if(map[i][j]==1)DrawTone(j,i);else if(map[i][j]==2)DrawBrick(j,i);else if(map[i][j]==3)DrawWater(j,i);else if(map[i][j]==5)DrawHome(j,i);else if(map[i][j]==8){Playone.x=i;Playone.y=j;Playone.direction=1;DrawPlay(j,i);for(k=0;k<5;k++)Playone.fire[k].direction=-1;/*5颗子弹的方向都为-1,表示不存在*/}else if(map[i][j]==9){amy[0].x=1;amy[0].y=1;amy[0].direction=amy[0].directiontwo=3;/*第一个敌人*/ amy[0].color=12;DrawAmy(j,i,0);}}for(i=1;i<5;i++)/*敌人都没出现*/amy[i].direction=amy[i].fire.direction=-1;outtextxy(210,450,"2003.10.1 milo_zy");settextstyle(0,0,2);/*首次输出得分*/setcolor(9);outtextxy(525,80,"Score");setcolor(YELLOW);outtextxy(550,115,"0");}void far interrupt NewInt9(void){unsigned char ScanCode,temp;ScanCode=inportb(0x60);temp=inportb(0x61);outportb(0x61,temp | 0x80);outportb(0x61,temp & 0x7f);if(ScanCode&0x80){ScanCode&=0x7f;key_state[ScanCode]=0;}else{key_state[ScanCode]=1;作者:c闲人2004-8-20 00:42 回复此发言--------------------------------------------------------------------------------3 用c做的简单的坦克大战小游戏(给初学者点动力)key_pressed[ScanCode]=1;}outportb(0x20,0x20);}void InstallKeyboard(void){int i;for(i=0;i<128;i++)key_state[i]=key_pressed[i]=0;OldInt9Handler=getvect(9); /*中断向量值*/setvect(9,NewInt9); /*中断程序NewInt9地址存入指定的中断向量表中INT 09H*/}void ShutDownKeyboard(void){setvect(9,OldInt9Handler);}int GetKey(int ScanCode){int res;res=key_state[ScanCode]|key_pressed[ScanCode];key_pressed[ScanCode]=0;return res;}void GameOver()/*游戏失败*/{setcolor(0);setfillstyle(SOLID_FILL,0);/*把老家给去除*/fillellipse(100+9*20,50+18*20,9,9);nosound();setcolor(RED);settextstyle(0,0,4);outtextxy(150,5,"GAME OVER");while(1){if(GetKey(KEY_ESC))break;}}void GamePlay()/*玩游戏的过程*/{int i,j,lose=0;/*lose是1的时候表示失败*/int t=0;randomize();while(1){for(i=0;i<5;i++)/*画敌人的子弹*/{if(amy[i].fire.direction>0)putpixel(100+amy[i].fire.y*20,50+amy[i].fire.x*20,11);}for(i=0;i<=4;i++)/*画玩家子弹*/{if(Playone.fire[i].direction>0)/*大于0表示玩家子弹存在*/putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,11);}TimeDelay(500000);/*关键的时间改动*/for(i=0;i<5;i++)/*去敌人的子弹*/{if(amy[i].fire.direction>0)putpixel(100+amy[i].fire.y*20,50+amy[i].fire.x*20,0);}for(i=0;i<=4;i++)/*去玩家除子弹*/{if(Playone.fire[i].direction>0)putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,0);}for(i=0;i<=4;i++)/*玩家子弹位置的变化*/{if(Playone.fire[i].direction<0)continue;if(Playone.fire[i].direction==1){Playone.fire[i].x--;Playone.fire[i].y=Playone.fire[i].y;}else if(Playone.fire[i].direction==2){Playone.fire[i].y++;Playone.fire[i].y=Playone.fire[i].y;}else if(Playone.fire[i].direction==3){Playone.fire[i].x++;Playone.fire[i].y=Playone.fire[i].y;}else if(Playone.fire[i].direction==4){Playone.fire[i].y--;Playone.fire[i].y=Playone.fire[i].y;}/*打到石头或者砖头的情况下减少子弹*/if(map[Playone.fire[i].x][Playone.fire[i].y]==1)/*打到石头*/Playone.fire[i].direction=-1;/*子弹消失*/if(map[Playone.fire[i].x][Playone.fire[i].y]==2)/*打到砖头*/{Playone.fire[i].direction=-1;DrawBlack(Playone.fire[i].y,Playone.fire[i].x);/*砖头打掉*/map[Playone.fire[i].x][Playone.fire[i].y]=0;/*被打掉的地方变成可走的地方*/ }if(map[Playone.fire[i].x][Playone.fire[i].y]==5)/*自己打到老家*/{lose=1;break;}for(j=0;j<5;j++){if(amy[j].direction<0)/*不存在的不判断*/continue;if(amy[j].x==Playone.fire[i].x&&amy[j].y==Playone.fire[i].y)/*打中敌人*/{Playone.fire[i].direction=-1;DrawBlack(Playone.fire[i].y,Playone.fire[i].x);map[Playone.fire[i].x][Playone.fire[i].y]=0;/*被打掉的地方变成可走的地方*/ amy[j].fire.direction=amy[j].direction=-1;/*这个敌人消失*/Score();/*输出得分*/}}}for(i=0;i<5;i++)/*敌人子弹位置的变化*/作者:c闲人2004-8-20 00:42 回复此发言--------------------------------------------------------------------------------4 用c做的简单的坦克大战小游戏(给初学者点动力){if(amy[i].direction<0||amy[i].fire.direction<0)continue;if(amy[i].fire.direction==1){amy[i].fire.x--;amy[i].fire.y=amy[i].fire.y;}else if(amy[i].fire.direction==2){amy[i].fire.y++;amy[i].fire.x=amy[i].fire.x;}else if(amy[i].fire.direction==3){amy[i].fire.x++;amy[i].fire.y=amy[i].fire.y;}else if(amy[i].fire.direction==4){amy[i].fire.y--;amy[i].fire.x=amy[i].fire.x;}/*打到石头或者砖头的情况下减少子弹*/if(map[amy[i].fire.x][amy[i].fire.y]==1)/*打到石头*/amy[i].fire.direction=-1;/*子弹消失*/if(map[amy[i].fire.x][amy[i].fire.y]==2)/*打到砖头*/{amy[i].fire.direction=-1;DrawBlack(amy[i].fire.y,amy[i].fire.x);/*砖头打掉*/map[amy[i].fire.x][amy[i].fire.y]=0;/*被打掉的地方变成可走的地方*/ }if(map[amy[i].fire.x][amy[i].fire.y]==5)/*敌人打到老家*/{lose=1;break;}if(amy[i].fire.x==Playone.x&&amy[i].fire.y==Playone.y)/*打中玩家*/{for(j=0;j<5;j++)Playone.fire[j].direction=-1;/*玩家子弹都消失*/amy[i].fire.direction=-1;DrawBlack(amy[i].fire.y,amy[i].fire.x);map[amy[i].fire.x][amy[i].fire.y]=0;/*被打掉的地方变成可走的地方*/ lose=1;break;/*好人被打掉后就失败*/}}nosound();for(i=0;i<5;i++)/*敌人方向随机的改变*/{if(amy[i].direction<0)continue;while(1){amy[i].directiontwo=random(4)+1;if(amy[i].direction==1&&amy[i].directiontwo==3)continue;if(amy[i].direction==3&&amy[i].directiontwo==1)continue;if(amy[i].direction==2&&amy[i].directiontwo==4)continue;if(amy[i].direction==4&&amy[i].directiontwo==2)/*这里4个if是判断有没有往返走*/ continue;if(amy[i].directiontwo==3&&(map[amy[i].x+1][amy[i].y]==3||map[amy[i].x+1][amy[i].y]==1||m ap[amy[i].x+1][amy[i].y]==2))continue;if(amy[i].directiontwo==1&&(map[amy[i].x-1][amy[i].y]==3||map[amy[i].x-1][amy[i].y]==1||ma p[amy[i].x-1][amy[i].y]==2))continue;if(amy[i].directiontwo==2&&(map[amy[i].x][amy[i].y+1]==3||map[amy[i].x][amy[i].y+1]==1||m ap[amy[i].x][amy[i].y+1]==2))continue;if(amy[i].directiontwo==4&&(map[amy[i].x][amy[i].y-1]==3||map[amy[i].x][amy[i].y-1]==1||ma p[amy[i].x][amy[i].y-1]==2))continue;/*以上4个是是否碰到了墙壁或者水什么的*/DrawBlack(amy[i].y,amy[i].x);/*把原来的地方擦掉*/amy[i].direction=amy[i].directiontwo;if(amy[i].direction==1){amy[i].x--;amy[i].y=amy[i].y;}if(amy[i].direction==3){amy[i].x++;amy[i].y=amy[i].y;}if(amy[i].direction==2){amy[i].y++;amy[i].x=amy[i].x;}if(amy[i].direction==4){amy[i].y--;amy[i].x=amy[i].x;}if(amy[i].x==Playone.x&&amy[i].y==Playone.y)/*相撞*/lose=1;if(map[amy[i].x][amy[i].y]==5)/*敌人撞到老家*/lose=1;DrawAmy(amy[i].y,amy[i].x,i);/*画敌人*/if(amy[i].fire.direction<0)amy[i].fireplay=random(4);if(amy[i].fireplay==1&&amy[i].fire.direction<0)/*发射*/{amy[i].fire.direction=amy[i].direction;/*子弹方向与敌人方向一致*/作者:c闲人2004-8-20 00:42 回复此发言--------------------------------------------------------------------------------5 用c做的简单的坦克大战小游戏(给初学者点动力)amy[i].fire.x=amy[i].x;amy[i].fire.y=amy[i].y;}break;}}if(lose)/*因为失败而跳出循环显示失败*/{GameOver();break;}if(GetKey(KEY_ESC))break;if(GetKey(KEY_UP))/*往上*/{if(Playone.direction==1&&map[Playone.x-1][Playone.y]!=1&&map[Playone.x-1][Playone.y]!=2) {if(map[Playone.x-1][Playone.y]==3)continue;DrawBlack(Playone.y,Playone.x);/*这个if是移动,前提是方向与按下的到向一致*/Playone.x--;Playone.direction=1;DrawPlay(Playone.y,Playone.x);}else/*只调整炮头方向*/{DrawBlack(Playone.y,Playone.x);Playone.direction=1;DrawPlay(Playone.y,Playone.x);}}else if(GetKey(KEY_DOWN))/*往下*/{if(Playone.direction==3&&map[Playone.x+1][Playone.y]!=1&&map[Playone.x+1][Playone.y]!= 2){if(map[Playone.x+1][Playone.y]==3)continue;DrawBlack(Playone.y,Playone.x);Playone.x++;Playone.direction=3;DrawPlay(Playone.y,Playone.x);}else{DrawBlack(Playone.y,Playone.x);Playone.direction=3;DrawPlay(Playone.y,Playone.x);}}if(GetKey(KEY_RIGHT))/*往右*/{if(Playone.direction==2&&map[Playone.x][Playone.y+1]!=1&&map[Playone.x][Playone.y+1]!= 2){if(map[Playone.x][Playone.y+1]==3)continue;DrawBlack(Playone.y,Playone.x);Playone.y++;Playone.direction=2;DrawPlay(Playone.y,Playone.x);}else{DrawBlack(Playone.y,Playone.x);Playone.direction=2;DrawPlay(Playone.y,Playone.x);}}if(GetKey(KEY_LEFT))/*往左*/{if(Playone.direction==4&&map[Playone.x][Playone.y-1]!=1&&map[Playone.x][Playone.y-1]!=2) {if(map[Playone.x][Playone.y-1]==3)continue;DrawBlack(Playone.y,Playone.x);Playone.y--;Playone.direction=4;DrawPlay(Playone.y,Playone.x);}else{DrawBlack(Playone.y,Playone.x);Playone.direction=4;DrawPlay(Playone.y,Playone.x);}}if(GetKey(KEY_SPACE))/*发射子弹*/{for(i=0;i<5;i++)/*用循环来找是否有子弹可以用*/if(Playone.fire[i].direction<0){sound(300);Playone.fire[i].direction=Playone.direction;/*子弹方向与坦克方向一致*/ Playone.fire[i].x=Playone.x;Playone.fire[i].y=Playone.y;break;/*找到后就跳出循环*/}}if(map[Playone.x][Playone.y]==5)/*玩家自己撞到老家*/lose=1;for(i=0;i<5;i++)/*判断是否因自己控制撞到敌人*/{if(amy[i].direction<0)continue;if(amy[i].x==Playone.x&&amy[i].y==Playone.y)/*相撞*/lose=1;}if(lose)/*因为失败而跳出循环显示失败*/{GameOver();break;}t++;/*加到一定的程序就出现新的敌人*/if(t==30) /*到了增加敌人的时候*/{t=0;for(i=0;i<5;i++)if(amy[i].direction<0){amy[i].direction=amy[i].directiontwo=3;amy[i].x=1;amy[i].y=random(3);/*方向随机*/if(amy[i].y==0)amy[i].y=1;else if(amy[i].y==1)amy[i].y=9;else/*这里和上面的两个判断是判断敌人的初始位置*/ amy[i].y=18;amy[i].color=random(3)+12;/*颜色随机*/DrawAmy(amy[i].y,amy[i].x,i);break;/*找到一个后就出循环*/}}}}。