我花了两天学习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 <iostream>
#include <stdlib.h>
#include <ctime>
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 <iostream>
using namespace std;
int main(){
Array ar;
ar.TestShowArray();
return 0;
}
现在就可以进行运行了,结果会显示如下:
其中有一个随机生成的数 2 。
这样,第一小部分就完成了。下一部分会通过类的继承实现Game类,并设计游戏界面,如下:(我设计的比较简陋)
写的很简陋(不好看),毕竟我也是新手,相信慢慢会变强的。下次有时间我会补上后面的实现。