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语言完整游戏项目坦克大战详细代码
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更应如此。
卢杰基于UnityD的坦克大战游戏的设计与实现
毕业实训报告课题名称:基于Unity3d的坦克大战游戏的设计与实现专业:软件技术班级: RZ软技154学号:201560190410学生姓名:卢杰指导教师:赵冬2017年 5月 15日关于卢杰同学的实训鉴定同学于年月日至年月日在我公司部门进行了毕业实训。
在实训中,该同学在单位签章:指导教师签字:年月日中原工学院毕业实训任务书中原工学院毕业实训评审表摘要本文利用Unity3D跨平台功能的突出、兼容性强的特点,结合C#开发一款坦克大战的游戏系统,该系统运行流畅,具有较好的可玩性和跨平台性。
课题题目为基于Unity3D的坦克大战游戏的射击与开发,旨在成功的设计出一款可以在PC端运行的坦克游戏,在毕业设计完成时,坦克模型应该能再PC端运行。
游戏中,我们可以利用鼠标、键盘来对我们的坦克进行前进后退,而且可以对坦克进行旋转以及发射炮弹,通过这次设计,自己也体验了技术实现的过程。
关键词: Unity3D;坦克大战游戏;游戏引擎目录摘要 (V)第1章项目概述 (1)1.1项目背景 (1)1.2技术路线 (1)1.2.1 游戏设计与制作阶段 (1)1.2.2 开发环境 (1)1.3项目设计目标 (1)第2章系统设计 (2)2.1系统的整体设计 (2)2.2系统的界面设计 (2)2.2.1 游戏主菜单 (2)2.2.2 游戏帮助界面 (3)2.2.3 游戏结束界面 (3)2.2.4 游戏主界面 (4)2.2.5 主角模型 (4)2.2.6 敌人模型 (5)2.2.7 游戏地图模型 (5)第3章游戏菜单界面实现 (6)3.1按钮的实现 (6)3.2游戏主菜单界面的实现 (6)3.2.1 说明按钮 (6)3.2.2 退出按钮 (6)3.2.3 游戏开始按钮 (6)3.3游戏帮助界面的实现 (7)3.3.1 关闭按钮 (7)3.3.2 游戏帮助文字 (7)3.4游戏结束界面的实现 (7)3.4.1 重新开始按钮 (7)3.4.2 退出游戏按钮 (7)3.4.3 分数显示 (8)3.5游戏主界面的实现 (8)3.5.1 重置按钮 (8)3.5.2 退出按钮 (8)3.5.2 游戏得分 (8)第4章游戏主界面实现 (10)4.1场景的搭建 (10)4.2主角的功能实现 (10)4.2.1移动 (10)4.2.2攻击 (10)4.2.3受到伤害 (11)4.3摄像机的功能实现 (12)4.3.1移动 (12)4.3.2围绕主角旋转 (12)4.3.3视野的拉近或拉远 (13)4.4敌人的功能实现 (13)4.4.1 生成 (13)4.4.2 移动 (14)4.4.3 攻击 (14)4.4.4 受伤 (15)4.5炮弹的碰撞检测 (16)4.5.1 炮弹的身份 (16)4.5.1 碰撞检测 (16)第5章系统测试 (18)5.1在U NITY3D中运行测试 (18)5.2在PC中运行测试 (18)5.3测试结果 (21)第6章结束语 (22)第1章项目概述1.1 项目背景随着社会的科技水平和经济水平的迅速发展,游戏行业以迅雷不及掩耳之势快速的发展着。
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);
拓展项目——坦克大战(共5则)
拓展项目——坦克大战(共5则)第一篇:拓展项目——坦克大战坦克大战明阳天下拓展项目简介团队的所有成员在规定的时间和规则的约束下,进行角色分配后,蒙上双眼依次进入模拟战场,在躲避地雷的同时用炮弹尽可能的击中对手,最终战场剩余人数最多的小组获胜。
项目规则1、每队队员同时蒙眼进入雷区,听由场外队员指挥捡炮弹,中途如有触碰地雷,该队员视为中弹身亡,由下一名队员顶替;2、场内队员蒙眼听从场外队员的指挥,捡起炮弹,击中对方队员身体任意部位,即可淘汰对方队员继续存活;3、场外队员只能在限定的区域内活动,不可触发到其他组的区域;4、最后场外留有人数最多组获胜。
项目目标有效沟通,战略与决策,在特殊的情况下如何和其他学员进行有效沟通;团队的力量如何发挥才能体现最大的力量;怎样才能是更合理的指挥方式;默契程度和信任度的考验。
北京明阳天下拓展培训机构是国内体验培训领域的“黄埔军校”。
在体验式培训、户外教育理论、专项主题研究、软件实操开发等软件设施方面已走在行业前列;而硬件拓展设备、拓展器材、拓展设施设计建造和大型独资实操基地等硬件设施方面同样领先全国。
强大的课程研发队伍,与国际接轨的先进培训理念,完善的硬件设备,优越的服务意识,明阳天下拓展始终秉承“专业致胜,效果为王”的理念,为成千上万的客户打造专业化、高标准的拓展培训方案。
第二篇:坦克大战大报告大作业题目:坦克大战程序一、需求分析功能需求坦克大战其中包括对主战坦克的编写、坦克的初始位置的编写、坦克的移动方向的编写、坦克的速度的编写、坦克的子弹速度的编写、敌军的子弹速度的编写、设置游戏难度的编写、子弹的编写、敌军坦克的编写、构造函数的编写,初始化敌军坦克的位置和状态的编写、键盘控制坦克的移动的编写、发弹的编写、判断是否被击中的编写、判断是否击中敌军的编写等。
通过上下左右键进行对坦克的移动,通过F键发射子弹,其它坦克可以随机移动。
构造主窗口中所需要的类,并将坦克加到窗口中,实现坦克的四个方向的移动并创建炮弹类,并让屏幕中的坦克能发射炮弹,让坦克可以朝对方信息统计功能,在游戏界面左上角,显示当前屏幕子弹数。
c语言坦克大战最新代码
judge_tank_my(map,key);/*判断己方坦克运动函数*/
} aaa: ; } void map_all(int map[15][15])/*初始化地图函数*/ { int i,j; for(i=0;i<15;i++)
for(j=0;j<15;j++) switch(map[j][i]) { case 0: break; case 5:map_wall(i,j);break;/*地形*/ case 6:map_steel(i,j);break; case 7:map_water(i,j);break; case 8:map_border(i,j);break; case 9:map_base(i,j);break; }
void uptank(int i,int j,int color);/*画坦克函数*/ void downtank(int i,int j,int color); void lefttank(int i,int j,int color); void righttank(int i,int j,int color);
/* Note:Your choice is C IDE */ #include "graphics.h" #include "stdlib.h" #include "stdio.h"
#define a_UP 0x4800/*定义A坦克按键*/ #define a_DOWN 0x5000 #define a_LEFT 0x4b00 #define a_RIGHT 0x4d00 #define a_shoot 0x1c0d
void judge_moveshootway(int map[15][15],int i);/*炮弹运动时判断炮弹方 向函数*/ void judge_shoot(int m,int map[15][15],int i);/*判断炮弹打中的物体函数 */ void judge_shootway(int map[15][15],int i);/*炮弹打中物体时判断方向函 数*/
最新精品作文:“坦克大战”_250字作文
“坦克大战”_250字
今天,我和几个朋友去沙地里玩“坦克”大战。
我们先建了一座坦克的平台,平台修好后,我们动手作起“坦克”来。
我先找来一块半大的砖头,用沙垒了一个堆。
又找来了几根绳子,先把坦克的炮筒装好,又把机枪装好,这时,小伙伴们已经把坦克造好了。
大家一致推选我当司令,我们的坦克部队浩浩荡荡的走向敌人的队伍,他们调动兵力迎战,一场坦克大战就要开始了。
我们正准备强攻,一个人说:‘我看强攻不行,得想个办法才能消灭他们。
”
他让人去断敌人的后路,其余的坦克兵分两路去攻击敌人。
敌人见了,慌了,向后路逃去,被挡住了,只好硬着头皮回来迎战。
几个会后,我们的坦克就把他们打得落花流水,大获全胜。
第 1 页。
坦克大战实验报告总结
坦克大战实验报告总结坦克大战实验报告总结实验报告总结是对坦克大战实验进行全面回顾和总结的部分。
在这个实验中,我们设计了一个多人在线坦克对战游戏,并对其进行了测试和评估。
首先,我们通过分析游戏的玩法和功能需求,确定了实验的目标和要求。
我们的目标是创建一个具有协同和竞争性元素的多人在线游戏,通过实验测试其稳定性、可玩性和用户体验。
在实验中,我们使用了Unity引擎和C#编程语言来开发游戏。
我们设计了一个简单的地图,玩家可以在其中驾驶坦克进行对战。
我们为坦克添加了各种功能,例如移动、射击和受伤机制,以增加游戏的策略性和挑战性。
为了评估游戏的性能和用户体验,我们进行了一系列测试。
我们首先进行了功能测试,确保游戏的各项功能正常运行。
然后,我们进行了性能测试,测试游戏在不同网络环境下的延迟和帧率。
最后,我们进行了用户体验测试,收集玩家对游戏的反馈和建议。
通过实验,我们得出了以下结论:1. 游戏的核心功能运行正常,并且具有一定的可玩性和挑战性。
2. 在低延迟的网络环境下,游戏的表现良好,但在高延迟的网络环境下会出现一些延迟和卡顿的问题。
3. 玩家对游戏的操作和画面质量表示满意,但希望增加更多的地图和游戏模式来增加游戏的可玩性。
基于这些结论,我们对游戏进行了改进和优化。
我们减少了游戏的网络通信量,以降低延迟和提高游戏的流畅度。
我们还增加了更多的地图和游戏模式,以增加游戏的可玩性。
综上所述,通过本次实验,我们成功地设计并开发了一个多人在线坦克对战游戏,并对其进行了评估和改进。
我们的实验结果表明,游戏具有良好的可玩性和用户体验,但还有一些地方需要进一步优化。
我们相信,在未来的工作中,我们可以进一步改进游戏,使其更加完善和出色。
坦克大战程序代码(精心汇编)
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 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 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 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 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 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 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 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 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 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 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 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 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] - 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] - 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] - 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() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {opf[i] = 3 ;}else{}}}}if(a % 50 == 21 ) {//坦克的随机移动for (int i = 4; i<6; i++) { if( () > ) {if() > {opf[i] = 1 ;}else{opf[i] = 2 ;}}else{if() > {}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() > {opf[i] = 3 ;}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) ;}() ;}}}。
户外游戏案例分析《坦克大战》
坦克大战2022.5幼儿园给孩子们准备了木质的枪以后户外自主游戏孩子们对打仗游戏非常喜欢,其中“坦克大战”游戏更是男孩子们的喜爱。
户外自主游戏材料的丰富,使孩子们的游戏玩法也多了起来。
一、搭建一个房子户外自主游戏孩子们玩着打仗游戏,每人手里拿着一把枪,在操场上跑来跑去的,我说:你们这样跑来跑去不怕被打死了?这个时候李沐泽和张宇航小朋友想起来想盖一个房子,李沐泽说:有了房子才能保护自己,坏人打不到我们,他俩先用了两个体操垫搭建房子,但这个房子总是立不住,这个时候我问他们:为什么你们的房子总是倒呢?李沐泽说:因为没有当住的东西,我说:那你们再想想还用什么材料可以利用一下呢?他们在操场上观察了半天,李沐泽突然发现了滚筒,他说:老师滚筒可以挡住体操垫,我说:那你可以试试,然后李沐泽和张宇航过去搬过来几个滚筒挡在体操垫后面,这回体操垫真的不倒了,他们又把两个滚筒放在一起,上面又放了一个体操垫当房顶,很快就盖起了一个房子,这个时候好几个小朋友看见了他们的房子,手里拿着枪又跑过来进房子里,开始了他们的打仗游戏。
图片1 搭建房子图片2 滚筒也可以保护自己教师的思考:今天的户外活动几个小朋友一开始只是没有目标的拿着木头枪来回跑,于是我就顺嘴引导了一下,你们这样跑来跑去不怕被打死了?孩子们自发的想到了要搭建一个房子,用来保护自己,幼儿想到了用体操垫盖房子保护自己,但光用体操垫总是立不住,但是幼儿没有放弃,又寻找其他的材料,用滚筒和体操垫组合起来搭建房子,这回真的成功了,最后还盖了个房顶,从这简单的搭建一个房子能看出来幼儿用材料的组合,用滚筒来当辅助支撑,表现除了积极主动、遇到问题自己想办法解决,发散创造性的思维品质、再一次体验了主动学习主动探究的完整过程,并出现了更多合作行为,发展了交往技能。
二、搭建初步的坦克户外自主游戏时孩子们连续玩了好几天打仗游戏,今天早晨做计划时候钟梓辰小朋友说:老师我要今天搭一个坦克,这样子弹也打不进来,我说好啊,你这个主意很不错,我问他那你用什么材料呀?他说:我要用安吉箱和轮胎,我说行,那你一会出去搭建一个坦克吧。
坦克大战_小学作文
坦克大战
本文是关于小学作文的坦克大战,感谢您的阅读!
光明队和黑暗队展开了战争。
首先黑暗队出了一号坦克,“嘣,嘣,嘣”地向光明队打去,没过多久,光明队的二号坦克被黑暗队的一号坦克打败了。
那时光明队发狂了,猛地向黑暗队冲去,“嘣”,黑暗队的一二三号坦克都被打败了,这下黑暗队更狂了,跟光明对展开了拼死决斗。
“嘣,嘣,嘣”,战场上都是光明队和黑暗队的坦克发炮的声音。
过了一会儿,光明队和黑暗队都打累了,有一点放弃了,结果谁也打不过谁,于是他们回了各自的基地。
黑暗队回到基地,把所有的坦克全都改成了飞机,而光明队回去也在想打败黑暗队的方法。
又过了一会儿,战场上又“嘣,嘣,嘣”响起来了,黑暗队发出了强烈子弹,“嘣”,光明队的一三四号坦克被打败了,这下光明队拔腿就跑到基地里,把还剩下的五六七八九号六架坦克改成了一架最厉害的巨大飞机,又到战场上战斗,没过多久,强大的飞机就发出了绿色光线,彻底打败了黑暗队。
c语言简单的坦克对战代码
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`是一个二维字符数组,用于表示游戏场景中每个位置的状态。
函数首先清空屏幕,然后遍历二维数组并输出对应的字符。
坦克大战游戏策划书3篇
坦克大战游戏策划书3篇篇一坦克大战游戏策划书一、游戏名称坦克大战二、游戏类型射击、策略三、游戏平台PC 端四、游戏背景在游戏中,玩家需要控制自己的坦克,在一个充满敌人和障碍物的战场上消灭所有敌人,保护自己的基地。
五、游戏目标1. 消灭所有敌人。
2. 保护自己的基地。
3. 在规定时间内获得最高分。
六、游戏玩法1. 玩家通过键盘控制坦克的移动和射击。
2. 坦克可以向四个方向移动,包括前进、后退、向左转和向右转。
3. 坦克可以向八个方向射击,包括正前方、正左方、正右方、左前方、左后方、右前方、右后方和后方。
4. 敌人会从不同的方向出现,并向玩家的基地前进。
5. 玩家需要消灭所有敌人,才能进入下一关。
6. 如果玩家的坦克被敌人的炮弹击中,或者撞到障碍物,或者基地被敌人摧毁,游戏结束。
7. 玩家可以通过消灭敌人获得金币,金币可以用来购买道具,如增加坦克的速度、攻击力、防御力等。
8. 玩家可以通过消灭敌人获得分数,分数越高,游戏结束时的奖励越高。
七、游戏关卡1. 游戏共有十个关卡,每个关卡的难度逐渐增加。
2. 每个关卡的地图都不同,包括不同的地形、障碍物和敌人的分布。
3. 每个关卡的敌人都会有不同的特点和攻击方式,玩家需要根据敌人的特点来制定策略。
八、游戏画面1. 游戏画面采用 2D 风格,以坦克和战场为主要元素。
2. 游戏画面色彩鲜艳,对比度高,易于玩家识别和区分敌我坦克。
3. 游戏画面中会有敌人的炮弹和玩家的坦克的炮弹的特效,增加游戏的紧张感和刺激感。
九、游戏音效1. 游戏音效包括坦克的移动声、射击声、爆炸声、敌人的脚步声等。
2. 游戏音效的音量和节奏会根据游戏的不同阶段进行调整,增加游戏的氛围和节奏感。
3. 游戏音效的设计要符合游戏的主题和风格,让玩家更容易沉浸在游戏中。
十、游戏操作提示1. 在游戏开始前,会有一段操作提示,告诉玩家如何控制坦克和射击。
2. 操作提示会在游戏过程中随时出现,提醒玩家如何应对不同的情况。
坦克论文12
坦克论文12第一篇:坦克论文12陆战之王—坦克坦克之所以有“陆战之王”的称号是由于1916年6月24日英军与法军发起了索姆河战役,在于9月3日发起的第三次进攻中,英军于9月15日第一次使用新式兵器——坦克.这是战争史上第一次使用坦克,对守备方的德国步兵产生了心理震撼,使他们放弃阵地不战自退。
称为“陆战之王”。
坦克从诞生至今,已走过了90年的发展历程。
在短暂的时间内,坦克从无到有,从弱到强,迅猛发展,由名不见经传的水柜,到冠冕堂皇地登上陆战之王的宝座。
90年的风雨历程,坦克以履带和钢甲给机械化战争打下了深深的烙印,并促进了坦克作战理论的长足发展。
随着科学技术的发展,坦克获得了新的发展动力,在未来的战争中,坦克仍将大有用武之地。
张军锋,祝延军,陈哲强.坦克的诞生、演化及其发展趋势[J][1] 未来与发展, 2008,(02).世界坦克代的划分随着科学技术的不断发展,坦克技术发生了重大变革,坦克的性能得到相应提高,各国军队装备的坦克也不断更新换代。
坦克从1915年问世以来,究竟它有多少代了,至今坦克专家们还没有仔细地划分。
但是坦克的发展大体上可分为两个大的发展阶段:从第一次世界大战到第二次世界大战时期,是坦克初露锋芒、走向成熟到称雄战场的阶段;第二次世界大战后以来,是坦克的飞跃发展阶段。
20世纪60年代以前发展的坦克,按战斗全重、火炮口径分为重、中、轻型坦克,60年代以来发展的坦克,按用途分为主战坦克和特种坦克。
[3] 金中.世界坦克“代”的划分[J].国外坦克, 2005,(01).通用性使各国不会放松对坦克技术的研究各国之所以如此关注,原因在于坦克技术具有通用性。
同样的一种弹,装在坦克上就是陆基反坦克装备,装在飞机和直升机上就是空射反坦克导弹,发射平台不同、毁伤原理是一样的。
而现在从世界范围来看,反坦克导弹的穿甲能力仍然是各军事强国关注的重点。
冷战时期,美国非常重视如何对付苏联庞大的装甲部队,策略之一就是发展反坦克导弹,并强调由直升机装载,以便能迅速集中和转移火力。
课程设计报告--坦克大战
目录一.问题定义 (1)1. 项目名称 (1)2. 项目目标 (1)3. 选题背景 (1)二.可行性研究 (1)1.技术可行性 (1)2. 经济可行性 (1)3. 操作可行性 (1)三.需求分析 (2)1. 游戏内容需求 (2)2. 游戏规则 (3)四.游戏设计 (3)1. 类的设计 (3)2. 游戏流程 (4)1. 主流程 (4)2. 游戏初始化 (5)3. 游戏运行 (6)3. 游戏序列图 (14)游戏初始化 (14)键盘按下事件 (15)游戏运行 (15)玩家坦克处理 (16)电脑坦克处理 (17)炮弹碰撞处理 (19)坦克碰撞处理 (19)游戏结束 (20)五.游戏代码 (21)CGameMain类 (21)CTankPlayer类 (32)CTankEnemy类 (36)CBullet类 (42)CWeapon类 (49)六.实验总结 (53)一.问题定义1.项目名称坦克大战2.项目目标综合运用C++及其面向对象的知识开发一款小游戏。
3.选题背景相信大部分同学都玩过或看过“坦克大战”这款经典游戏。
现在,就由我自己动手来开发它。
因为之前的学习,我具备了C++语言和面向对象的基础知识,在这个基础上按照实验指南的指导一步一步进行下去,把这款经典游戏做出来。
巩固之前所学知识也学习新的知识。
二.可行性研究1.技术可行性本游戏采用 FunCode和Visual C++6.0进行开发,基于Windows xp和Windows7操作系统。
Funcode软件提供了大量基础类库,可以快速方便地构造出游戏软件。
之前课程学习过C++,具有一定的C++语言开发基础,对面向程序设计有一定了解。
2.经济可行性此次课程设计由我一人完成,只需装有Funcode及Visual C++的电脑一台,无资金需求;且制作出来的游戏软件并不打算发行,也无后期资金需求,经济完全可行。
3.操作可行性本游戏只需用W、A、S、D来移动,用J键进行攻击,操作十分简单,界面友好,符合用户操作习惯。
scratch坦克大战
scratch坦克大战Scratch坦克大战引言:Scratch是一款基于编程的教育平台,它允许用户通过拖拽代码块的方式学习编程。
凭借其简单易用的界面和丰富的功能,很多学生和编程爱好者选择使用Scratch来创建有趣的项目。
其中,Scratch 坦克大战是一款备受欢迎的项目,它让玩家能够参与到一个精彩刺激的坦克对战游戏中。
本文将详细介绍Scratch坦克大战的规则和实现方法。
第一部分:规则介绍1.1 游戏目标- 在 Scratch坦克大战中,玩家的目标是击败所有敌方坦克,保持自己的坦克生存并取得胜利。
1.2 游戏界面- 游戏界面分为两部分:玩家坦克区域和敌方坦克区域。
玩家通过操作自己的坦克,发射炮弹来消灭敌人。
1.3 游戏规则- 玩家坦克和敌方坦克具有各自的生命值,当生命值减为0时,坦克将被击毁。
- 每次击败敌方坦克后,玩家将获得积分。
积分越高,表示玩家的战斗能力越强。
- 敌方坦克会在随机位置生成,并向玩家坦克移动。
玩家需要及时发现并消灭它们。
- 玩家坦克的装甲会随着游戏进行逐渐减少,玩家需要小心保护自己的坦克。
- 游戏中还可能出现一些道具,例如加血包和强化炮弹,玩家可以通过吃到这些道具来增强自己的战斗力。
第二部分:游戏实现方法2.1 创建角色- 首先,我们需要创建玩家坦克角色和敌方坦克角色。
可以使用Scratch提供的角色编辑器来设计坦克的外观和动画。
2.2 移动控制- 玩家坦克的移动可以由键盘控制,可以设置上下左右四个方向键来控制坦克的运动。
- 敌方坦克的移动可以使用随机数生成器来确定移动的方向和距离。
2.3 战斗机制- 玩家坦克可以发射炮弹来击败敌方坦克。
可以通过设置触发器和相关的代码块来实现炮弹的发射和碰撞检测。
- 敌方坦克也可以发射炮弹攻击玩家。
玩家需要躲避敌方的炮弹,保护自己的坦克不被击中。
2.4 生命值管理- 玩家坦克和敌方坦克的生命值可以使用变量来进行管理。
当坦克受到攻击时,生命值将减少,并根据生命值的变化来改变坦克的外观。
坦克大战代码
坦克大战代码// 1、TTank.cpp: implementation of the TTank class.坦克类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TankWar.h"#include "TTank.h"#include "TWorld.h"#include "TExplode.h"#include "TBonus.h"#include "TBullet.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TEnemyTank///////////////////////////////////////////////////////////////////EPG TEnemyTank::m_epg[3];//////////////////////////////////////////////////敌军坦克移动void TEnemyTank::Move(){if(!IsMyTime())return ;//防护小于0,还不死吗if(m_nShield < 0){Dead();//玩家增加经验值g_world.Player(0)->m_nExper += 10 + m_nType * 10;//加点爆炸效果g_world.ExplodeLink().Add(NEWTExplode(m_nX,m_nY,EXPLODE_TANK));}///////////////////////////////////////////////////////疯子要行动了,怎么动呢?用随机数来决定吧//玩家没进入范围,什么也不做if(ABS(m_nX-g_world.Player(0)->GetX())>500 ||ABS(m_nY-g_world.Player(0)->GetY())>500)return ;//产生0到100之间的随机数状态int status=Rand(0,100);//保存现在的位置坐标int x=m_nX,y=m_nY;//根据产生的状态行动if(status<2){//状态小于2,改变一下方向(概率是... 计算一下好像是: 2/100即0.02)m_dir =(DIRECTION) Rand(0,4);}else if(status <3){//状态小于3,开火(概率是... 计算一下好像是: (3-2)/100即0.01)switch(m_nType){case FIRE_TANK://火弹:射程100,威力20g_world.BulletLink().Add(NEWTBullet(m_nX,m_nY,m_dir,FIRE,20,100));break;case DOUBLE_MISSILE_TANK://火弹:射程250,威力15g_world.BulletLink().Add(NEWTBullet(m_nX,m_nY,m_dir,DMISSILE,15,250));break;case SINGLE_MISSILE_TANK://火弹:射程250,威力10g_world.BulletLink().Add(NEWTBullet(m_nX,m_nY,m_dir,SMISSILE,10,250));break;}}else{//其它的状态值就表示运行吧(概率是... 计算一下好像是: 100-3/100即0.97)//生命在于运动嘛:)m_nX+=g_nDirXY[m_dir][0];m_nY+=g_nDirXY[m_dir][1];}///////////////////////////////////////////////////////计算一下上面的移动是否有效//先假设移动有效BOOL canMove=TRUE;//取得自己的边框RECT rc;GetRect(rc);//////////////////////////////////////////////////////根据方向来计算是否与障碍地图上的障碍物碰撞if(m_dir==DIR_UP){//方向向上,只检查左上角及右上角坐标是否碰到障碍if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIG HT))canMove = FALSE;elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIGHT ))canMove = FALSE;}else if(m_dir==DIR_DOWN){//方向向下,只检查左下角及右下角坐标是否碰到障碍if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_H EIGHT))canMove = FALSE;elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEI GHT))canMove = FALSE;}else if(m_dir==DIR_RIGHT){//方向向右,只检查右下角及右上角坐标是否碰到障碍if(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEI GHT))canMove = FALSE;elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEI GHT))canMove = FALSE;}else if(m_dir==DIR_LEFT){//方向向左,只检查左上角及左上角坐标是否碰到障碍if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIG HT))canMove = FALSE;elseif(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEIG HT))canMove = FALSE;}//总不能移到世界范围以外吧if(m_nY>g_world.GetHeight()-OBSTACLE_HEIGHT ||m_nX>g_world.GetWidth()-OBSTACLE_WIDTH ||m_nX<0 || m_nY<0)canMove = FALSE;//有没有碰到其它的NC坦克?不过要记住排除与自己相撞的情况//疯子也不会疯到这种程度吧if(g_world.EnemyTankLink().HitTestAll(this))//停下来,打个招呼canMove = FALSE;//撞到了其它障碍物(木箱、邪恶之源)了吗?if(g_world.ObstacleLink().HitTestAll(this))canMove = FALSE;//碰到玩家坦克了吗?if(g_world.Player(0)->HitTest(this))//当然不能动了canMove = FALSE;//移动无效,恢复原值if(canMove==FALSE)m_nX = x,m_nY=y;////////////////////////////计算当前动画帧m_nCurrentFrame=m_dir;}////////////////////////////////////////////////////画坦克void TEnemyTank::Draw(){POINT p;p.x = m_nX;p.y = m_nY;g_world.LPToDP(p);WGE_Surface.Blt(m_epg[m_nType],m_nCurrentFrame,p.x,p.y );}///////////////////////////////////////////取边框void TEnemyTank::GetRect(RECT& rc){rc.left = m_nX - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyX;rc.top = m_nY - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyY;rc.bottom = rc.top + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwHeight ;rc.right = rc.left + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwWidth ;}/////////////////////////////////////////////////TEnemyTank::TEnemyTank(int x, int y, int nType):TSprite(x,y,100,0,CLASS_TENEMYTANK),m_nType(nType){switch(nType){case FIRE_TANK://防护力100,速度1/(50/1000)m_nShield = 100;SetDelayTimer(50);break;case DOUBLE_MISSILE_TANK://防护力150,速度1/(70/1000)m_nShield = 150;SetDelayTimer(70);break;case SINGLE_MISSILE_TANK://防护力100,速度1/(30/1000)m_nShield = 200;SetDelayTimer(30);break;}}///////////////////////////////////////////////////////////碰撞是否有效BOOL TEnemyTank::HitBy(TObject * pObj){//////////////////////////////////////////////与参数对象碰撞if(HitTest(pObj)){////////////////////////////////////////////参数对象是一个子弹if(pObj->ClassType()==CLASS_TBULLET){//转变为子弹对象TBullet * pBullet = (TBullet*)pObj;if(pBullet->m_nType == LIGHT){//是光弹,防护减去光弹的力量m_nShield -= pBullet->m_nShield ;return TRUE;}}}return FALSE;}///////////////////////////////////////////////////////////////////////// TPlayerTank玩家///////////////////////////////////////////////////////////////////EPG TPlayerTank::m_epg[3];TPlayerTank::TPlayerTank(int x, int y, int nType):TSprite(x,y,100,0,CLASS_TPLAYERTANK),m_nType(nType),m_nExper(0),m_nMoney(0),m_nMaxShield(100){SetDelayTimer(1); //参考值40,这里是1}///////////////////////////////////////////////////碰撞是否有效BOOL TPlayerTank::HitBy(TObject * pObj){/////////////////////////////////////////////是否与参数对象碰撞if(HitTest(pObj)){if(pObj->ClassType()==CLASS_TBULLET){//参数对象炮弹TBullet * pBullet = (TBullet*)pObj;if(pBullet->m_nType == FIRE||pBullet->m_nType == DMISSILE||pBullet->m_nType == SMISSILE){//被火弹,双导弹,单导弹(都是敌方的炮弹)击中,减防护力// m_nShield -= pBullet->m_nShield ;m_nShield += pBullet->m_nShield ;return TRUE;}}else if(pObj->ClassType()==CLASS_TBONUS){//参数对象是奖励TBonus * pBonus = (TBonus*)pObj;switch(pBonus->m_nBonusType){case BONUS_RECOVER: //恢复物品m_nShield += 20; //恢复20点m_nShield = MIN(m_nShield+20,m_nMaxShield);break;case BONUS_EXPER: //经验物品//m_nExper += 10; //经验值加10m_nType = MIN((m_nExper/1000),2); //第1000点升一级m_nMaxShield = 100 + m_nExper/100; //调整最大防护m_dwDelayTimer -= m_dwDelayTimer*10/100; //速度提高10%break;case BONUS_MONEY:m_nMoney += 100; //得到100元}return TRUE;}}return FALSE;}///////////////////////////////////////////////////////玩家坦克移动void TPlayerTank::Move(){if(!IsMyTime())return ;/*if(m_nShield<0){Dead();g_world.ExplodeLink().Add(NEWTExplode(m_nX,m_nY,EXPLODE_PLAYER));return;}*//////////////////////////////////////////////////////响应键盘事件,移动坦克//保存原坐标int x=m_nX,y=m_nY;//处理按键if(WGE_Input.Key()[DIK_UP]){if(m_nY>0) m_nY -- ;m_dir = DIR_UP;}elseif(WGE_Input.Key()[DIK_DOWN]){if(m_nY<g_world.GetHeight()-OBSTACLE_HEIGHT)m_nY += 1;m_dir = DIR_DOWN;}elseif(WGE_Input.Key()[DIK_LEFT]){if(m_nX>0) m_nX -= 1;m_dir = DIR_LEFT;}elseif(WGE_Input.Key()[DIK_RIGHT]){if(m_nX<g_world.GetWidth()-OBSTACLE_WIDTH)m_nX += 1;m_dir = DIR_RIGHT;}///////////////////////////////////////////////////////////计算上面的移动是否有效BOOL canMove=TRUE; //假设有效先RECT rc;GetRect(rc);//是否碰撞地形障碍?方法和敌人坦克一样if(m_dir==DIR_UP){if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIG HT))canMove = TRUE;elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIGHT ))canMove = TRUE;}elseif(m_dir==DIR_DOWN){if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_H EIGHT))canMove =TRUE;elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEI GHT))canMove = TRUE;}elseif(m_dir==DIR_RIGHT){if(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIGHT))canMove = TRUE;elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEI GHT))canMove = TRUE;}elseif(m_dir==DIR_LEFT){if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIG HT))canMove = TRUE;elseif(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEIG HT))canMove = TRUE;}//碰到了敌人的坦克没有?if(g_world.EnemyTankLink().HitTestAll(this))canMove = FALSE;//是否碰到了障碍物(木箱或邪恶源)if(g_world.ObstacleLink().HitTestAll(this))canMove = FALSE;//移动无效,恢复原坐标if(canMove==FALSE)m_nX = x,m_nY=y;//计算当前动画帧m_nCurrentFrame=m_dir;//按左CTRL键开火,不过每100ms才能开一次,加弹总要花点时间吧:)static DWORD dwFireTick=GetTickCount();if(GetTickCount()-dwFireTick>10) //参考值100ms,这里是10ms{if(WGE_Input.Key()[DIK_LCONTROL]||WGE_Input.Key()[DIK_RCONTROL ]){g_world.BulletLink().Add(NEWTBullet(m_nX,m_nY,m_dir,LIGHT,10+m_nMoney/300,100+m_nType*25));}dwFireTick=GetTickCount();}//让玩家坦克处于可视区的中央g_world.GetViewportRect(rc);int height= rc.bottom - rc.top - OBSTACLE_HEIGHT;int width= rc.right - rc.left - OBSTACLE_WIDTH;g_world.SetViewport(m_nX-width/2,m_nY-height/2);}////////////////////////////////////////////////////////画玩家坦克void TPlayerTank::Draw(){POINT p;p.x = m_nX;p.y = m_nY;g_world.LPToDP(p);WGE_Surface.Blt(m_epg[m_nType],m_nCurrentFrame,p.x,p.y );}/////////////////////////////////////////////////返回坦克的边框void TPlayerTank::GetRect(RECT& rc){rc.left = m_nX - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyX;rc.top = m_nY - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyY;rc.bottom = rc.top + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwHeight ;rc.right = rc.left + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwWidth ;}//2、TBonus.cpp: implementation of the TBonus class.奖励类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TBonus.h"#include "TWorld.h"EPG TBonus::m_epg_bonus[3];ESound TBonus::m_sound[1];//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TBonus::~TBonus(){}TBonus::TBonus(int x, int y, BONUS nBonusType):TObject(x,y,CLASS_TBONUS){m_nBonusType = nBonusType ;m_nCurrentFrame = 0;m_dwDelayTimer= 100;}void TBonus::Draw(){POINT p;p.x = m_nX;p.y = m_nY;g_world.LPToDP(p);WGE_Surface.Blt(m_epg_bonus[m_nBonusType],m_nCurrentFrame,p.x,p.y );}void TBonus::GetRect(RECT &rc){rc.left = m_nX - m_epg_bonus[m_nBonusType].GetFrame(m_nCurrentFrame)->m_nKeyX;rc.top = m_nY - m_epg_bonus[m_nBonusType].GetFrame(m_nCurrentFrame)->m_nKeyY;rc.bottom = rc.top + m_epg_bonus[m_nBonusType].GetFrame(m_nCurrentFrame)->m_dwHeight ;rc.right = rc.left + m_epg_bonus[m_nBonusType].GetFrame(m_nCurrentFrame)->m_dwWidth ;}void TBonus::Move(){if(!IsMyTime())return ;if(g_world.Player(0)->HitBy(this)){Dead();m_sound[0].Play();}++m_nCurrentFrame%=m_epg_bonus[m_nBonusType].GetFrameCount();}//3、TBullet.cpp: implementation of the TBullet class.子弹类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TBullet.h"#include "TExplode.h"#include "Tworld.h"ESound TBullet::m_sound[4];EPG TBullet::m_epg[4];//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TBullet::TBullet(int x,int y,DIRECTION dir,BULLET_TYPE nType,int nShield,int nFireRange):TSprite(x,y,nShield,0,CLASS_TBULLET),m_nType(nType){SetDelayTimer(50);m_dir = dir;m_nFireRange = nFireRange;////////////////////////////////////////////计算音效的音量及均衡int valume,pan; //音量和均衡int w,h;//声源与玩家的距离w = x - g_world.Player(0)->GetX();h = y - g_world.Player(0)->GetY();//计算音效的音量及均衡valume = MAX(ABS(w),ABS(h)) * (-10000/800);pan = w * (10000/400);///////////////////////////////////////////////////跟据类型设置速度switch(nType){case LIGHT://玩家的子弹,总会听到声音的m_nSpeed = 15;//if(valume>-10000) //小于最小音量,没必要播放m_sound[2].Play(-1000,pan);break;case FIRE:m_nSpeed = 10;if(valume>-10000)m_sound[1].Play(valume,pan);break;case DMISSILE:m_nSpeed = 0; //导弹开始速度为0,然后利用加速度加速if(valume>-10000)m_sound[0].Play(valume,pan);break;case SMISSILE:m_nSpeed = 0;if(valume>-10000)m_sound[0].Play(valume,pan);break;}}TBullet::~TBullet(){}void TBullet::Move(){if(!IsMyTime())return ;TLinkNode * pNode;switch(m_nType){case FIRE: //火弹,由火坦克发射的炮弹//计算出当前动画帧m_nCurrentFrame = m_dir*3+(m_nCurrentFrame+1)%3;//超出射程范围,发出死亡信息if(m_nFireRange<0){Dead();}//击中玩家了吗?(即使死了也不让你好过)if(g_world.Player(0)->HitBy(this)){//击中目标,任务完成Dead();}//已经死亡,来个爆炸效果if(IsDead())g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY,EXPLODE_FIRE));break;case DMISSILE: //双导弹,敌军的导弹m_nSpeed +=1; //以加速为1的速度运动m_nCurrentFrame = m_dir; //计算当前动画的帧//超出射程范围,发出死亡信息if(m_nFireRange<0)Dead();//击中玩家?if(g_world.Player(0)->HitBy(this))Dead();//死了if(IsDead()){///////////////////////////////////////////////////////双导弹当然是两个爆炸效果if(m_dir==DIR_RIGHT||m_dir==DIR_LEFT){g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY+6,EXPLODE_MISSILE));g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY-6,EXPLODE_MISSILE));}else{g_world.ExplodeLink().Add(NEW TExplode(m_nX+6,m_nY,EXPLODE_MISSILE));g_world.ExplodeLink().Add(NEW TExplode(m_nX-6,m_nY,EXPLODE_MISSILE));}}break;case SMISSILE: //单导弹,不用注释了吧m_nSpeed ++;m_nCurrentFrame = m_dir;if(m_nFireRange<0)Dead();if(g_world.Player(0)->HitBy(this))Dead();if(IsDead())g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY,EXPLODE_MISSILE));break;case LIGHT: //我们的武器:)m_nCurrentFrame = 0;//////////////////////////////////////////////////////计算是否打中在链表中的敌军坦克//取得链表中的第一辆坦克pNode=g_world.EnemyTankLink().m_pHeader;while(pNode) //还不到链尾{//打中了吗?if(pNode->m_pObject->HitBy(this))//Ok,Mission completedDead();//取得下一辆坦克pNode = pNode->m_pNext;}//////////////////////////////////////////////////////计算是否打中障碍物pNode = g_world.ObstacleLink().m_pHeader ;while(pNode){if(pNode->m_pObject->HitBy(this))Dead();pNode = pNode->m_pNext;}if(m_nFireRange<0){//太远了,没办法Dead();}//???,为什么没有爆炸效果?break;default:TRACE(0,"Invalid bullet id");break;}//填加的代码//取得自己的边框RECT rc;GetRect(rc);if(m_nType==LIGHT||m_nType==FIRE||m_nType==SMISSILE||m_nType==D MISSILE){if(m_dir==DIR_UP){//方向向上,只检查左上角及右上角坐标是否碰到障碍if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIG HT))Dead(); //子弹消失elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIGHT ))Dead();}else if(m_dir==DIR_DOWN){//方向向下,只检查左下角及右下角坐标是否碰到障碍if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_H EIGHT))Dead();elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEI GHT))Dead();}else if(m_dir==DIR_RIGHT){//方向向右,只检查右下角及右上角坐标是否碰到障碍if(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEI GHT))Dead();elseif(g_world.ObstacleMap(rc.right/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEI GHT))Dead();}else if(m_dir==DIR_LEFT){//方向向左,只检查左上角及左上角坐标是否碰到障碍if(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.top/OBSTACLE_HEIG HT))Dead();elseif(g_world.ObstacleMap(rc.left/OBSTACLE_WIDTH,rc.bottom/OBSTACLE_HEIG HT))Dead();}}//是不是死了?if(!IsDead()){//没死,那么继续移动//速度太快了!if(m_nSpeed>24)m_nSpeed = 24;//向前,向前,向前...m_nX+=g_nDirXY[m_dir][0]*m_nSpeed;m_nY+=g_nDirXY[m_dir][1]*m_nSpeed;//改变射程m_nFireRange -= m_nSpeed;}}////////////////////////////////////////////////画子弹void TBullet::Draw(){POINT p;p.x = m_nX;p.y = m_nY;g_world.LPToDP(p); //把世界逻辑坐标转换到设备坐标WGE_Surface.Blt(m_epg[m_nType],m_nCurrentFrame,p.x,p.y );/////////////////////////////////////////////////取得碰撞矩形void TBullet::GetRect(RECT& rc){rc.left = m_nX - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyX;rc.top = m_nY - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyY;rc.bottom = rc.top + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwHeight ;rc.right = rc.left + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwWidth ;}// TExplode.cpp: implementation of the TExplode class.////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TExplode.h"#include "TWorld.h"EPG TExplode::m_epg[4];ESound TExplode::m_sound[3];//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TExplode::TExplode(int x,int y,EXPLODE nType):TObject(x,y,CLASS_TEXPLODE),m_nType(nType),m_nCurrentFrame(0){SetDelayTimer(100);switch(nType){case EXPLODE_TANK:case EXPLODE_BOX:m_sound[0].Play();break;case EXPLODE_PLAYER://玩家爆炸动画慢一点,与声音配合SetDelayTimer(200);m_sound[0].Play();break;}}TExplode::~TExplode(){}/////////////////////////////////////////////////移动void TExplode::Move(){if(!IsMyTime())return ;/////////////////////////////////////////////计算if(m_nType==EXPLODE_PLAYER){//玩家爆炸应该壮烈一点if(m_nCurrentFrame>=m_epg[3].GetFrameCount()-1){//先来一个小爆炸m_sound[1].Play();//然后变成大爆炸m_nType = EXPLODE_TANK;m_nCurrentFrame = 0;return ;}}else{//一般爆炸就可以了if(m_nCurrentFrame>=m_epg[m_nType].GetFrameCount()-1){//爆炸消失Dead();return ;}}m_nCurrentFrame ++;}/////////////////////////////////////////////////画出爆炸void TExplode::Draw(){POINT p;p.x = m_nX;p.y = m_nY;g_world.LPToDP(p);if(m_nType==EXPLODE_PLAYER){WGE_Surface.Blt(m_epg[3],m_nCurrentFrame,p.x,p.y);}elseWGE_Surface.Blt(m_epg[m_nType],m_nCurrentFrame,p.x,p.y );}//////////////////////////////////////////////取得动画边框void TExplode::GetRect(RECT& rc){int i;if(m_nType==EXPLODE_PLAYER)i = 3;elsei = m_nType;rc.left = m_nX - m_epg[i].GetFrame(m_nCurrentFrame)->m_nKeyX;rc.top = m_nY - m_epg[i].GetFrame(m_nCurrentFrame)->m_nKeyY;rc.bottom = rc.top + m_epg[i].GetFrame(m_nCurrentFrame)->m_dwHeight ;rc.right = rc.left + m_epg[i].GetFrame(m_nCurrentFrame)->m_dwWidth ;}// 4、TLink.cpp: implementation of the TLink class.连接类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TLink.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TLink::TLink(){m_pHeader = NULL;}TLink::~TLink(){DeleteAll();}void TLink::AddHeader(TObject * pObject){ASSERT(pObject);TLinkNode * pAddNode = NEW TLinkNode(pObject);pAddNode->m_pNext = m_pHeader;m_pHeader = pAddNode;}void TLink::AddTail(TObject * pObject){ASSERT(pObject);TLinkNode * pAddNode = NEW TLinkNode(pObject);if(m_pHeader==NULL){m_pHeader = pAddNode ;m_pHeader->m_pNext = NULL;}else{TLinkNode * pNode = m_pHeader ;while(pNode->m_pNext){ASSERT(pObject!=pNode->m_pObject);pNode = pNode->m_pNext ;}pNode->m_pNext = pAddNode ;pAddNode->m_pNext = NULL;}}void TLink::Add(TObject * pObject){AddHeader(pObject);}void TLink::DeleteAll(){TLinkNode * pNode = m_pHeader;while(pNode){m_pHeader = pNode->m_pNext ;delete pNode ;pNode = m_pHeader;}}void TLink::Delete(TObject * pObject){TLinkNode * pPreNode = m_pHeader ;if(m_pHeader->m_pObject == pObject){m_pHeader = m_pHeader->m_pNext ;delete pPreNode ;return ;}TLinkNode * pNode = pPreNode->m_pNext ;while(pNode){if(pNode->m_pObject == pObject){pPreNode->m_pNext = pNode->m_pNext ;delete pNode;return ;}pPreNode = pNode ;pNode = pNode->m_pNext ;}}/////////////////////////////////画出链表中所有的对象void TLink::DrawAll(){TLinkNode * pNode = m_pHeader;while(pNode){pNode->m_pObject->Draw();pNode = pNode->m_pNext ;}}//////////////////////////////////////////////移动链表中所有的对象void TLink::MoveAll(){//取得第一个结点TLinkNode * pNode = m_pHeader;//循环整个链表while(pNode){if(pNode->m_pObject->IsDead()){//该对象已经被击毁,从链表中删除TObject * pDeleteObj = pNode->m_pObject;pNode = pNode->m_pNext ;Delete(pDeleteObj);}else{//调用该对象的Move()函数pNode->m_pObject->Move();pNode = pNode->m_pNext ;}}}BOOL TLink::HitTestAll(TObject * pObj){TLinkNode * pNode = m_pHeader;BOOL bHit = FALSE;while(pNode && bHit==FALSE){if(pNode->m_pObject != pObj)bHit=pNode->m_pObject->HitTest(pObj);pNode = pNode->m_pNext ;}return bHit;}//5、TObject.cpp: implementation of the TObject class.物体类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TObject.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TObject::TObject(int x,int y,CLASS_TYPE nClassType):m_nX(x),m_nY(y),m_dwLastTickCount(0),m_dwDelayTimer(0),m_nClassType(nClassType),m_bIsDead(FALSE){TObject::~TObject(){}///////////////////////////////////////////////该对象是否与另它对象碰撞BOOL TObject::HitTest(TObject* object){RECT rc1,rc2,temp;GetRect(rc1);object->GetRect(rc2);return IntersectRect(&temp,&rc1,&rc2);}////////////////////////////////////////////////是否该我动了?BOOL TObject::IsMyTime(){if(GetTickCount()-m_dwLastTickCount>=m_dwDelayTimer){m_dwLastTickCount = GetTickCount();return TRUE;}return FALSE;}//6、TObstacle.cpp: implementation of the TObstacle class.障碍物类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TObstacle.h"#include "TBonus.h"#include "TBullet.h"#include "TExplode.h"#include "TWorld.h"EPG TObstacle::m_epg[2];//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TObstacle::TObstacle(int x,int y,OBSTACLE nType):TObject(x,y,CLASS_TOBSTACLE),m_nType(nType),m_nCurrentFrame(0) {SetDelayTimer(100);switch(m_nType){case OBSTACLE_BOX: //木箱//硬度100m_nHardiness = 100;break;case OBSTACLE_END: //邪恶源//硬度1000! ,非常硬m_nHardiness = 1000;break;}}TObstacle::~TObstacle(){}void TObstacle::Destroy(){m_epg[0].Destroy();m_epg[1].Destroy();}///////////////////////////////////////////////击中测试BOOL TObstacle::HitBy(TObject * pObj){if(HitTest(pObj)){////////////////////////////////////////只能被光弹击中if(pObj->ClassType()==CLASS_TBULLET){TBullet * pBullet = (TBullet*)pObj;if(pBullet->m_nType == LIGHT){m_nHardiness -= pBullet->m_nShield ;return TRUE;}}}return FALSE;}////////////////////////////////////////////移动void TObstacle::Move(){if(!IsMyTime())return ;//计算当前帧++m_nCurrentFrame%=m_epg[m_nType].GetFrameCount();if(m_nHardiness<0){//消失Dead();if(m_nType == OBSTACLE_END){//邪恶源被击毁,过关//强烈爆炸g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY, EXPLODE_PLAYER));//经验值+1000g_world.Player(0)->m_nExper += 1000;//进入下一关g_game_status = GAME_STAGECLEAR;}else if(m_nType == OBSTACLE_BOX){//产生一个随机物品g_world.BonusLink().Add(NEW TBonus(m_nX,m_nY,(BONUS)Rand(0,3)));//然后爆炸g_world.ExplodeLink().Add(NEW TExplode(m_nX,m_nY, EXPLODE_BOX));}}}/////////////////////////////////////////////画出来void TObstacle::Draw(){POINT p;p.x = m_nX;p.y = m_nY;g_world.LPToDP(p);WGE_Surface.Blt(m_epg[m_nType],m_nCurrentFrame,p.x,p.y );}///////////////////////////////////////////////////////碰撞边框void TObstacle::GetRect(RECT& rc){rc.left = m_nX - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyX;rc.top = m_nY - m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_nKeyY;rc.bottom = rc.top + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwHeight ;rc.right = rc.left + m_epg[m_nType].GetFrame(m_nCurrentFrame)->m_dwWidth ;}// TSprite.cpp: implementation of the TSprite class. 精灵类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TSprite.h"int g_nDirXY[4][2] ={{1,0} , {0,1},{-1,0},{0,-1}};//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////TSprite::TSprite(int x,int y,int nShield,int nStatus,CLASS_TYPE nClassType):TObject(x,y,nClassType),m_nShield(nShield),m_nStatus(nStatus),m_dir(DIR_LEFT) ,m_nCurrentFrame(0){}TSprite::~TSprite(){}// TWorld.cpp: implementation of the TWorld class. 世界类////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "TankWar.h"#include "TWorld.h"#include "TBonus.h"#include "TObstacle.h"TWorld g_world; //全局唯一的世界对象//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////EGroupPic TWorld::m_grp_terrain;EPG TWorld::m_epg_icon[3];TWorld::TWorld():m_pTerrainMap(NULL),m_pObstacleMap(NULL){}TWorld::~TWorld(){DestroyWorld();}//////////////////////////////////////////////////加载地形图像BOOL TWorld::LoadTerrainPicture(LPCSTR szGrpFile,EDataFile* pDat){if(m_grp_terrain.Load(szGrpFile,pDat)==FALSE){MessageBox(NULL,szGrpFile,"加载错误",MB_OK);return FALSE;}return TRUE;。
c语言编写坦克大战源代码
#include "tank.h"#include "ConOperator.h"#include <time.h>#include <windows.h>#include <conio.h>#include <iostream>using namespace std;TankGame::TankGame(int w, int h){// 设定当前关数no = 1;// 设定游戏整体高宽wide = w;high = h;HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);COORD sizePos = {2 * wide, high};SetConsoleScreenBufferSize(hStdOut, sizePos);// 分配游戏空间状态表gameSpace = new GameSpace*[high];for (int i = 0; i != high; i++)gameSpace[i] = new GameSpace[wide];// 添加围墙wall = new Wall(gameSpace, wide, high);wall->draw();}void TankGame::load_init(){// 初始化游戏空间for (int y = 1; y != high-1; y++) {for (int x = 1; x != wide-1; x++) {gameSpace[y][x].have = false;gameSpace[y][x].kind = 0;gameSpace[y][x].no = 0;}}// 添加地图map.load(gameSpace, no);// 初始化自己坦克me.init_xy();me.trans_direction(1);me.set_no(0);me.init_move(gameSpace, wide / 2 - 2, high - 5);// 按顺序诞生敌人坦克creatPlace = 0;for (int i = 0; i != 3; i++) {freezeTime[i] = REBIRTHTIME;enemy[i].init_xy();enemy[i].set_kind(2);enemy[i].set_no(i+1);reset(enemy[i]);}// 数目初始化leftCount = 17;existCount = 3;// 显示图片me.draw_tank();for (int i = 0; i != 3; i++)enemy[i].draw_tank();map.draw();}TankGame::~TankGame(){if (wall)delete wall;if (gameSpace) {for (int i = 0; i != high; i++)delete[] gameSpace[i];delete[] gameSpace;}}void TankGame::reset(Tank& tank){bool success = false;int t = 3;while (t && !success) {creatPlace++;if (creatPlace == 4)creatPlace = 1;// 诞生地点选择switch (creatPlace) {case 1:tank.trans_direction(3); //朝下if (tank.reset(gameSpace,1,1))success = true;break;case 2:tank.trans_direction(3);if (tank.reset(gameSpace,wide / 2 - 2, 1))success = true;break;case 3:tank.trans_direction(3);if (tank.reset(gameSpace,wide - 4, 1))success = true;break;}if (!success)t--;}}void TankGame::start(){char command;enter_picture(command);if (command != ENTER)return;while (me.blood > 0) {// init data for runingload_init();// run a taskruning_a_task();// determine why returnif (me.blood > 0) {no++;if (no > map.total) {success_gameover();break;}char command;turn_to_next_task(command);if (command != ENTER)break;}else game_over();}}//voidvoid TankGame::runing_a_task(){while ((leftCount || existCount) && me.blood) {clock_t now = clock();char command = -1; // 主人命令while (clock() - now < TIME_UNIT) // 小于一个时间片,暂停update_keyBoard_char(command);/*更新敌人坦克*/for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0)continue;if (enemy[i].freezeTime == 0) {enemy[i].rand_direction(gameSpace); // 产生随机方向}else {if (enemy[i].speed == 0) {enemy[i].move(gameSpace);if (bullet[i+1].disapper) {int shot = -1;bullet[i+1] = enemy[i].rand_shot(gameSpace,i+1, shot);if (shot == 0)me.be_shot(gameSpace);bullet[i+1].registration(gameSpace);}enemy[i].freezeTime--;} else {enemy[i].speed--;}}}/*更新自己坦克*/if (command >=0 && command < 4) {me.trans_to_direction(command);me.move(gameSpace);}/*更新子弹*/for (int i = 0; i !=4; i++) {if (!bullet[i].disapper) { // 存在的子弹int shot;bullet[i].move(gameSpace, shot); // 运行,是否射中if (shot == 0)me.be_shot(gameSpace);else if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;} else if (shot >= 7 && shot <= 10) {bullet[shot-7].unregistration(gameSpace);bullet[shot-7].clear();bullet[shot-7].init(bullet[shot-7].kind);}}}/*自己产生子弹*/if (bullet[0].disapper) {if (command == 32) {int shot;bullet[0] = me.make_bullet(gameSpace,0, shot);if (shot >= 1 && shot <= 3) {enemy[shot-1].be_shot(gameSpace);existCount--;}bullet[0].registration(gameSpace);}}/*诞生缺损敌人*/if (leftCount > 0) {for (int i = 0; i != 3; i++) {if (enemy[i].blood == 0) {if (freezeTime[i] == 0) {freezeTime[i] = REBIRTHTIME;reset(enemy[i]);existCount++;leftCount--;}else freezeTime[i]--;}}}}}void TankGame::update_keyBoard_char(char& c){if (_kbhit()) {c = getch();if (c == -32) {c = getch();if (c != UP && c != DOWN && c != LEFT && c != RIGHT)c = -1;else if (c == RIGHT)c = 0;else if (c == UP)c = 1;else if (c == LEFT)c = 2;elsec = 3;}elsec = 32;}}void TankGame::enter_picture(char &command){string captions[6];captions[0] = "◥◣◢◤■■■■■◥◣◢◤";captions[1] = " ◥◣◢◤◢◤◥◣◢◤";captions[2] = " ◥◣◢◤◢◤◥◣◢◤";captions[3] = " ◢◤◢◤◢◤◥◣";captions[4] = " ◢◤◢◤◢◤◥◣";captions[5] = " ◢◤■■■■■◢◤◥◣";string s = " ";color(0x0e);for (int i = 0; i != 6; i++)grid(7, 6 + i, captions[i]);Frame frame(30,15);frame.draw_frame(4,19,0x09);string sentence[3];sentence[0] = "This small game is made by yzx in 2010.";sentence[1] = "Wlecome to play it.";sentence[2] = "All Rights Reserved.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(14+k,21+2*i,sentence[i][k]);sleep(50);}sleep(1000);}grid(7, 28,"Enter : 开始ESC : 退出");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}// clear screen picture in wallclear_picture();}void TankGame::turn_to_next_task(char& command){clear_picture();color(0x0e);grid(18, 20, "第");grid(20, 20, no);grid(22, 20, "关");while (true) {if (_kbhit()) {command = getch();if (command == ENTER || command == ESC)break;}}grid(18, 20," ");}void TankGame::success_gameover(){clear_picture();Frame frame(30,15);frame.draw_frame(4,10,0x09);string sentence[3];sentence[0] = "Congratulations for Successfully finishing all tasks";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";color(0x0e);for (int i = 0; i != 3; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(12+k,14+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::game_over(){clear_picture();Frame frame(30,15);frame.draw_frame(4,15,0x09);string sentence[4];sentence[0] = "Game over, but you can try it again.";sentence[1] = "Thank you for using it deeply.";sentence[2] = "And welcome to use it next time.";sentence[3] = "All rights reserved.(Violators will be prosecuted.) .";color(0x0e);for (int i = 0; i != 4; i++) {for (int k = 0; k != sentence[i].size(); k++) {grid(13+k,18+2*i,sentence[i][k]);sleep(50);}sleep(1000);}while (true) {if (_kbhit()) {char command = getch();if (command == ENTER || command == ESC)break;}}}void TankGame::clear_picture(){int cirX = wide / 2;int cirY = high / 2;int depth = cirY > cirX ? cirY + 2 : cirX + 2;int lx, rx, uy, by;int l, r, u, b;for (int i = 0; i != depth; i++) {lx = cirX - i;rx = cirX + i;uy = cirY - i;by = cirY + i;uy <= 0 ? u = 1 : u = uy;by >= high - 1 ? b = high - 2 : b = by;lx <= 0 ? l = 1 : l = lx;rx >= wide -1 ? r = wide - 2 : r = rx;if (rx < wide - 1) {for (int k = u; k <= b; k++)grid(rx, k, " ");}if (lx > 0) {for (int k = u; k <= b; k++)grid(lx, k, " ");}if (by < high - 1) {for (int k = l; k <= r; k++)grid(k, by, " ");}if (uy > 0) {for (int k = l; k <= r; k++)grid(k, uy, " ");}}}void TankGame::test(){for (int y = 0; y != 40; y++) {for (int x = 0; x != 40; x++) {if (gameSpace[y][x].have)// && gameSpace[y][x].kind == 3)grid(x, 42+y, (char)gameSpace[y][x].no);elsegrid(x, 42+y, " ");}}}。
现式坦克大战作文
现式坦克大战作文《现式坦克大战之小区惊现“坦克军团”》在我的生活里,有这么一次特别的经历就像现实版的坦克大战。
我们小区不知怎么的,来了一群“小坦克”,当然不是真的那种军事打仗的坦克,而是一群小小孩骑着他们的小三轮自行车。
那阵仗,可真是像足了坦克大军。
我记得那是个阳光明媚的周末,我本想在小区楼下安静地晒晒太阳,看看书。
谁知道这“坦克大战”就这么猝不及防地开始了。
这些小三轮自行车,五颜六色的,红的像火,蓝的像天,还有那花花绿绿贴满卡通贴纸的。
每辆车上都坐着个小娃娃,大的不过五六岁,小的可能才三岁左右。
有个小男孩,骑着一辆蓝色的小三轮,那小样儿,可威风了,他头戴一个蓝色的小帽子,就像是坦克兵的头盔。
只见他一马当先冲了出去,后面跟着一群小同伴。
他们大呼小叫的,一会儿这个喊“加速,要撞上啦”,一会儿那个喊“转弯,转弯”。
那辆蓝色小三轮就像一辆勇往直前的坦克,横冲直撞。
突然,前面出现了个小土坡,这小男孩丝毫没有犹豫,加油门就往上冲。
只可惜,小小的三轮哪有那么大的动力,冲到一半就往后滑了一点点。
小男孩却不愿意放弃,小脸蛋憋得通红,双脚不断地用力蹬着踏板,嘴里还喊着“冲啊”。
最后在其他小伙伴的欢呼声中成功爬上了土坡。
这边刚爬上去,另一边两个小丫头骑着粉色的小三轮就开始了“对决”。
她俩小心翼翼地盯着对方,脚下慢慢移动,就像是两辆在战场上对峙的坦克。
然后突然同时加速,小三轮歪歪扭扭地冲向对方,就在要碰到的瞬间,又特别有默契地同时转弯,逗得周围的大人哈哈大笑。
我也被这有趣的场景感染了,一本书就那么扔到了一边,专心看起这“现式坦克大战”来了。
这场小区里的“现式坦克大战”,虽然没有什么真正的硝烟,也没有那种军事战场上的紧张刺激,但是满是小孩子们单纯的快乐和童趣。
那一辆辆小小的三轮自行车载着的不仅仅是那些小小孩,还有一份独属于孩子的勇敢和童真,就像真的坦克给战士们的力量和勇气一样。
《再遇“坦克大战”之公园版》要说这“坦克大战”还真不是偶然事件,不久之后我在公园里又见识了一场升级版的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#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);//这个不再注释了。