C# · 12月 20, 2021

C语言实现2048游戏(ege图形库版)

这几天看到我们班上一个大神写了一个2048出来,我自己也想尝试一下,经过几天自己尝试努力下,自己终于写出来了。现在和大家分享一下,也希望能得到大神的指点。

实现的效果如图

先来讲一下我的思路吧

1.首先肯定是要一个4X4的二维数组来存放数字存放0、2、4……

2.游戏开始与过程中需要随机出现2或者4,所以需要调用time.h这个库

3.游戏开始时,假如当获取字符为‘w’则先用循环判定这个数字的下方有无和它相等的数字。如无则跳过,如有相加。然后在判定是否可以向上移动

下面是我的代码

(我本来是还要写一个撤回的函数 可惜写出来却不能运行。求大神指教)

#include

//#include

#include

#include

#include

int _back[4][4] = {};

void draw();//绘图

void play();

void init();//初始化数字

void _up();//向上移动

void _down();//向下移动

void _left();//像左移动

void _right();//向右移动

void add_number();//增加一个数字

int a[4][4] = { 0 };

int emtpy;

//空格的数量

void draw()

{

int i,j;

for (i = 0; i < 4; i++)

{

for (j = 0; j < 4; j++)

{

_back[i][j] = a[i][j];

PIMAGE img;

img = newimage();

switch (a[i][j])

{

case 0:

{

getimage(img,”2048\0.png”);

putimage(j * 180,i * 180,img);

break;

}

case 2:

{

getimage(img,”2048\2.png”);

putimage(j * 180,img);

break;

}

case 4:

{

getimage(img,”2048\4.png”);

putimage(j * 180,img);

break;

}

case 8:

{

getimage(img,”2048\8.png”);

putimage(j * 180,img);

break;

}

case 16:

{

getimage(img,”2048\16.png”);

putimage(j * 180,img);

break;

}

case 32:

{

getimage(img,”2048\32.png”);

putimage(j * 180,img);

break;

}

case 64:

{

getimage(img,”2048\64.png”);

putimage(j * 180,img);

break;

}

case 128:

{

getimage(img,”2048\128.png”);

putimage(j * 180,img);

break;

}

case 256:

{

getimage(img,”2048\256.png”);

putimage(j * 180,img);

break;

}

case 512:

{

getimage(img,”2048\512.png”);

putimage(j * 180,img);

break;

}

case 1024:

{

getimage(img,”2048\1024.png”);

putimage(j * 180,img);

break;

}

case 2048:

{

getimage(img,”2048\2048.png”);

putimage(j * 180,img);

break;

}

}

}

}

}

void init()

{

int x,y;

srand(time(0));

x = rand() % 4;

y = rand() % 4;

a[x][y] = 2;

emtpy = 15;

}

void _up()

{

int x,y,i;

for (y = 0; y < 4; ++y) { // 从上向下合并相同的方块

for (x = 0; x < 4; ++x) {

if (a[x][y] == 0)

;

else {

for (i = x + 1; i < 4; ++i) {

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

;

else if (a[x][y] == a[i][y]) {

a[x][y] += a[i][y];

a[i][y] = 0;

++emtpy;

x = i;

break;

}

else {

break;

}

}

}

}

}

for (y = 0; y < 4; ++y) // 向上移动箱子

for (x = 0; x < 4; ++x)

{

if (a[x][y] == 0)

;

else {

for (i = x; (i > 0) && (a[i – 1][y] == 0); –i) {

a[i – 1][y] = a[i][y];

a[i][y] = 0;

}

}

}

}

void _down() {

int x,i;

for (y = 0; y < 4; ++y) // 向下合并相同的方格

for (x = 3; x >= 0; –x) {

if (a[x][y] == 0)

;

else {

for (i = x – 1; i >= 0; –i) {

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

;

else if (a[x][y] == a[i][y]) {

a[x][y] += a[i][y];

a[i][y] = 0;

++emtpy;

x = i;

break;

}

else

break;

}

}

}

for (y = 0; y < 4; ++y) // 向下移动方格

for (x = 3; x >= 0; –x) {

if (a[x][y] == 0)

;

else {

for (i = x; (i < 3) && (a[i + 1][y] == 0); ++i) {

a[i + 1][y] = a[i][y];

a[i][y] = 0;

}

}

}

}

void _left()

{

int x,i;

for (x = 0; x < 4; ++x) // 向左合并相同的方格

for (y = 0; y < 4; ++y) {

if (a[x][y] == 0)

;

else {

for (i = y + 1; i < 4; ++i) {

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

;

else if (a[x][y] == a[x][i]) {

a[x][y] += a[x][i];

a[x][i] = 0;

emtpy++;

y = i;

break;

}

else

break;

}

}

}

for (x = 0; x < 4; ++x) // 向左移动方格

for (y = 0; y < 4; ++y) {

if (a[x][y] == 0)

;

else {

for (i = y; (i > 0) && (a[x][i – 1] == 0); –i) {

a[x][i – 1] = a[x][i];

a[x][i] = 0;

}

}

}

}

void _right() {

int x,i;

for (x = 0; x < 4; ++x) // 向右合并相同的方格

for (y = 3; y >= 0; –y) {

if (a[x][y] == 0)

;

else {

for (i = y – 1; i >= 0; –i) {

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

;

else if (a[x][y] == a[x][i]) {

a[x][y] += a[x][i];

a[x][i] = 0;

++emtpy;

y = i;

break;

}

else

break;

}

}

}

for (x = 0; x < 4; ++x) // 向右移动方格

for (y = 3; y >= 0; –y) {

if (a[x][y] == 0)

;

else {

for (i = y; (i < 3) && (a[x][i + 1] == 0); ++i) {

a[x][i + 1] = a[x][i];

a[x][i] = 0;

}

}

}

}

void add_number()

{

srand(time(0));

if (emtpy > 0)

{

int x,temp;

do

{

x = rand() % 4;

y = rand() % 4;

} while (a[x][y] != 0);

temp = rand();

int i = temp % 2;

if (i == 1)

{

a[x][y] = 2;

emtpy–;

}

else

{

a[x][y] = 4;

emtpy–;

}

}

}

void play()

{

char c = getch();

switch (c)

{

case ‘w’:

case’W’:

{

_up();

add_number();

draw();

break;

}

case ‘s’:

case’S’:

{

_down();

add_number();

draw();

break;

}

case ‘a’:

case’A’:

{

_left();

add_number();

draw();

break;

}case ‘d’:

case’D’:

{

_right();

add_number();

draw();

break;

}

case ‘q’:

case ‘Q’:

{

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

{

a[i][j] = _back[i][j];

draw();

}

}

}

}

}

int main()

{

init();

int i,j;

initgraph(724,724);//初始化

PIMAGE img;

img = newimage();

getimage(img,”2048/背景.jpg”);

putimage(0,img);

draw();

for (; is_run(); delay_fps(30))

{

for (int i = 0; i < 4; i++)

{

for (int j = 0; j < 4; j++)

{

_back[i][j] = a[i][j];

}

}

play();

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。