拿到我们上一节得到的map.txt,就可以简单把图画出来(只是实验,并不是最终版本)。
效果图
因为要直接“借鉴”原版的地图,我们需要用cheatengine查好每种数字之后对应的是什么图片,基本块我会放在代码后面。
然后直接循环输出就好了。这个时候我们要定义一下一个地图中基本块占的像素个数,原版的大概是16的样子。
这个基本块大小MinSize指的并不是最小块,因为一个基本块还能被打成四分之一大小,一个坦克的大小大致对应四块砖头。
贴一下代码
#include<graphics.h> #include<iostream> #include<fstream> #include<set> #include <iomanip>//输出宽度setw #define MinSize 18 using namespace std; int Map[28][32]; IMAGE MapPic[100]; int calhex(string s) { int base = 1,res = 0; for (int i = 1; i >= 0; i--) { if (s[i] >= 'A') res += base * (s[i] - 'A' + 10); else res += base * (s[i] - '0'); base *= 16; } return res; } void LoadTxtMap() { std::ifstream map_file; map_file.open("map.txt"); for (int i = 0; i < 28; i++) { for (int j = 0; j < 32; j++) { string tem; map_file >> tem; Map[i][j] = calhex(tem); } } } void OutoutTxtMap() { for (int i = 0; i < 28; i++) { for (int j = 0; j < 32; j++) { cout << setw(3) << Map[i][j] << ' '; } cout << ' '; } } void LoadPic() { loadimage(&MapPic[1], _T("Image\wall.png"), MinSize, MinSize, false); loadimage(&MapPic[2], _T("Image\iron.png"), MinSize, MinSize, false); loadimage(&MapPic[3], _T("Image\border.png"), MinSize, MinSize, false); loadimage(&MapPic[4], _T("Image\border.png"), MinSize, MinSize, false);//没找到素材 loadimage(&MapPic[5], _T("Image\commander0.png"), MinSize*2, MinSize*2, false); loadimage(&MapPic[6], _T("Image\enemy_mark_ps.png"), MinSize, MinSize, false); loadimage(&MapPic[7], _T("Image\player_mark_ps.png"), MinSize, MinSize, false); loadimage(&MapPic[8], _T("Image\flag_ps.png"), MinSize*2, MinSize*2, false); } void PicShow() { initgraph(MinSize*32, MinSize*28); set<int> CanShow; CanShow.insert(16),CanShow.insert(32), CanShow.insert(17), CanShow.insert(15), CanShow.insert(200), CanShow.insert(201), CanShow.insert(202), CanShow.insert(203), CanShow.insert(0); for (int i = 0; i < 28; i++) { for (int j = 0; j < 32; j++) { IMAGE pic; switch (Map[i][j]) { /* 0空地 1 2 4 8代表左上,右上,左下,右下 15整块砖块 16 铁 17 边界 106 敌军的maek 20 玩家的 mark 88 字母I 19 字母P 112 数字2 108 棋子的左上角 表示关卡 还有三个(顺时针)252 253 109 111 数字1 200 老窝左上角 */ case 0: break; case 16: pic = MapPic[2]; break; case 15: pic = MapPic[1]; break; case 17: pic = MapPic[3]; break; case 200: pic = MapPic[5]; break; default: break; } if (CanShow.count(Map[i][j])) //只要一层 if (Map[i][j]) putimage(j * MinSize, i * MinSize, &pic); else; else { putimage(j * MinSize, i * MinSize, &MapPic[3] ); //放一层边界 switch (Map[i][j]){ case 106: putimage(j * MinSize, i * MinSize, &MapPic[6]); break; case 90:// I case 88: outtextxy(j * MinSize, i * MinSize, TCHAR('I')); break; case 19:// P outtextxy(j * MinSize, i * MinSize, TCHAR('P')); break; case 20:// P putimage(j * MinSize, i * MinSize, &MapPic[7]); break; case 108: putimage(j * MinSize, i * MinSize, &MapPic[8]); break; default: break; } } if (Map[i][j] >= 110 && Map[i][j] <= 168) { char a[10]; _itoa_s(Map[i][j], a, 10); TCHAR s[] = _T("a"); outtextxy(j * MinSize, i * MinSize, s); } } } putimage(29 * MinSize, 22 * MinSize, &MapPic[8]); } int MapShow() { LoadTxtMap(); if(0) OutoutTxtMap(); else { LoadPic(); PicShow(); } system("pause"); return 0; }
可以右击保存
命名如下: