c++语言2048游戏编码,2048源代码~~小游戏。C++实现

每一个学习软件工程的人,都很想自己写出游戏的代码,我也不例外,但是,能写出一些小游戏的代码,并不能说明你很厉害,而只能说明你对于这门语言你比较熟悉了。

2048这个游戏,是一两年前很火的游戏,不过现在也没什么人在玩了,闲来没事,就写了一下这个游戏,控制台上实现的,目前我还不会写窗口,所以很多东西都只能在控制台上来实现了。

2048这个小游戏,主要的是上下左右移动后,相同的数合并,不相同的数原样输出,而你就是要判断每一行或每一列有没有相同的,还有一点就是,数字有移动,就产生新的数,没有,什么都不用做。

下面是头文件的:

class New2048

{

public:

New2048() //构造函数,初始话数据。

{

for (int i = 0; i

for (int j = 0; j

a[i][j] = 0;

num = 0;

}

void make_frame(); //打印框架函数。

void display_num(); //打印数字函数。

void creat_num(); //随机产生数函数

void RightMove(); //右移函数

void LeftMove(); //左移函数

void UpMove(); //上移函数

void DownMove(); //下移函数

int cheak(); //检查游戏是否结束函数

void clean(); //清理显示出来的数字

~New2048(){}

private:

int a[4][4];

int num;

};

下面是各个函数的cpp文件:

# include

# include

# include

# include

# include “2048.h”

using namespace std;

HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄

void gotoxy(HANDLE hOut, int x, int y) //输出位置的函数

{

COORD pos;

pos.X = x;

pos.Y = y;

SetConsoleCursorPosition(hOut, pos);

}

void New2048::make_frame() //打印框架

{

gotoxy(hOut, 0, 0);

cout

cout

cout

cout

cout

cout

cout

cout

cout

cout

}

void New2048::clean()

{

int k = 0, l = 0;

for (int i = 2; i

{

l = 0;

for (int j = 2; j

{

gotoxy(hOut, i, j);

printf(” “);

l++;

}

k++;

}

}

void New2048::display_num() //打印数字

{

int k = 0, l = 0;

for (int i = 2; i

{

l = 0;

for (int j = 2; j

{

gotoxy(hOut, i, j); //找到各个位置并输出数字

a[l][k] == 0 printf(” “) : printf(“%d”, a[l][k]);

l++;

}

k++;

}

gotoxy(hOut, 13, 0);

cout

gotoxy(hOut, 0, 10);

}

void New2048::creat_num() //随机产生坐标位置和该位置的数 2 或 4

{

int i, j, num;

srand((unsigned)time(NULL)); //随机数产生初始化,不然产生的数一直相同

i = (rand() % (4)) + 0;

j = (rand() % (4)) + 0;

while (a[i][j]) //该位置上的数不是0,重新产生

{

i = (rand() % (4)) + 0;

j = (rand() % (4)) + 0;

}

num = (rand() % (4)) + 1; //产生的是1就自增,是3便自减或自增,都可以的

if (num == 1)

++num;

if (num == 3)

–num;

a[i][j] = num;

}

int New2048::cheak()

{

int i, j, flag = 0, tag = 0;

for (i = 0; i

{

for (j = 0; j

{

if (a[i][j] == 0)

{

tag = 1;

break;

}

}

if (tag == 1)

break;

}

if (tag) //有,返回1。

return 1;

for (i = 0; i

{

for (j = 0; j

{

if (a[i][j] == a[i][j + 1])

{

flag = 1;

break;

}

}

if (flag == 1)

break;

}

for (j = 0; j

{

for (i = 0; i

{

if (a[i][j] == a[i + 1][j])

{

flag = 1;

break;

}

}

if (flag == 1)

break;

}

if (tag == 0 && flag == 0) //flag = 0 和 tag = 0,游戏结束。

return 0;

else //否则,继续游戏

return 1;

}

void New2048::DownMove() //下移的情况

{

int k, tag = 0;

for (int i = 0; i

{

int b[4] = { 0 }; //定义一个临时数组来存储相加之后的情况

k = 3;

for (int j = 3; j > 0; j–)

{

if (a[j][i] != 0)

{

int flag = 0;

for (int l = j – 1; l >= 0; l–) //找是否有相同的数

{

if (a[l][i] != 0)

{

flag = 1;

if (a[l][i] == a[j][i])

{

b[k–] = 2 * a[j][i];

num++;

a[l][i] = a[j][i] = 0;

break;

}

else

{

b[k–] = a[j][i];

break;

}

}

}

if (flag == 0)

b[k–] = a[j][i];

}

}

b[k] = a[0][i]; //最后一个没有检查,赋值过去,不管是否为0,都无所谓的

for (int j = 0; j

{

if (a[j][i] != b[j])

{

tag = 1;

break;

}

}

for (int j = 0; j

a[j][i] = b[j];

}

if (tag) //存在移动,产生新的数

creat_num();

}

void New2048::LeftMove() //同上

{

int k, tag = 0;

for (int i = 0; i

{

int b[4] = { 0 };

k = 0;

for (int j = 0; j

{

if (a[i][j] != 0)

{

int flag = 0;

for (int l = j + 1; l

{

if (a[i][l] != 0)

{

flag = 1;

if (a[i][l] == a[i][j])

{

b[k++] = 2 * a[i][j];

num++;

a[i][j] = a[i][l] = 0;

break;

}

else

{

b[k++] = a[i][j];

break;

}

}

}

if (flag == 0)

b[k++] = a[i][j];

}

}

b[k] = a[i][3];

for (int j = 0; j

{

if (a[i][j] != b[j])

{

tag = 1;

break;

}

}

for (int j = 0; j

a[i][j] = b[j];

}

if (tag)

creat_num();

}

void New2048::RightMove() //同上

{

int k, tag = 0;

for (int i = 0; i

{

int b[4] = { 0 };

k = 3;

for (int j = 3; j > 0; j–)

{

if (a[i][j] != 0)

{

int flag = 0;

for (int l = j – 1; l >= 0; l–)

{

if (a[i][l] != 0)

{

flag = 1;

if (a[i][l] == a[i][j])

{

b[k–] = 2 * a[i][j];

num++;

a[i][j] = a[i][l] = 0;

break;

}

else

{

b[k–] = a[i][j];

break;

}

}

}

if (flag == 0)

b[k–] = a[i][j];

}

}

b[k] = a[i][0];

for (int j = 0; j

{

if (a[i][j] != b[j])

{

tag = 1;

break;

}

}

for (int j = 0; j

a[i][j] = b[j];

}

if (tag)

creat_num();

}

void New2048::UpMove()

{

int k, tag = 0;

for (int i = 0; i

{

int b[4] = { 0 }; //定义一个临时数组来存储相加之后的情况

k = 0;

for (int j = 0; j

{

if (a[j][i] != 0)

{

int flag = 0;

for (int l = j + 1; l

{

if (a[l][i] != 0)

{

flag = 1;

if (a[l][i] == a[j][i])

{

b[k++] = 2 * a[j][i];

num++;

a[l][i] = a[j][i] = 0;

break;

}

else

{

b[k++] = a[j][i];

break;

}

}

}

if (flag == 0)

b[k++] = a[j][i];

}

}

b[k] = a[3][i];

for (int j = 0; j

{

if (a[j][i] != b[j])

{

tag = 1;

break;

}

}

for (int j = 0; j

a[j][i] = b[j];

}

if (tag)

creat_num();

}

主函数的cpp文件:

# include

# include

# include “2048.h”

using namespace std;

int main()

{

while (1)

{

char ch;

system(“cls”); //清屏

system(“color 3B”); //改变背景和字体颜色

New2048 s;

s.make_frame(); //打印框架

s.creat_num();

s.creat_num(); //产生两个随机数

s.display_num(); //显示数字

while (1)

{

ch = _getch(); //如果不是VS的,_getch应该改成getch

if (ch == ‘a’ || ch == ‘s’ || ch == ‘d’ || ch == ‘w’ || ch == ‘ ‘ ||

ch == ‘A’ || ch == ‘S’ || ch == ‘D’ || ch == ‘W’)

break;

}

p:switch (ch)

{

case ‘s’:

case ‘S’:

{

while (s.cheak())

{

s.DownMove(); //下移

s.clean(); //清理

s.display_num(); //显示数字

while (1)

{

ch = _getch();

if (ch == ‘a’ || ch == ‘s’ || ch == ‘d’ || ch == ‘w’ || ch == ‘ ‘ ||

ch == ‘A’ || ch == ‘S’ || ch == ‘D’ || ch == ‘W’)

break;

}

goto p;

}

}break;

case ‘d’:

case ‘D’:

{

while (s.cheak())

{

s.RightMove(); //右移

s.clean(); //清理

s.display_num(); //显示数字

while (1)

{

ch = _getch();

if (ch == ‘a’ || ch == ‘s’ || ch == ‘d’ || ch == ‘w’ || ch == ‘ ‘ ||

ch == ‘A’ || ch == ‘S’ || ch == ‘D’ || ch == ‘W’)

break;

}

goto p;

}

}break;

case ‘a’:

case ‘A’:

{

while (s.cheak())

{

s.LeftMove(); //左移

s.clean(); //清理

s.display_num(); //显示数字

while (1)

{

ch = _getch();

if (ch == ‘a’ || ch == ‘s’ || ch == ‘d’ || ch == ‘w’ || ch == ‘ ‘ ||

ch == ‘A’ || ch == ‘S’ || ch == ‘D’ || ch == ‘W’)

break;

}

goto p;

}

}break;

case ‘w’:

case ‘W’:

{

while (s.cheak())

{

s.UpMove(); //上移

s.clean(); //清理

s.display_num(); //显示数字

while (1)

{

ch = _getch();

if (ch == ‘a’ || ch == ‘s’ || ch == ‘d’ || ch == ‘w’ || ch == ‘ ‘ ||

ch == ‘A’ || ch == ‘S’ || ch == ‘D’ || ch == ‘W’)

break;

}

goto p;

}

}break;

default:

break;

} //退出switch,游戏结束

system(“cls”); //清屏

cout

while (1)

{

ch = _getch();

if (ch == ‘y’ || ch == ‘n’ || ch == ‘Y’ || ch == ‘N’)

break;

}

if (ch == ‘y’ || ch == ‘Y’) //Y继续

continue;

else //否则退出

break;

}

return 0;

}

游戏开始图片:

d3b1e97644fba0bdc5c52c4f607aa857.png

0751162f01a298ec9a979fd54a989923.png

这个或多或少的存在bug,如果发现了,欢迎来告诉我,好让我改正!~~

相关资源:糖烟茶酒行业管理软件 烟酒进销存店铺销售收银管理系统

来源:喝醉酒的鱼

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月19日
下一篇 2021年4月19日

相关推荐