(part 1)用C/C++实现简单游戏开发:easyx实现"2048"

我花了两天学习EASYX图形库,想实现一个2048小游戏。接下来是我的实现步骤:

一、编译开发环境:Microsoft Visual Studio 以及其 windows控制台插件、easyx图形库插件

软件以及插件的安装,就不在此表述了,傻瓜式安装。

二、开始实现2048项目:

1.首先新建一个名为2048的windows控制台项目,其中包括一个pch.h头文件和一个2048.cpp源文件

2.设计分析:为了实现2048需要实现一些小的功能模块,也就是一些功能函数。(因为我最近在学C++所以就实现中主要运用了C++的知识,涉及到简单的继承、封装以及多态原理)就具体而言,需要 下列功能模块:

         a.一个游戏开始前的界面,包含一些游戏信息,如游戏名称,游戏完成设计时间,游戏作者等信息;

         b.一个游戏内的界面,包括游戏的4*4宫格、游戏得分等信息;

         c.宫格的数字变动的逻辑设计实现

         d.宫格的数字显示在游戏内界面的模块(此条可以与 b. 一同实现)

         e.游戏的终点设计,即所有数字无法移动合并就表示游戏结束,显示游戏结束的相关信息。

3.代码实现:

         (1).首先实现游戏开始前的界面:

                    分别在头文件和源文件中添加新建一个Game.h和Game,cpp文件,Game.h用来写实现的类的代码,Game.cpp用来写类中成员函数的定义的代码。(新手注意,开始写任何源文件之前,都要加上#include“pch.h”,避免出错)。  接下来,就是Game.h的代码编写。在Game.h中定义一个Game类,用来实现游戏大部分的功能的集合,这里就包括需要用到宫格元素的矩阵内容,因为后面需要使用矩阵的一些类内成员函数,因此这里将Game类继承矩阵类Array比较方便,故先写矩阵类Array。同样建立一个Array.h和Array.cpp,在Array中编写矩阵类:

#pragma once

#ifndef ARRAY_H
#define ARRAY_H

struct point {/*点结构体,方便对矩阵元素位置进行分析与操作*/
	int i;
	int j;
};

class Array {
private:
	int array[4][4];/*4阶矩阵用这个二维数组表示*/
public :
	Array();/*构造函数*/
	~Array() {};/*析构函数*/
	void TestShowArray();/*打印矩阵*/
	int CreatNewElem();/*创造随机2048数:2或4*/
	bool IfNullElem(point *p);
	/*是否存在非0实数已经占据该位置,存在则返回false,否则返回true*/
	point* CreateNewLocate();/*生成新的随机点*/
	void SetNewPoint();/*将随机点设置新数*/
	bool IfFullArray();/*是否为满矩阵,即无法重叠和移动元素的矩阵*/
	int GetArray(int i,int j);/*取出下标为i,j的元素*/
};

#endif //ARRAY_H

接下来是对这个类中的函数成员进行定义,代码写在Array.cpp中:

#include "pch.h"
#include "Array.h"//指明定义所指
#include 
#include 
#include 
using namespace std;

Array::Array()/*构造函数,将4阶矩阵所有元素都初始化为0*/
{
	int i, j;
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
			array[i][j] = 0;
	}
}

void Array::TestShowArray()/*用于测试的输出函数,观察矩阵内部元素的值*/
{
	int i, j;
	SetNewPoint();
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
			cout << array[i][j] << "\t";
		cout << "\n";
	}
}

int Array::CreatNewElem()/*创建新的元素值:2或者4*/
{
	int *r = new int();
	return (int)r%2 == 0 ? 2 : 4;
}

bool Array::IfNullElem(point *p)/*判断点p所指的位置是否有非零元素*/
{
	return array[p->i][p->j] ? false : true;
}
/*一维随机数转换二位随机点*/
point * Array::CreateNewLocate()
{
	point *x = new point();
	x->i = 1;
	x->j = 1;
	while (!IfNullElem(x)){
		int rL;
		srand(time(NULL));
		rL = rand() % 16;
		x->j = rL % 4;
		x->i = (rL - x->j) / 4;
	}
	return x;
}

void Array::SetNewPoint()/*创建一个位置点,包含了位置的横纵坐标*/
{
	int NewEle;
	point *p;
	NewEle = CreatNewElem();
	p = CreateNewLocate();
	array[p->i][p->j] = NewEle;
}

bool Array::IfFullArray()/*判断矩阵是否已经达到饱和,即无法继续下去*/
{
	int i, j;
	for (i = 0; i < 4; i++)
	{
		for (j = 0; j < 4; j++)
		{
			if(array[i][j])
				return false;
			if ((j <= 2 && array[i][j] == array[i][j + 1]) ||
				(j >= 1 && array[i][j] == array[i][j - 1]) ||
				(i <= 2 && array[i][j] == array[i + 1][j]) ||
				(i >= 1 && array[i][j] == array[i - 1][j]))
				return false;
		}
	}
	return true;
}

int Array::GetArray(int i, int j)/*获取位置i,j的元素值*/
{
	return array[i][j];
}

接下来就可以测试当前的所有代码是否有一个好的效果,在主函数中:

#include "pch.h"
#include "Array.h"
#include 
using namespace std;

int main(){
    Array ar;
    ar.TestShowArray();
    return 0;
}

现在就可以进行运行了,结果会显示如下:

(part 1)用C/C++实现简单游戏开发:easyx实现

其中有一个随机生成的数 2 。

这样,第一小部分就完成了。下一部分会通过类的继承实现Game类,并设计游戏界面,如下:(我设计的比较简陋)

(part 1)用C/C++实现简单游戏开发:easyx实现(part 1)用C/C++实现简单游戏开发:easyx实现

写的很简陋(不好看),毕竟我也是新手,相信慢慢会变强的。下次有时间我会补上后面的实现。

你可能感兴趣的:(c++)