咳咳,看到别人用C++编了N多游戏,自己怎么不能编一个!
本人第一个想到的就是DL(什么)
这里要说明的是,DL不是定义表······
于是,我一气之下,决定开始编。
(前排提示:一定要把dl.cpp和dl.h放到同一个工程内!)
这些是#include、宏什么的
#include<cstddef> #include<limits> #include<climits> #include<cfloat> #include<typeinfo> #include<exception> #include<ciso646> #include<cstdarg> #include<csetjmp> #include<csignal> #include<iostream> #include<iomanip> #include<ios> #include<istream> #include<ostream> #include<sstream> #include<fstream> #include<iosfwd> #include<streambuf> #include<cstdio> #include<cwchar> #include<stdexcept> #include<cassert> #include<cerrno> #include<utility> #include<functional> #include<memory> #include<ctime> #include<string> #include<cctype> #include<cwctype> #include<cstring> #include<cwchar> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<iterator> #include<algorithm> #include<ciso646> #include<complex> #include<valarray> #include<numeric> #include<cmath> #include<cstdlib> #include<locale> #include<clocale> #include<windows.h> #include<string> /*好吧其实不用这么多头文件*/ #define SPACE 0 // 空位 #define BARRIER 1 // 障碍 #define DIAMOND 2 // 宝石 #define CHECKPOINT 3 // 检查点 #define LINED 4 // 走过的地方 #define END 5 // 终点 #define NOTSTART 0 // 未开始 #define RUNNING 1 // 进行中 #define DEAD 2 // 游戏结束 #define WIN 3 // 赢了 /*上下左右你们肯定都知道*/ #define UP 0 #define RIGHT 1 #define DOWN 2 #define LEFT 3 #define __DL_SIZE 10001 // 地图的大小 #define standarddir 0,1,0,1 // 默认方向
正片开始
定义一个dl类型:
class dl { };
成员:(编辑前这里出了点问题,不知道现在有没有)
class dl { public: int dmap[__DL_SIZE][__DL_SIZE]; int __stadus; int linex; int liney; int dir; bool usedir[4]; int dirs[2]; int diamonds; int checkpointx; int checkpointy; void clear(void); void setdir(bool __up, bool __down, bool __left, bool __right); void move(void); int stadus(void); void start(int __x, int __y); void setmap(int __n, int __m); void turn(void); };
各种函数:
void dl::clear(void) // 清除地图 { memset(dmap, 0, sizeof (dmap)); /*重置各种数组*/ memset(usedir, 0, sizeof (usedir)); memset(dirs, 0, sizeof (dirs)); dir = UP; checkpointx = 0; /*各种数据归零*/ checkpointy = 0; diamonds = 0; __stadus = NOTSTART; return; } void dl::setdir(bool __up, bool __down, bool __left, bool __right) // 设置方向 { int k = 0; memset(usedir, 0, sizeof (usedir)); if (__up) { usedir[UP] = true; if (k < 2) { dirs[k++] = UP; } } if (__down) { usedir[DOWN] = true; if (k < 2) { dirs[k++] = DOWN; } } if (__left) { usedir[LEFT] = true; if (k < 2) { dirs[k++] = LEFT; } } if (__right) { usedir[RIGHT] = true; if (k < 2) { dirs[k++] = RIGHT; } } dir = dirs[0]; return; } void dl::move(void) // 往前移动 { int temp; switch (dir) // 四个方向 { case UP: linex--; break; case DOWN: linex++; break; case LEFT: liney--; break; case RIGHT: liney++; break; } temp = dmap[linex][liney]; if (temp == BARRIER) { __stadus = DEAD; // 游戏结束 return; } if (temp == DIAMOND) { diamonds++; // 收集到宝石 } if (temp == CHECKPOINT) { checkpointx = linex; // 到达检查点 checkpointy = liney; } if (temp == END) { __stadus = WIN; //到达终点 } dmap[linex][liney] = LINED; // 设为走过的 return; } int dl::stadus(void) // 状态 { return __stadus; } void dl::start(int __x, int __y) // 开始游戏 { diamonds = 0; // 宝石数归零 checkpointx = __x; /*首个检查点为起点*/ checkpointy = __y; linex = __x; /*位置为起点*/ liney = __y; __stadus = RUNNING; // 状态设为进行中 dir = dirs[0]; dmap[__x][__y] = LINED; // 标记为走过 return; } void dl::setmap(int __n, int __m) // 读入地图 { int i, j; for (i = 0; i < __n; i++) { for (j = 0; j < __m; j++) { std::cin >> dmap[i][j]; // 输入数据 } } return; } void dl::turn(void) // 转个弯 { if ((dir != dirs[0]) && (dir != dirs[1])) // 不符合,转不了弯 { return; } if (dir == dirs[0]) /*转变方向*/ { dir = dirs[1]; return; } dir = dirs[0]; return; }
这是dl.h的全部代码:
#include<cstddef> #include<limits> #include<climits> #include<cfloat> #include<typeinfo> #include<exception> #include<ciso646> #include<cstdarg> #include<csetjmp> #include<csignal> #include<iostream> #include<iomanip> #include<ios> #include<istream> #include<ostream> #include<sstream> #include<fstream> #include<iosfwd> #include<streambuf> #include<cstdio> #include<cwchar> #include<stdexcept> #include<cassert> #include<cerrno> #include<utility> #include<functional> #include<memory> #include<ctime> #include<string> #include<cctype> #include<cwctype> #include<cstring> #include<cwchar> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<iterator> #include<algorithm> #include<ciso646> #include<complex> #include<valarray> #include<numeric> #include<cmath> #include<cstdlib> #include<locale> #include<clocale> #include<windows.h> #include<string> #define SPACE 0 #define BARRIER 1 #define DIAMOND 2 #define CHECKPOINT 3 #define LINED 4 #define END 5 #define NOTSTART 0 #define RUNNING 1 #define DEAD 2 #define WIN 3 #define UP 0 #define RIGHT 1 #define DOWN 2 #define LEFT 3 #define __DL_SIZE 10001 #define standarddir 0,1,0,1 class dl { public: int dmap[__DL_SIZE][__DL_SIZE]; int __stadus; int linex; int liney; int dir; bool usedir[4]; int dirs[2]; int diamonds; int checkpointx; int checkpointy; void clear(void); void setdir(bool __up, bool __down, bool __left, bool __right); void move(void); int stadus(void); void start(int __x, int __y); void setmap(int __n, int __m); void turn(void); }; void dl::clear(void) { memset(dmap, 0, sizeof (dmap)); memset(usedir, 0, sizeof (usedir)); memset(dirs, 0, sizeof (dirs)); dir = UP; checkpointx = 0; checkpointy = 0; diamonds = 0; __stadus = NOTSTART; return; } void dl::setdir(bool __up, bool __down, bool __left, bool __right) { int k = 0; memset(usedir, 0, sizeof (usedir)); if (__up) { usedir[UP] = true; if (k < 2) { dirs[k++] = UP; } } if (__down) { usedir[DOWN] = true; if (k < 2) { dirs[k++] = DOWN; } } if (__left) { usedir[LEFT] = true; if (k < 2) { dirs[k++] = LEFT; } } if (__right) { usedir[RIGHT] = true; if (k < 2) { dirs[k++] = RIGHT; } } dir = dirs[0]; return; } void dl::move(void) { int temp; switch (dir) { case UP: linex--; break; case DOWN: linex++; break; case LEFT: liney--; break; case RIGHT: liney++; break; } temp = dmap[linex][liney]; if (temp == BARRIER) { __stadus = DEAD; return; } if (temp == DIAMOND) { diamonds++; } if (temp == CHECKPOINT) { checkpointx = linex; checkpointy = liney; } if (temp == END) { __stadus = WIN; } dmap[linex][liney] = LINED; return; } int dl::stadus(void) { return __stadus; } void dl::start(int __x, int __y) { diamonds = 0; checkpointx = __x; checkpointy = __y; linex = __x; liney = __y; __stadus = RUNNING; dir = dirs[0]; dmap[__x][__y] = LINED; return; } void dl::setmap(int __n, int __m) { int i, j; for (i = 0; i < __n; i++) { for (j = 0; j < __m; j++) { std::cin >> dmap[i][j]; } } return; } void dl::turn(void) { if ((dir != dirs[0]) && (dir != dirs[1])) { return; } if (dir == dirs[0]) { dir = dirs[1]; return; } dir = dirs[0]; return; }
接下来是dl.cpp:
#if 0 /*测试用地图*/ 0 0 0 3 2 0 0 0 0 0 0 2 0 3 2 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 3 2 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 2 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 5 5 #endif #include "dl.h" #define SIZE 15000 #define KEY_DOWN(a) ((GetAsyncKeyState(a) & 0x8000) ? 1:0) // 检测一个键是否按下,感谢everlasting__的方法 using namespace std; dl d, tempdl; void color(int a) // 改变颜色,感谢everlasting__的方法 { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a); return; } int main(int argc, char** argv) // 主函数 { int n, m, i, j, k = 0; char c; d.clear(); cin >> n >> m; tempdl.setmap(n, m); // 读入数据 d = tempdl; d.start(0, 0); d.setdir(standarddir); // 设置方向 system("cls"); // 清屏 for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { switch (d.dmap[i][j]) { case 0: color(15); cout << "■"; break; case 1: color(9); cout << "■"; break; case 2: color(10); cout << "●"; break; case 3: color(6); cout << "★"; break; case 4: color(12); cout << "■"; break; case 5: color(8); cout << "▲"; } } cout << endl; } Sleep(1000); // 一秒钟的缓冲时间 while (true) { Sleep(10); // 等待 k++; // 这是为了增加灵敏度 system("cls"); // 清屏 for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { switch (d.dmap[i][j]) // 输出地图 { case 0: color(15); cout << "■"; break; case 1: color(9); cout << "■"; break; case 2: color(10); cout << "●"; break; case 3: color(6); cout << "★"; break; case 4: color(12); cout << "■"; break; case 5: color(8); cout << "▲"; } } cout << endl; } if (d.dir == RIGHT) /*输出方向*/ { color(15); cout << "→" << endl; } else { color(15); cout << "↓" << endl; } color(10); cout << "d : " << d.diamonds << endl; // 输出宝石数 if (KEY_DOWN(' ')) // 按下空格则转弯 { d.turn(); } if (k == 4) // 移动,为了灵敏度! { d.move(); k = 0; } if (d.stadus() == DEAD) // 单局游戏结束 { color(15); cout << "continue?" << endl; cin >> c; if (c == 'y') // 检查点复活,输入'y'则复活 { i = d.checkpointx; /*回到上一个检查点*/ j = d.checkpointy; d = tempdl; // 恢复原地图(清除所有的LINED) d.start(i, j); // 开始 d.setdir(standarddir); // 重置方向 if (d.dmap[i+1][j] == BARRIER) // 若下面有障碍物则转变方向 { d.turn(); } continue; } cout << "GAME OVER" << endl; // 输出游戏结束信息 break; } if (d.stadus() == WIN) // 赢了 { color(15); cout << "YOU WIN" << endl; // 输出游戏结束信息 break; } } main(argc, argv); // 再来一遍游戏 return 0; }
自定义地图方式:
先输入地图的行数和列数。
接下来,每一个位置,都要输入一个整数:
0:空地
1:障碍
2:宝石
3:检查点
5:终点
游戏从(0,0)开始。
如果你要从别的地方开始的话,可以改一下,很简单的。
大家可以复制代码哦。祝大家玩得愉快!
This is the end of Part 1.