c坦克大战源码
C++实现坦克大战小游戏EGE图形界面

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: //铁块会爆炸不会被删除。
C大作业坦克大战

#include<iostream> #include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h> 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), FOREGROUND_INTENSITY|FOREGROUND_RED);elseif(Type==Blue)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE);elseif(Type==Green)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_GREEN);elseif(Type==Normal)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREG R OUND_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)// 不能绘制,返回 1 return1;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 用来获取发射子弹坦克的 intPos[2];// 子弹活动点 intdirection; intSpeed; inttype;inthit=0;// 击中标记intoldx,oldy;// 旧活动点 intflag=0;// 子弹是否有移动的标记 if(*ID==Player)// 如果是玩家坦克 {type=PlayerBullet; direction=player.GetDirection(); Speed=player.GetFire(); Pos[0]=player.GetHotX(); Pos[1]=player.GetHotY();子弹线程函数IDelseif(*ID==Enemy)// 如果是敌人坦克{type=EnemyBullet;direction=enemy.GetDirection();Speed=enemy.GetFire();Pos[0]=enemy.GetHotX();Pos[1]=enemy.GetHotY();}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语⾔完整游戏项⽬坦克⼤战详细代码话不多说我们今天就来创造出属于我们⾃⼰的《坦克⼤战》,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更应如此。
坦克大战程序代码

坦克大战程序代码(总19页) -CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除import .* ;import .* ;importimport class f extends JFrame {f(String title) {(title) ;(608 , 630) ;(300 , 100) ;;MyTank mp = new MyTank() ;(mp) ;(mp) ;new Thread(mp).start() ;}public static void main(String[] args) {f h = new f("坦克大战(版本") ;(true) ;}}//主战坦克class MyTank extends JPanel implements KeyListener , Runnable {int x = 280, y = 280 ;//坦克的初始位置int op = 1 ;//坦克的移动方向int color = 0 ;int tankspeed = 8 ;//坦克的速度int tankbullet = 8 ;//坦克的子弹速度int tankfbullet = 4 ;//敌军的子弹速度int shengming = 100 ;//生命int fenshu = 0 ;int nandu = 5 ; //设置游戏难度//子弹int dx = 295 , dy = 295 ;int dx1 = 295 , dy1 = -10 ;int dx2 = 600 , dy2 = 295 ;int dx3 = 295 , dy3 = 600 ;int dx4 = -10 , dy4 = 295 ;//敌军坦克int num = 10 ;//敌军坦克数量,不能修改int[] xf = new int[num] ;int[] yf = new int[num] ;int[] opf = new int[num] ;int[] dxf = new int[num] ;int[] dyf = new int[num] ;int[] dxf1 = new int[num] ;int[] dyf1 = new int[num] ;int[] dxf2 = new int[num] ;int[] dyf2 = new int[num] ;int[] dxf3 = new int[num] ;int[] dyf3 = new int[num] ;int[] dxf4 = new int[num] ;int[] dyf4 = new int[num] ;//构造函数,初始化敌军坦克的位置和状态MyTank() {for (int i = 0; i<num; i++) {xf[i] = (int) () * 560) ;yf[i] = (int) () * 560) ;dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}for (int i = 0; i<num; i++) {dxf1[i] = 295 ; dyf1[i] = -10 ;dxf2[i] = 600 ; dyf2[i] = 295 ;dxf3[i] = 295 ; dyf3[i] = 600 ;dxf4[i] = -10 ; dyf4[i] = 295 ;}}//主面版public void paint(Graphics g) {(g) ;;;("生命:" , 10 , 20 ) ;(50 , 10 , shengming * 5 , 10) ;(50 , 10 , 500 , 10) ;("得分: "+ fenshu , 10 , 40) ;if(op == 1) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x - 5 , y + 5 , 10 , 10) ; (x - 5 , y + 15 , 10 , 10) ; (x - 5 , y + 25 , 10 , 10) ; (x - 5 , y + 35 , 10 , 10) ;(x + 35 , y - 5 , 10 , 10) ;(x + 35 , y + 5 , 10 , 10) ; (x + 35 , y + 15 , 10 , 10) ; (x + 35 , y + 25 , 10 , 10) ; (x + 35 , y + 35 , 10 , 10) ;;(x + 15 , y - 20 , 10 , 40) ; switch (color % 20) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;case 6: ; break;case 7: ; break;case 8: ; break;case 9: ; break;case 10: ; break;case 11: ; break;case 12: ; break;case 13: ; break;case 14: ; break;case 15: ; break;case 16: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 5 , y + 30 , 10 , 10) ; (x + 25 , y + 30 , 10 , 10) ;}if(op == 2) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x + 5 , y - 5 , 10 , 10) ; (x + 15 , y - 5 , 10 , 10) ; (x + 25 , y - 5 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ;(x - 5 , y+35 , 10 , 10) ; (x + 5 , y+35 , 10 , 10) ; (x + 15 , y+35 , 10 , 10) ; (x + 25 , y+35 , 10 , 10) ; (x + 35 , y+35 , 10 , 10) ;;(x + 20 , y + 15 , 40 , 10) ;switch (color % 20) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;case 6: ; break;case 7: ; break;case 8: ; break;case 9: ; break;case 10: ; break;case 11: ; break;case 12: ; break;case 13: ; break;case 14: ; break;case 15: ; break;case 16: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x , y + 5 , 10 , 10) ;(x , y + 25 , 10 , 10) ;}if(op == 3) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x - 5 , y + 5 , 10 , 10) ; (x - 5 , y + 15 , 10 , 10) ; (x - 5 , y + 25 , 10 , 10) ;(x - 5 , y + 35 , 10 , 10) ;(x + 35 , y - 5 , 10 , 10) ; (x + 35 , y + 5 , 10 , 10) ; (x + 35 , y + 15 , 10 , 10) ; (x + 35 , y + 25 , 10 , 10) ; (x + 35 , y + 35 , 10 , 10) ;;(x + 15 , y + 20 , 10 , 40) ; switch (color % 20) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;case 6: ; break;case 7: ; break;case 8: ; break;case 9: ; break;case 10: ; break;case 11: ; break;case 12: ; break;case 13: ; break;case 14: ; break;case 15: ; break;case 16: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 5 , y , 10 , 10) ;(x + 25 , y , 10 , 10) ;}if(op == 4) {;(x , y , 40 , 40) ;switch (color % 6) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;}(x - 5 , y - 5 , 10 , 10) ; (x + 5 , y - 5 , 10 , 10) ; (x + 15 , y - 5 , 10 , 10) ; (x + 25 , y - 5 , 10 , 10) ; (x + 35 , y - 5 , 10 , 10) ; (x - 5 , y+35 , 10 , 10) ; (x + 5 , y+35 , 10 , 10) ; (x + 15 , y+35 , 10 , 10) ; (x + 25 , y+35 , 10 , 10) ; (x + 35 , y+35 , 10 , 10) ;;(x - 20 , y + 15 , 40 , 10) ; switch (color % 20) {case 0: ; break;case 1: ; break;case 2: ; break;case 3: ; break;case 4: ; break;case 5: ; break;case 6: ; break;case 7: ; break;case 8: ; break;case 9: ; break;case 10: ; break;case 11: ; break;case 12: ; break;case 13: ; break;case 14: ; break;case 15: ; break;case 16: ; break;case 17: ; break;case 18: ; break;case 19: ; break; }(x + 30 , y + 5 , 10 , 10) ; (x + 30 , y + 25 , 10 , 10) ;;(dx , dy , 10 , 10) ;(dx1 , dy1 , 10 , 10) ;(dx2 , dy2 , 10 , 10) ;(dx3 , dy3 , 10 , 10) ;(dx4 , dy4 , 10 , 10) ;for (int i = 0; i<num; i++) {if(opf[i] == 1) {(xf[i] , yf[i] , 40 , 40) ;(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 15 , 10 , 10) ; (xf[i] - 5 , yf[i] + 25 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ;(xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 15 , 10 , 10) ; (xf[i] + 35 , yf[i] + 25 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ;(xf[i] + 15 , yf[i] - 20 , 10 , 40) ;(xf[i] + 5 , yf[i] + 30 , 10 , 10) ; (xf[i] + 25 , yf[i] + 30 , 10 , 10) ; }if(opf[i] == 2) {(xf[i] , yf[i] , 40 , 40) ;(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 15 , yf[i] - 5 , 10 , 10) ; (xf[i] + 25 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ;(xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 35 , 10 , 10) ; (xf[i] + 25 , yf[i] + 35 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ;(xf[i] + 20 , yf[i] + 15 , 40 , 10) ;(xf[i] , yf[i] + 5 , 10 , 10) ;(xf[i] , yf[i] + 25 , 10 , 10) ;}if(opf[i] == 3) {(xf[i] , yf[i] , 40 , 40) ;(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 5 , 10 , 10) ; (xf[i] - 5 , yf[i] + 15 , 10 , 10) ; (xf[i] - 5 , yf[i] + 25 , 10 , 10) ; (xf[i] - 5 , yf[i] + 35 , 10 , 10) ;(xf[i] + 35 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 5 , 10 , 10) ; (xf[i] + 35 , yf[i] + 15 , 10 , 10) ; (xf[i] + 35 , yf[i] + 25 , 10 , 10) ; (xf[i] + 35 , yf[i] + 35 , 10 , 10) ;(xf[i] + 15 , yf[i] + 20 , 10 , 40) ;(xf[i] + 5 , yf[i] , 10 , 10) ;(xf[i] + 25 , yf[i] , 10 , 10) ;}if(opf[i] == 4) {(xf[i] , yf[i] , 40 , 40) ;(xf[i] - 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 5 , yf[i] - 5 , 10 , 10) ; (xf[i] + 15 , yf[i] - 5 , 10 , 10) ; (xf[i] + 25 , yf[i] - 5 , 10 , 10) ; (xf[i] + 35 , yf[i] - 5 , 10 , 10) ;(xf[i] - 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 5 , yf[i] + 35 , 10 , 10) ; (xf[i] + 15 , yf[i] + 35 , 10 , 10) ; (xf[i] + 25 , yf[i] + 35 , 10 , 10) ;(xf[i] + 35 , yf[i] + 35 , 10 , 10) ;(xf[i] - 20 , yf[i] + 15 , 40 , 10) ; (xf[i] + 30 , yf[i] + 5 , 10 , 10) ; (xf[i] + 30 , yf[i] + 25 , 10 , 10) ; }(dxf1[i] , dyf1[i] , 10 , 10 ) ; (dxf2[i] , dyf2[i] , 10 , 10 ) ; (dxf3[i] , dyf3[i] , 10 , 10 ) ; (dxf4[i] , dyf4[i] , 10 , 10 ) ;}}public void keyTyped(KeyEvent e) {}//键盘控制坦克的移动,发弹public void keyPressed(KeyEvent e) { color ++ ;if() == {op = 1 ;y = y - tankspeed ;dy = dy - tankspeed ;if(y <= 0) {y = y + tankspeed ;dy = dy + tankspeed ;}}if() == {op = 2 ;x = x + tankspeed ;dx = dx + tankspeed ;if(x >= 560) {x = x - tankspeed ;dx = dx - tankspeed ;}}if() == {op = 3 ;y = y + tankspeed ;dy = dy + tankspeed ;if(y >= 560) {y = y - tankspeed ;dy = dy - tankspeed ;}}if() == {op = 4 ;x = x - tankspeed ;dx = dx - tankspeed ;if(x <= 0) {x = x + tankspeed ;dx = dx + tankspeed ;}}if() == {if(op == 1) {dx1 = dx ; dy1 = dy ;}if(op == 2) {dx2 = dx ; dy2 = dy ;}if(op == 3) {dx3 = dx ; dy3 = dy ;}if(op == 4) {dx4 = dx ; dy4 = dy ;}}() ;}public void keyReleased(KeyEvent e) { }public void run() {for (int a = 0; a<60000; a++) {dy1 = dy1 - tankbullet ;dx2 = dx2 + tankbullet ;dy3 = dy3 + tankbullet ;dx4 = dx4 - tankbullet ;for (int i = 0; i<num; i++) {dyf1[i] = dyf1[i] - tankfbullet ;dxf2[i] = dxf2[i] + tankfbullet ;dyf3[i] = dyf3[i] + tankfbullet ;dxf4[i] = dxf4[i] - tankfbullet ;}//判断是否被击中for (int i = 0; i<num; i++) {if(dyf1[i]<y + 38 &&dyf1[i]>y +8 && dxf1[i]-x>-10 && dxf1[i]-x<40) { ("被1击中") ;dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf2[i]>x+2 &&dxf2[i]<x+32 &&dyf2[i] - y >-10 && dyf2[i] - y <40 ) {("被2击中") ;dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ;shengming = shengming - nandu ;}if(dyf3[i]>y+2 && dyf3[i]< y+32 && dxf3[i]-x >-10&& dxf3[i]-x<40) { ("被3击中") ;dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ;shengming = shengming - nandu ;}if(dxf4[i]>x+8 &&dxf4[i]<x+38 &&dyf4[i] - y >-10 && dyf4[i] - y <40 ) {("被4击中") ;dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ;shengming = shengming - nandu ;}}//判断是否击中敌军for (int i = 0; i<num; i++) {if(dy1<yf[i] + 38 &&dy1>yf[i] +8 && dx1-xf[i]>-10 && dx1-xf[i]<40) { ("1击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dx2>xf[i]+2 &&dx2<xf[i]+32 &&dy2 - yf[i] >-10 && dy2 - yf[i] <40 ) {("2击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dy3>yf[i]+2 && dy3< yf[i]+32 && dx3-xf[i] >-10&& dx3-xf[i]<40) { ("3击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}if(dx4>xf[i]+8 &&dx4<xf[i]+38 &&dy4 - yf[i] >-10 && dy4 - yf[i] <40 ) {("4击中") ;fenshu = fenshu + 100 ;xf[i] = (int)() * 560 );yf[i] = (int)() * 560 );}dxf[i] = xf[i] + 15 ;dyf[i] = yf[i] + 15 ;}//坦克的移动for (int i = 0; i<num; i++) {switch (opf[i]) {case 1:{yf[i]-- ;dyf[i] -- ;for (int s = 0; s<num; s++) {if(yf[i] <= 0) {yf[i] ++ ;dyf[i] ++ ;}}break;}case 2:{xf[i]++ ;dxf[i]++ ;for (int s = 0; s<num; s++) { if(xf[i] >= 560){xf[i] -- ;dxf[i] -- ;}}break;}case 3:{yf[i]++ ;dyf[i]++ ;for (int s = 0; s<num ; s++) { if(yf[i] >= 560){yf[i] -- ;dyf[i] -- ;}}break;}case 4:{xf[i]-- ;dxf[i]-- ;for (int s = 0; s<num; s++) { if(xf[i] <= 0){xf[i] ++ ;dxf[i] ++ ;}}break;}}}try{(20) ;}catch(Exception e) {() ;}//坦克的开火if(a % 50 == 5) {if()>{for (int i = 0; i<2; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 15) {if()> {for (int i = 2; i<4; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}if(a % 50 == 25) {if()>{for (int i = 4; i<6; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 35) {if()>{for (int i = 6; i<8; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}if(a % 50 == 45) {if()> {for (int i = 8; i<10; i++) {if(opf[i] == 1) {dxf1[i] = dxf[i] ; dyf1[i] = dyf[i] ; }if(opf[i] == 2) {dxf2[i] = dxf[i] ; dyf2[i] = dyf[i] ; }if(opf[i] == 3) {dxf3[i] = dxf[i] ; dyf3[i] = dyf[i] ; }if(opf[i] == 4) {dxf4[i] = dxf[i] ; dyf4[i] = dyf[i] ; }}}}//坦克的随机移动if(a % 50 == 1 ) {for (int i = 0; i<2; i++) {if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 11 ) {//坦克的随机移动for (int i = 2; i<4; i++) {if( () > ) {if() > {}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 21 ) {//坦克的随机移动for (int i = 4; i<6; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}if(a % 50 == 31 ) {//坦克的随机移动for (int i = 6; i<8; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {}else{opf[i] = 4 ;}}}}if(a % 50 == 41 ) {//坦克的随机移动for (int i = 8; i<10; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{opf[i] = 4 ;}}}}//重画if(shengming<=0){//弹出player1胜利对话框(null,"你结束了!!!","Game Over !", ;//结束游戏(0) ;}() ;}}}。
C++实例编程:简单坦克大战_C/C++_IT哇咔_IT技术爱好者之家

}
}
void DrawAmy(int x,int y,int i)/*画敌人*/
{
if(amy[i].color==12)
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);
setcolor(12);
else if(amy[i].color==13)
setcolor(13);
else/*这里是判断三种颜色的坦克*/
setcolor(14);
circle(100+x*20,50+y*20,7);
坦克大战源代码

/**坦克大战*/package com.tankgame1;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.util.*;public class TankGame1_0 extends JFrame implements KeyListener,ActionListener{ GamePanel gp;StartPanel sp;JMenuBar jmb=null;JMenu jm=null,jm1=null;JMenuItem jmi1,jmi2,jmi3,jmi4;TankGame1_0(){jmb=new JMenuBar();jm=new JMenu("文件");jm1=new JMenu("游戏设置");jmi1=new JMenuItem("新游戏");jmi1.setActionCommand("NEW");jmi1.addActionListener(this);jmi2=new JMenuItem("暂停");jmi2.setActionCommand("PAUSE");jmi2.addActionListener(this);jmi3=new JMenuItem("继续");jmi3.setActionCommand("CONTINUE");jmi3.addActionListener(this);jmi4=new JMenuItem("退出");jmi4.setActionCommand("QUIT");jmi4.addActionListener(this);jm.add(jmi1);jm.add(jmi2);jm.add(jmi3);jm.add(jmi4);jmb.add(jm);jmb.add(jm1);// gp=new GamePanel();// Thread t=new Thread(gp);// t.start();// //注册一下接收键盘的动作// this.addKeyListener(this);// //设置界面// this.add(gp);sp=new StartPanel();Thread t=new Thread(sp);t.start();this.add(sp);this.setJMenuBar(jmb);this.setBounds(180, 20, 305, 530);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }public static void main(String[] args) {TankGame1_0 tg=new TankGame1_0();}@Overridepublic void keyPressed(KeyEvent arg0) {if(!Record.pause){switch(arg0.getKeyCode()){case KeyEvent.VK_UP:if(!gp.mtk.isTouchTank()&&!gp.mtk.isTouchRiver())gp.mtk.moveUp();gp.mtk.setDirect(0);break;case KeyEvent.VK_DOWN:if(!gp.mtk.isTouchTank()&&!gp.mtk.isTouchRiver())gp.mtk.moveDown();gp.mtk.setDirect(2);break;case KeyEvent.VK_LEFT:if(!gp.mtk.isTouchTank()&&!gp.mtk.isTouchRiver())gp.mtk.moveLeft();gp.mtk.setDirect(3);break;case KeyEvent.VK_RIGHT:if(!gp.mtk.isTouchTank()&&!gp.mtk.isTouchRiver())gp.mtk.moveRight();gp.mtk.setDirect(1);break;}if(arg0.getKeyCode()=='A'||arg0.getKeyCode()=='a'){ gp.mtk.kitEnemy();}gp.repaint();}}@Overridepublic void keyReleased(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void keyTyped(KeyEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void actionPerformed(ActionEvent arg0) {if(arg0.getActionCommand().equals("NEW")){this.remove(sp);gp=new GamePanel();Thread t=new Thread(gp);t.start();//注册一下接收键盘的动作this.addKeyListener(this);//设置界面this.add(gp);this.setVisible(true);}if(arg0.getActionCommand().equals("PAUSE")){Record.pause=true;}if(arg0.getActionCommand().equals("CONTINUE")){ Record.pause=false;}if(arg0.getActionCommand().equals("QUIT")){System.exit(0);}}}class GamePanel extends JPanel implements Runnable{//定义的我的坦克MyTank mtk;River river=new River(50,300,200,30);Vector<SoilWall> sw=new V ector<SoilWall>();SoilWall s=null;Vector<SteelWall> stw=new Vector<SteelWall>();SteelWall st=null;Image im1=null;Image im2=null;Image im3=null;Image im4=null;Image im5=null;Vector<Bomb> bb=new Vector<Bomb>();//定义敌人的坦克int drtssize=4;Vector<EnemyTank> drts;EnemyTank dt=null;GamePanel(){//初始化爆炸的图片im1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_1.gif"));im2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_2.gif"));im3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bomb_3.gif"));im4=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img2.jpg"));im5=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/img1.jpg"));//土墙的初始化for(int i=5;i<24;i++,i++){s=new SoilWall(i*10,120);sw.add(s);}//钢墙的初始化for(int i=5;i<24;i++,i++){st=new SteelWall(i*10,200);stw.add(st);}//我的坦克初始化mtk=new MyTank(135,350,0,0);mtk.setStw(stw);mtk.setSw(sw);//敌人的坦克初始化drts=new Vector<EnemyTank>();for(int i=0;i<this.drtssize;i++){EnemyTank dt=new EnemyTank((i+1)*50,10,2,1);EnemyTank dt1=new EnemyTank((i+1)*50,60,2,1);Thread t=new Thread(dt);Thread t1=new Thread(dt1);t.start();t1.start();dt.setEts(drts);dt1.setEts(drts);dt.setR(river);dt1.setR(river);dt.setSw(sw);dt.setStw(stw);mtk.setEts(drts);mtk.setR(river);drts.add(dt);drts.add(dt1);}}public void paint(Graphics g){super.paint(g);//游戏的操作背景色g.setColor(Color.BLACK);//g.fillRect(0, 0, 300, 400);g.drawImage(im4, 0, 0, 300, 400,this);//让tank接收到panel上的对象mtk.setEts(drts);if(river!=null)mtk.setR(river);//画出河流if(river!=null)g.drawImage(im5, river.x, river.y, river.x1, river.y1, this); //画出墙来g.setColor(Color.yellow);for(int i=0;i<sw.size();i++){s=sw.get(i);if(s.isLive)g.fill3DRect(s.x, s.y, 15, 20, true);elsesw.remove(s);}g.setColor(Color.WHITE);for(int i=0;i<stw.size();i++){st=stw.get(i);if(st.isLive)g.fill3DRect(st.x, st.y, 15, 20, true);elsestw.remove(st);}//画出炸弹for(int i=0;i<bb.size();i++){Bomb bomb=bb.get(i);if(bomb.isLive==true){bomb.times--;if(bomb.times>14)g.drawImage(im1, bomb.x, bomb.y, 30, 30,this);else if(bomb.times>7)g.drawImage(im2, bomb.x, bomb.y, 30, 30,this);else if(bomb.times>0)g.drawImage(im3, bomb.x, bomb.y, 30, 30,this);}if(bomb.times==0){bomb.isLive=false;bb.remove(bomb);}}//画我的坦克if(Record.MyLife>0)drawTank(mtk.getX(),mtk.getY(),mtk.getDirect(),0,g);if(mtk.isLive==false){Record.MyLife--;mtk=new MyTank(135,350,0,0);mtk.setSw(sw);mtk.setStw(stw);}//画我的坦克的子弹g.setColor(Color.white);for(int i=0;i<mtk.bs.size();i++){Bullet b=mtk.bs.get(i);if(b!=null&&b.isLive==true)g.drawOval(b.getX(), b.getY(), 2, 2);if(b.isLive==false)mtk.bs.remove(b);}//画出敌人的坦克for(int i=0;i<drts.size();i++){EnemyTank dt=drts.get(i);if(dt.isLive==true && dt!=null)drawTank(dt.getX(),dt.getY(),dt.getDirect(),dt.getType(),g);if(dt.isLive==false){drts.remove(dt);Record.EnemyLife--;if(Record.EnemyLife>7){dt=new EnemyTank(120,10,2,1);dt.setSw(sw);dt.setStw(stw);Thread t=new Thread(dt);t.start();drts.add(dt);}}}//画出敌人的坦克的子弹g.setColor(Color.white);for(int i=0;i<drts.size();i++){EnemyTank dt=drts.get(i);if(dt.isLive==true)for(int j=0;j<dt.bs.size();j++){Bullet b=dt.bs.get(j);if(b.isLive)g.drawOval(b.getX(), b.getY(), 2, 2);if(b.isLive==false)dt.bs.remove(b);}}//显示游戏结束画面if(Record.EnemyLife<=0||Record.MyLife<=0){g.setColor(Color.YELLOW);g.setFont(new Font("宋体",Font.BOLD,20));g.drawString("GAME OVER!", 100, 100);Record.pause=true;}//显示游戏中的各种提示信息showInfo(g);}//显示信息的方法public void showInfo(Graphics g){Color c=null;c=g.getColor();this.drawTank(50, 420, 0, 0, g);this.drawTank(150, 420, 0, 1, g);g.setColor(Color.BLACK);g.setFont(new Font("黑体",Font.BOLD,20));g.drawString(Record.MyLife+"", 80, 435);g.drawString(Record.EnemyLife+"", 185, 435);g.setColor(c);}//用于绘制坦克public void drawTank(int x,int y,int direct,int type,Graphics g){ switch(type){case 0:g.setColor(Color.YELLOW);break;case 1:g.setColor(Color.green);break;}switch(direct){case 0:g.fill3DRect(x, y, 5, 30, false);g.draw3DRect(x+5, y+5, 10, 20, true);g.fill3DRect(x+15, y, 5, 30, false);g.fillOval(x+7, y+8, 6, 13);g.drawRect(x+10, y-4, 1, 17);break;case 2:g.fill3DRect(x, y, 5, 30, false);g.draw3DRect(x+5, y+5, 10, 20, true);g.fill3DRect(x+15, y, 5, 30, false);g.fillOval(x+7, y+8, 6, 13);g.drawRect(x+10, y+13, 1, 17);break;case 1:g.fill3DRect(x, y, 30, 5, false);g.draw3DRect(x+5, y+5, 20, 10, true);g.fill3DRect(x, y+15, 30, 5, false);g.fillOval(x+9, y+7, 13, 6);g.drawRect(x+15, y+9, 17, 1);break;case 3:g.fill3DRect(x, y, 30, 5, false);g.draw3DRect(x+5, y+5, 20, 10, true);g.fill3DRect(x, y+15, 30, 5, false);g.fillOval(x+9, y+7, 13, 6);g.drawRect(x-2, y+9, 17, 1);break;}}public void kill(Tank t,Bullet b){switch(t.direct){case 0:case 2:if(b.x>t.x&&b.y>t.y&&b.x<t.x+20&&b.y<t.y+30) {t.isLive=false;b.isLive=false;this.bb.add(new Bomb(t.getX(),t.getY()));}break;case 1:case 3:if(b.x>t.x&&b.y>t.y&&b.x<t.x+30&&b.y<t.y+20) {t.isLive=false;b.isLive=false;this.bb.add(new Bomb(t.getX(),t.getY()));}break;}}public void killWall(Wall w,Bullet b){if(b.x>=w.x&&b.y>=w.y&&b.x<=w.x+15&&b.y<=w.y+20) {w.life--;b.isLive=false;if(w.life<=0)w.isLive=false;}}@Overridepublic void run() {while(true){this.repaint();try {Thread.sleep(10);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if(mtk!=null)for(int i=0;i<mtk.bs.size();i++){Bullet b=mtk.bs.get(i);if(b.isLive){for(int j=0;j<drts.size();j++){Tank t=drts.get(j);if(t.isLive){this.kill(t, b);}}}}for(int i=0;i<drts.size();i++){Tank et=drts.get(i);if(et.isLive){for(int j=0;j<et.bs.size();j++){Bullet b=et.bs.get(j);if(b.isLive&&b!=null){this.kill(mtk, b);}}}}for(int i=0;i<drts.size();i++){Tank et=drts.get(i);if(et.isLive){for(int j=0;j<et.bs.size();j++){Bullet b=et.bs.get(j);for(int k=0;k<sw.size();k++){SoilWall t=sw.get(k);if(t.isLive){this.killWall(t, b);}}for(int k=0;k<stw.size();k++){SteelWall t=stw.get(k);if(t.isLive){this.killWall(t, b);}}}}}for(int i=0;i<mtk.bs.size();i++){Bullet b=mtk.bs.get(i);if(b.isLive){for(int j=0;j<sw.size();j++){SoilWall t=sw.get(j);if(t.isLive){this.killWall(t, b);}}for(int j=0;j<stw.size();j++){SteelWall t=stw.get(j);if(t.isLive){this.killWall(t, b);}}}}}}}//游戏开始界面class StartPanel extends JPanel implements Runnable{ boolean f=true;public void paint(Graphics g){super.paint(g);g.setColor(Color.RED);g.setFont(new Font("宋体",Font.BOLD,30));if(f){g.drawString("请选择菜单", 60, 150);f=false;}elsef=true;}@Overridepublic void run() {while(true){try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.repaint();}}}//坦克类class Tank{int x;int y;int direct;int type;int speed;boolean isLive=true;Vector<SoilWall> sw=new V ector<SoilWall>();public Vector<SoilWall> getSw() {return sw;}public void setSw(Vector<SoilWall> sw) {this.sw = sw;}public SoilWall getS() {return s;}public void setS(SoilWall s) {this.s = s;}public Vector<SteelWall> getStw() {return stw;}public void setStw(Vector<SteelWall> stw) {this.stw = stw;}public SteelWall getSt() {return st;}public void setSt(SteelWall st) {this.st = st;}SoilWall s=null;Vector<SteelWall> stw=new Vector<SteelWall>(); SteelWall st=null;Vector<EnemyTank> ets=new Vector<EnemyTank>(); River r=null;public boolean isLive() {return isLive;}public void setLive(boolean isLive) {this.isLive = isLive;}public River getR() {return r;}public void setR(River r) {this.r = r;}public Vector<Bullet> getBs() {return bs;}public void setBs(Vector<Bullet> bs) {this.bs = bs;}public Bullet getB() {return b;}public void setB(Bullet b) {this.b = b;}public Vector<EnemyTank> getEts() {return ets;}public void setEts(Vector<EnemyTank> ets) { this.ets = ets;}Vector<Bullet> bs=new V ector<Bullet>(); Bullet b;public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public int getType() {return type;}public void setType(int type) {this.type = type;}public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}Tank(int x,int y,int direct,int type){this.direct=direct;this.x=x;this.y=y;this.type=type;}public void moveUp(){if(!Record.pause){if(y>=0&&!this.isTouchRiver()&&!this.isTouchWall()) y=y-speed;if(isTouchRiver())y=y+speed;}}public void moveDown(){if(!Record.pause){if(y<=370&&!this.isTouchRiver()&&!this.isTouchWall()) y=y+speed;if(isTouchRiver())y=y-speed;}}public void moveLeft(){if(!Record.pause){if(x>=0&&!this.isTouchRiver()&&!this.isTouchWall()) x=x-speed;if(isTouchRiver())x=x+speed;}}public void moveRight(){if(!Record.pause){if(x<=270&&!this.isTouchRiver()&&!this.isTouchWall()) x=x+speed;if(isTouchRiver())x=x-speed;}}public void kitEnemy(){switch(this.direct){case 0:b=new Bullet(this.x+9,this.y-6,0);break;case 1:b=new Bullet(this.x+31,this.y+8,1);break;case 2:b=new Bullet(this.x+9,this.y+31,2);break;case 3:b=new Bullet(this.x-4,this.y+8,3);break;}if(bs.size()<5){bs.add(b);Thread t=new Thread(b);t.start();}}public boolean isTouchWall(){boolean f=false;switch(this.direct){case 0:case 2:for(int i=0;i<sw.size();i++){s=sw.get(i);if(this.x>=s.x&&this.y>=s.y&&this.x<=s.x+15&&this.y<=s.y+20)f=true;if(this.x+20>=s.x&&this.y>=s.y&&this.x+20<=s.x+15&&this.y<=s.y+20) f=true;if(this.x>=s.x&&this.y+30>=s.y&&this.x<=s.x+15&&this.y+30<=s.y+20) f=true;if(this.x+20>=s.x&&this.y+30>=s.y&&this.x+20<=s.x+15&&this.y+30<=s.y+20)f=true;if(this.x+5>=s.x&&this.y>=s.y&&this.x+5<=s.x+15&&this.y<=s.y+20) f=true;if(this.x+5>=s.x&&this.y+20>=s.y&&this.x+5<=s.x+15&&this.y+20<=s.y+20)f=true;}if(this.direct==0&&f)this.y=this.y+this.speed;if(this.direct==2&&f)this.y=this.y-this.speed;for(int i=0;i<stw.size();i++){st=stw.get(i);if(this.x>=st.x&&this.y>=st.y&&this.x<=st.x+15&&this.y<=st.y+20)f=true;if(this.x+20>=st.x&&this.y>=st.y&&this.x+20<=st.x+15&&this.y<=st.y+20) f=true;if(this.x>=st.x&&this.y+30>=st.y&&this.x<=st.x+15&&this.y+30<=st.y+20) f=true;if(this.x+20>=st.x&&this.y+30>=st.y&&this.x+20<=st.x+15&&this.y+30<=st.y+20)f=true;if(this.x+5>=st.x&&this.y>=st.y&&this.x+5<=st.x+15&&this.y<=st.y+20) f=true;if(this.x+5>=st.x&&this.y+20>=st.y&&this.x+5<=st.x+15&&this.y+20<=st.y+20)f=true;}if(this.direct==0&&f)this.y=this.y+this.speed;if(this.direct==2&&f)this.y=this.y-this.speed;break;case 1:case 3:for(int i=0;i<sw.size();i++){s=sw.get(i);if(this.x>=s.x&&this.y>=s.y&&this.x<=s.x+15&&this.y<=s.y+20)f=true;if(this.x+30>=s.x&&this.y>=s.y&&this.x+30<=s.x+15&&this.y<=s.y+20) f=true;if(this.x>=s.x&&this.y+20>=s.y&&this.x<=s.x+15&&this.y+20<=s.y+20) f=true;if(this.x+30>=s.x&&this.y+20>=s.y&&this.x+30<=s.x+15&&this.y+20<=s.y+20)f=true;if(this.x>=s.x&&this.y+10>=s.y&&this.x<=s.x+15&&this.y+10<=s.y+20) f=true;if(this.x+30>=s.x&&this.y+10>=s.y&&this.x+30<=s.x+15&&this.y+10<=s.y+20)f=true;}if(this.direct==1&&f)this.x=this.x-this.speed;if(this.direct==3&&f)this.x=this.x+this.speed;for(int i=0;i<stw.size();i++){st=stw.get(i);if(this.x>=st.x&&this.y>=st.y&&this.x<=st.x+15&&this.y<=st.y+20)f=true;if(this.x+30>=st.x&&this.y>=st.y&&this.x+30<=st.x+15&&this.y<=st.y+20) f=true;if(this.x>=st.x&&this.y+20>=st.y&&this.x<=st.x+15&&this.y+20<=st.y+20) f=true;if(this.x+30>=st.x&&this.y+20>=st.y&&this.x+30<=st.x+15&&this.y+20<=st.y+20)f=true;if(this.x>=st.x&&this.y+10>=st.y&&this.x<=st.x+15&&this.y+10<=st.y+20) f=true;if(this.x+30>=st.x&&this.y+10>=st.y&&this.x+30<=st.x+15&&this.y+10<=st.y+20)f=true;}if(this.direct==1&&f)this.x=this.x-this.speed;if(this.direct==3&&f)this.x=this.x+this.speed;break;}return f;}public boolean isTouchTank(){boolean f=false;for(int i=0;i<ets.size();i++){EnemyTank et=ets.get(i);if(et!=this){switch(this.direct){case 0:if(et.direct==0||et.direct==2){if(this.x>=et.x&&this.y>=et.y&&this.x<=et.x+20&&this.y<=et.y+30)f=true;if(this.x+20>=et.x&&this.y>=et.y&&this.x+20<=et.x+20&&this.y<=et.y+30)f=true;}if(et.direct==1||et.direct==3){if(this.x>=et.x&&this.y>=et.y&&this.x<=et.x+30&&this.y<=et.y+20)f=true;if(this.x+20>=et.x&&this.y>=et.y&&this.x+20<=et.x+30&&this.y<=et.y+20)f=true;}break;case 1:if(et.direct==0||et.direct==2){if(this.x+30>=et.x&&this.y>=et.y&&this.x+30<=et.x+20&&this.y<=et.y+30)f=true;if(this.x+30>=et.x&&this.y+20>=et.y&&this.x+30<=et.x+20&&this.y+20<=et.y+30)f=true;}if(et.direct==1||et.direct==3){if(this.x+30>=et.x&&this.y>=et.y&&this.x+30<=et.x+30&&this.y<=et.y+20)f=true;if(this.x+30>=et.x&&this.y+20>=et.y&&this.x+30<=et.x+30&&this.y+20<=et.y+20)f=true;}break;case 2:if(et.direct==0||et.direct==2){if(this.x>=et.x&&this.y+30>=et.y&&this.x<=et.x+20&&this.y<=et.y+30){f=true;}if(this.x+20>=et.x&&this.y+30>=et.y&&this.x+20<=et.x+20&&this.y+30<=et.y+30){f=true;}}if(et.direct==1||et.direct==3){if(this.x>=et.x&&this.y+30>=et.y&&this.x<=et.x+30&&this.y<=et.y+20){f=true;}if(this.x+20>=et.x&&this.y+30>=et.y&&this.x+20<=et.x+30&&this.y+30<=et.y+20){f=true;}}break;case 3:if(et.direct==0||et.direct==2){if(this.x>=et.x&&this.y>=et.y&&this.x<=et.x+20&&this.y<=et.y+30)f=true;if(this.x>=et.x&&this.y+20>=et.y&&this.x<=et.x+20&&this.y+20<=et.y+30)f=true;}if(et.direct==1||et.direct==3){if(this.x>=et.x&&this.y>=et.y&&this.x<=et.x+30&&this.y<=et.y+20)f=true;if(this.x>=et.x&&this.y+20>=et.y&&this.x<=et.x+30&&this.y+20<=et.y+20)f=true;}break;}}}return f;}public boolean isTouchRiver(){boolean f=false;if(this.r!=null)switch(this.direct){case 0:case 2:if(this.x>=r.x&&this.y>=r.y&&this.x<=r.x+r.x1&&this.y<=r.y+r.y1)f=true;if(this.x+20>=r.x&&this.y>=r.y&&this.x+20<=r.x+r.x1&&this.y<=r.y+r.y1) f=true;if(this.x>=r.x&&this.y+30>=r.y&&this.x<=r.x+r.x1&&this.y+30<=r.y+r.y1) f=true;if(this.x+20>=r.x&&this.y+30>=r.y&&this.x+20<=r.x+r.x1&&this.y+30<=r.y+r.y1)f=true;if(this.direct==0&&f)this.y=this.y+this.speed;if(this.direct==2&&f)this.y=this.y-this.speed;break;case 1:case 3:if(this.x>=r.x&&this.y>=r.y&&this.x<=r.x+r.x1&&this.y<=r.y+r.y1)f=true;if(this.x+30>=r.x&&this.y>=r.y&&this.x+30<=r.x+r.x1&&this.y<=r.y+r.y1) f=true;if(this.x>=r.x&&this.y+20>=r.y&&this.x<=r.x+r.x1&&this.y+20<=r.y+r.y1) f=true;if(this.x+30>=r.x&&this.y+20>=r.y&&this.x+30<=r.x+r.x1&&this.y+20<=r.y+r.y1) f=true;if(this.direct==1&&f)this.x=this.x-this.speed;if(this.direct==3&&f)this.x=this.x+this.speed;break;}return f;}}//我的坦克类class MyTank extends Tank{MyTank(int x,int y,int direct,int type){super(x,y,direct,type);this.setDirect(0);this.setType(0);this.setSpeed(5);}}//敌人的坦克类class EnemyTank extends Tank implements Runnable{EnemyTank(int x,int y,int direct,int type){super(x,y,direct,type);this.setDirect(2);this.setType(1);this.setSpeed(5);}@Overridepublic void run() {while(true){while(Record.pause){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}this.direct=(int)(Math.random()*4);this.kitEnemy();switch(this.direct){case 0:if(!this.isTouchTank()&&!this.isTouchRiver()&&!this.isTouchWall())for(int i=0;i<=15;i++){this.moveUp();try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 1:if(!this.isTouchTank()&&!this.isTouchRiver()&&!this.isTouchWall())for(int i=0;i<=15;i++){if(!this.isTouchTank()&&!this.isTouchRiver()&&!this.isTouchWall())this.moveRight();try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 2:if(!this.isTouchTank()&&!this.isTouchRiver()&&!this.isTouchWall())for(int i=0;i<=15;i++){if(!this.isTouchTank()&&!this.isTouchRiver()&&!this.isTouchWall())this.moveDown();try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;case 3:if(!this.isTouchTank()&&!this.isTouchRiver()&&!this.isTouchWall())for(int i=0;i<=15;i++){if(!this.isTouchTank()&&!this.isTouchRiver()&&!this.isTouchWall())this.moveLeft();try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;}}}}class Bullet implements Runnable{int x;boolean isLive=true;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}int y;int direct;int speed=10;public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public Bullet(int x,int y,int direct){this.x=x;this.y=y;this.direct=direct;}@Overridepublic void run() {while(true){while(Record.pause){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}switch(this.direct){case 0:y=y-speed;try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case 1:x=x+speed;try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case 2:y=y+speed;try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;case 3:x=x-speed;try {Thread.sleep(50);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}break;}if(x<-5||y<-5||x>300||y>400){this.isLive=false;break;}}}}//爆炸类class Bomb{int x;int y;int times=24;boolean isLive=true;Bomb(int x,int y){this.x=x;this.y=y;}}class Record{static int MyLife=3;static int EnemyLife=20;static boolean pause=false;}class River{int x,x1;int y,y1;River(int x,int y,int x1,int y1){this.x=x;this.y=y;this.x1=x1;this.y1=y1;}}class Wall{int x;int y;boolean isLive=true;int life=1;Wall(int x,int y){this.x=x;this.y=y;}}class SoilWall extends Wall{SoilWall(int x,int y){super(x, y);life=1;}}class SteelWall extends Wall{SteelWall(int x,int y){super(x,y);life=3;}}。
c语言坦克大战源代码

c语言坦克大战源代码/*游戏的整体思路大概是这样的?首先是欢迎界面,然后进入游戏界面,最后是gameover的界面。
本来打算做单人游戏,后来发现让敌人自主移动比较困难,所以改成了双人游戏?layer1控制按键是up,down,left,right,enter,player2控制按键是a,s,d,w,space。
*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<graphics.h>/*定义鼠标键值常量*/#define ESC 0x011b/*玩家1坦克按键*/#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define ENTER 0x1c0d#define up 0x1177/*玩家2坦克按键*/#define down 0x1f73#define left 0x1e61#define right 0x2064#define fire 0x246a/*定义游戏常量*//*双人游戏*/#define NUM 2/*坦克宽度*/#define WIDTH 20/*坦克的数量,宽度*//*定义global变量*******************************************//*子弹的属性*/struct myboom{/*如果子弹life为0则代表子弹没有发射*/int life;int x,y;int direction;};/*子弹们的初始属性*/struct myboom iboom[NUM]={{0},{0}};/*坦克的属性*/struct mytank{int life;int x,y;int direction;};/*坦克们的初始属性*/struct mytank itank[NUM]={{3,10*WIDTH,22*WIDTH},{1,440,40}};pre[NUM][2]={{10*WIDTH,22*WIDTH},{440,40}};/*xy[0]代表自己的坦克; xy[1]及以后代表敌军; 坦克坐标*//*存被子弹覆盖的图像*/void *boom_save[NUM];/*malloc开辟图像空间的大小*/int size;/*动画显示*/void *save[NUM];/*后来加上的。
坦克大战游戏编程实现

坦克大战游戏编程实现游戏编程实现坦克大战坦克大战是一款经典的电子游戏,在游戏中,玩家将控制一个坦克,通过操作坦克的移动和攻击,与其他玩家或电脑进行战斗。
本文将介绍如何使用编程语言实现坦克大战游戏。
设计思路在实现坦克大战游戏之前,首先需要明确游戏的基本要素和规则。
玩家将操作一个坦克,通过键盘或操纵杆控制坦克的移动和攻击。
游戏画面由地图、坦克、子弹等元素构成。
坦克可以向前、向后、向左、向右移动,可以发射子弹进行攻击。
玩家需要躲避敌方坦克的攻击,同时尽可能击败敌方坦克。
编程实现坦克的移动和攻击可以通过编程语言来实现。
以下是使用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的主窗口,并在窗口中添加了一个玩家坦克、敌方坦克和子弹的列表。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<iostream>#include<stdlib.h>#include<windows.h>#include<time.h>#include<conio.h>using namespace std;HANDLE Mutex=CreateMutex(NULL,FALSE,NULL);//互斥对象int GameOver=0;int level=0;int map[23][23];//坦克种类,Normal为玩家坦克#define Normal 0#define Red 1#define Blue 2#define Green 3//方向的宏定义#define Up 0#define Down 1#define Left 2#define Right 3//地图标记的宏定义#define Empty 0#define Player 1#define PlayerBullet 2#define EnemyBullet 3#define Enemy 4int Kill;int KillRed;int KillGreen;int EnemyExist;void SetPos(int i,int j)//设定光标位置{COORD pos={i,j};HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(Out, pos);}void HideCurSor(void)//隐藏光标{CONSOLE_CURSOR_INFO info={1,0};HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(Out,&info);}int sharp[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},};//此数组用来保存坦克各个方向的形状信息DWORD WINAPI Bulletfly(LPVOID lpParameter);//子弹函数申明void Updata();//更新界面信息函数申明class Tank//坦克类{private:int Direction;//方向int hotpoint[2];//活动点int Speed;//速度int FirePower;//火力public:Tank(int dir,int hot1,int hot2,int typ,int spe,int firepow)//构造函数{Direction=dir;hotpoint[0]=hot1;hotpoint[1]=hot2;Type=typ;Speed=spe;FirePower=firepow;}int Type;//坦克的种类(详见宏定义)int ID;//坦克在MAP中的标记(详见宏定义)int FireEnable;//是否可以开火int Life;//生命值void Running();//运行函数int Judge(int x,int y,int ID);//判断是否可以绘制坦克void DrawTank();//重绘坦克void Redraw();//擦除坦克int GetSpeed()//获取速度{return Speed;}int GetFire()//获取火力{return FirePower;}int GetDirection()//获取方向{return Direction;}int GetHotX()//获取活动点坐标{return hotpoint[0];}int GetHotY(){return hotpoint[1];}void IncreaseFire()//火力+{FirePower++;}void IncreaseSpeed()//速度+{Speed++;}void ChangeDirection(int newD)//改变方向{Direction=newD;}void ChangePos(int x,int y)//改变活动点{hotpoint[0]=x;hotpoint[1]=y;}};Tank player(Right,0,0,Normal,1,1);//玩家Tank enemy(Left,20,0,Red,1,1);//敌人void Tank::DrawTank()//绘制坦克{int i;int nx,ny;if(Type==Red)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTE NSITY| FOREGROUND_RED);else if(Type==Blue)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTE NSITY| FOREGROUND_BLUE);else if(Type==Green)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTE NSITY| FOREGROUND_GREEN);else if(Type==Normal)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTE NSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_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<<"■";}}void Tank::Redraw()//擦除坦克,原理同上{int i;int nx,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<<" ";}}int Tank::Judge(int x,int y,int dir)//判断当前是否可以绘制坦克{int i;int nx,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)//不能绘制,返回1return 1;}return 0;}void Tank::Running()//坦克运行函数{int newD;//坦克的运行while(1){if(Life==0){EnemyExist=0;//敌人不存在return;}if(GameOver==1)return;if(FireEnable==1&&GameOver==0)//如果可以开火{WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象FireEnable=0;//设为不可开火HANDLE bullet=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;}}else if(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;}}else if(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;}}else if(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);}}/*********************子弹线程函数*******************/ DWORD WINAPI Bulletfly(LPVOID lpParameter){int *ID=(int *)lpParameter;//ID用来获取发射子弹坦克的IDint Pos[2];//子弹活动点int direction;int Speed;int type;int hit=0;//击中标记int oldx,oldy;//旧活动点int flag=0;//子弹是否有移动的标记if(*ID==Player)//如果是玩家坦克{type=PlayerBullet;direction=player.GetDirection();Speed=player.GetFire();Pos[0]=player.GetHotX();Pos[1]=player.GetHotY();}else if(*ID==Enemy)//如果是敌人坦克{type=EnemyBullet;direction=enemy.GetDirection();Speed=enemy.GetFire();Pos[0]=enemy.GetHotX();Pos[1]=enemy.GetHotY();}if(direction==Up)//根据坦克的位置和方向确定子弹的初始坐标{Pos[0]--;Pos[1]++;}else if(direction==Down){Pos[0]+=3;Pos[1]++;}else if(direction==Left){Pos[0]++;Pos[1]--;}else if(direction==Right){Pos[0]++;Pos[1]+=3;}//子弹的运行while(1){WaitForSingleObject(Mutex,INFINITE);//这个不再注释了。