(原创)
2048
重现2048,源代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
#include
HWND hwnd = NULL;
int map[4][4];
int g_x = 0, g_y = 0;
int g_times, g_score;
//生成随机数
void randnum() {
while (1) {
g_x = (int)rand() % 4;
g_y = (int)rand() % 4;
if (map[g_y][g_x] == 0) {
map[g_y][g_x] = 2;
return;
}
}
}
//获得得分
void updatescore() {
g_score = 0;
int i, j;
for (i = 0;i < 4;i++) {
for (j = 0;j < 4;j++) {
g_score += map[i][j];
}
}
}
//初始化游戏界面
void initgame() {
//游戏界面的图文信息
char grade1[100] = { 0 };
sprintf(grade1, "%d", g_times);
setbkmode(TRANSPARENT);
settextcolor(BLUE);
outtextxy(80, 40, "步数:");
outtextxy(140, 40, grade1);
char grade2[100] = { 0 };
sprintf(grade2, "%d", g_score);
setbkmode(TRANSPARENT);
settextcolor(BLUE);
outtextxy(230, 40, "得分:");
outtextxy(290, 40, grade2);
randnum();
}
//上下左右
void upnum() {
int i, j = 0, a, b, t;
for (i = 0;i < 4;i++) {
j = 0;
while (j < 4) {
if (map[i][j] != 0) {
a = j + 1;
while (a < 4) {
if (map[i][a] != map[i][j] && map[i][a] != 0) {
break;
}
else if (map[i][a] == 0) {
a++;
}
else {
map[i][a] = 0;
map[i][j] *= 2;
break;
}
}
}
else {
a = j;
b = a + 1;
while (a < 3 && b < 4) {
if (map[i][b] != 0) {
t = map[i][a];
map[i][a] = map[i][b];
map[i][b] = t;
a++;
}
else {
b++;
}
}
}
j++;
}
}
for (i = 0;i < 4;i++) {
j = 0;
while (j < 4) {
if (map[i][j] != 0) {
a = j + 1;
while (a < 4) {
if (map[i][a] != map[i][j] && map[i][a] != 0) {
break;
}
else if (map[i][a] == 0) {
a++;
}
else {
map[i][a] = 0;
map[i][j] *= 2;
break;
}
}
}
else {
a = j;
b = a + 1;
while (a < 3 && b < 4) {
if (map[i][b] != 0) {
t = map[i][a];
map[i][a] = map[i][b];
map[i][b] = t;
a++;
}
else {
b++;
}
}
}
j++;
}
}
}
void downnum() {
int i, j = 3, a, b, t;
for (i = 3;i >= 0;i--) {
j = 3;
while (j >= 0) {
if (map[i][j] != 0) {
a = j - 1;
while (a >= 0) {
if (map[i][a] != map[i][j] && map[i][a] != 0) {
break;
}
else if (map[i][a] == 0) {
a--;
}
else {
map[i][a] = 0;
map[i][j] *= 2;
break;
}
}
}
else {
a = j;
b = a - 1;
while (a > 0 && b >= 0) {
if (map[i][b] != 0) {
t = map[i][a];
map[i][a] = map[i][b];
map[i][b] = t;
a--;
}
else {
b--;
}
}
}
j--;
}
}
for (i = 3;i >= 0;i--) {
j = 3;
while (j >= 0) {
if (map[i][j] != 0) {
a = j - 1;
while (a >= 0) {
if (map[i][a] != map[i][j] && map[i][a] != 0) {
break;
}
else if (map[i][a] == 0) {
a--;
}
else {
map[i][a] = 0;
map[i][j] *= 2;
break;
}
}
}
else {
a = j;
b = a - 1;
while (a > 0 && b >= 0) {
if (map[i][b] != 0) {
t = map[i][a];
map[i][a] = map[i][b];
map[i][b] = t;
a--;
}
else {
b--;
}
}
}
j--;
}
}
}
void leftnum() {
int i, j = 0, a, b, t;
for (i = 0;i < 4;i++) {
j = 0;
while (j < 4) {
if (map[j][i] != 0) {
a = j + 1;
while (a < 4) {
if (map[a][i] != map[j][i] && map[a][i] != 0) {
break;
}
else if (map[a][i] == 0) {
a++;
}
else {
map[a][i] = 0;
map[j][i] *= 2;
break;
}
}
}
else {
a = j;
b = a + 1;
while (a < 3 && b < 4) {
if (map[b][i] != 0) {
t = map[a][i];
map[a][i] = map[b][i];
map[b][i] = t;
a++;
}
else {
b++;
}
}
}
j++;
}
}
for (i = 0;i < 4;i++) {
j = 0;
while (j < 4) {
if (map[j][i] != 0) {
a = j + 1;
while (a < 4) {
if (map[a][i] != map[j][i] && map[a][i] != 0) {
break;
}
else if (map[a][i] == 0) {
a++;
}
else {
map[a][i] = 0;
map[j][i] *= 2;
break;
}
}
}
else {
a = j;
b = a + 1;
while (a < 3 && b < 4) {
if (map[b][i] != 0) {
t = map[a][i];
map[a][i] = map[b][i];
map[b][i] = t;
a++;
}
else {
b++;
}
}
}
j++;
}
}
}
void rightnum() {
int i, j = 3, a, b, t;
for (i = 3;i >= 0;i--) {
j = 3;
while (j >= 0) {
if (map[j][i] != 0) {
a = j - 1;
while (a >= 0) {
if (map[a][i] != map[j][i] && map[a][i] != 0) {
break;
}
else if (map[a][i] == 0) {
a--;
}
else {
map[a][i] = 0;
map[j][i] *= 2;
break;
}
}
}
else {
a = j;
b = a - 1;
while (a > 0 && b >= 0) {
if (map[b][i] != 0) {
t = map[a][i];
map[a][i] = map[b][i];
map[b][i] = t;
a--;
}
else {
b--;
}
}
}
j--;
}
}
for (i = 3;i >= 0;i--) {
j = 3;
while (j >= 0) {
if (map[j][i] != 0) {
a = j - 1;
while (a >= 0) {
if (map[a][i] != map[j][i] && map[a][i] != 0) {
break;
}
else if (map[a][i] == 0) {
a--;
}
else {
map[a][i] = 0;
map[j][i] *= 2;
break;
}
}
}
else {
a = j;
b = a - 1;
while (a > 0 && b >= 0) {
if (map[b][i] != 0) {
t = map[a][i];
map[a][i] = map[b][i];
map[b][i] = t;
a--;
}
else {
b--;
}
}
}
j--;
}
}
}
//画出16个格子的地图
void paintmap() {
int i, j;
for (i = 0;i < 4;i++) {
for (j = 0;j < 4;j++) {
setlinecolor(RED);
setfillcolor(RED);
fillrectangle(60 + i * 70, 80 + j * 70, 60 + i * 70 + 60, 80 + j * 70 + 60);
if (map[i][j] != 0) {
char grade[100] = { 0 };
sprintf(grade, "%d", map[i][j]);
setbkmode(TRANSPARENT);
settextcolor(WHITE);
outtextxy(82 + i * 70, 102 + j * 70, grade);
}
}
}
}
//移动方块
void movemap() {
char key = '\0';
key = _getch();
g_times++;
switch (key) {
case 'W':
case 'w':
upnum();
break;
case 'S':
case 's':
downnum();
break;
case 'a':
case 'A':
leftnum();
break;
case 'D':
case 'd':
rightnum();
break;
default:
break;
}
}
//判断游戏是否结束
bool stopgame() {
int i, j, temp = 0, flag = 1;
for (i = 0;i < 4;i++) {
for (j = 0;j < 4;j++) {
if (map[i][j] == 0) {
flag = 0;
break;
}
}
}
if (flag) {
for (i = 1;i < 3;i++) {
for (j = 1;j < 3;j++) {
if (map[i][j] == map[i][j + 1] || map[i][j] == map[i][j - 1] || map[i][j] == map[i - 1][j] || map[i][j] == map[i + 1][j]) {
temp++;
}
}
}
if (map[0][0] == map[0][1] || map[0][0] == map[1][0] || map[0][3] == map[1][3] || map[0][3] == map[0][2] || map[3][0] == map[2][0]
|| map[3][0] == map[3][1] || map[3][3] == map[3][2] || map[3][3] == map[2][3]) {
temp++;
}
if (temp == 0) {
return 1;
}
else {
return 0;
}
}
else {
return 0;
}
}
//主函数main
int main()
{
srand((unsigned int)time(NULL));
hwnd = initgraph(400,480);
setbkcolor(LIGHTGREEN);
cleardevice();
memset(map, 0, sizeof(map));
g_times = 0;
g_score = 0;
initgame();
paintmap();
while (1) {
while (_kbhit()) {
cleardevice();
movemap();
initgame();
updatescore();
paintmap();
}
if (stopgame()) {
//得分等状况
char grade[100] = { 0 };
sprintf(grade, "%d", g_score);
setbkmode(TRANSPARENT);
settextcolor(WHITE);
outtextxy(50, 400, "游戏结束,再接再厉哦,您的得分为:");
outtextxy(330, 400, grade);
Sleep(2000);
break;
}
}
closegraph();
system("pause");
return 0;
}