用C++实现DL游戏(class方法)

咳咳,看到别人用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.

 

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/80243108