我的C++之旅---07

我的C++之旅—07

(原创)
2048

功能:

重现2048,源代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <conio.h>
#include <time.h>

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值