C实现2048随机困难模式

会随机消除某几个数,增加游戏难度~(其实是找不到bug

记得按easyx插件

#include<iostream>
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<easyx.h>
#include<math.h>
#include<conio.h>
#define MAX_GRTD 4 //每行格子
#define GRID_WIDTH 100 //格子宽度
#define INTERVAL 15 //间隔
using namespace std;
enum Color //枚举格子颜色
{
	zero = RGB(205, 193, 180), //0的颜色
	twoTo1 = RGB(238, 228, 218), //2的颜色
	twoTo2 = RGB(237, 224, 200), //4的颜色
	twoTo3 = RGB(242, 177, 121), //8的颜色
	twoTo4 = RGB(245, 149, 99), //16的颜色
	twoTo5 = RGB(246, 124, 95), //32的颜色
	twoTo6 = RGB(246, 94, 59), //64的颜色
	twoTo7 = RGB(242, 177, 121), //128的颜色
	twoTo8 = RGB(237, 204, 97), //256的颜色
	twoTo9 = RGB(255, 0, 128), //512的颜色
	twoTo10 = RGB(145, 0, 72), //1024的颜色
	twoTo11 = RGB(242, 17, 158), //2048的颜色
	back = RGB(187, 173, 160), //背景颜色
};
Color arr[13] = { zero, twoTo1, twoTo2, twoTo3, twoTo4, twoTo5, twoTo6, twoTo7, twoTo8, twoTo9, twoTo10, twoTo11, back };
int map[4][4];
int num[12] = { 0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 };
POINT pos[4][4];//保存每个格子左上交坐标
bool flag = false;
int twoorfour(){
	if (rand() % 10 == 1){
		return 4;
	}
	else{
		return 2;
	}
}
void CreatNumber(){
	while (1){
		int x = rand() % 4, y = rand() % 4;
		if (map[x][y] == 0){
			map[x][y] = twoorfour();
			break;
		}

	}
}
void Gameinit(){
	srand(GetTickCount());
	for (int i = 0; i < 4; i++){
		for (int j = 0; j < 4; j++){
			pos[i][j].x = j*GRID_WIDTH + (j + 1)*INTERVAL;
			pos[i][j].y = i*GRID_WIDTH + (i + 1)*INTERVAL;
		}
	}
	CreatNumber();
	CreatNumber();
}
void Gamedraw(){
	setbkcolor(back);
	cleardevice();
	for (int i = 0; i < 4; i++){
		for (int j = 0; j < 4; j++){
			for (int q = 0; q < 12; q++){
				if (map[i][j] == num[q]){
					setfillcolor(arr[q]);
					solidrectangle(pos[i][j].x, pos[i][j].y, pos[i][j].x + GRID_WIDTH, pos[i][j].y + GRID_WIDTH);
					if (map[i][j] != 0){
						char number[5] = " ";
						settextcolor(RGB(119, 110, 100));
						settextstyle(50, 0, "黑体");
						setbkmode(TRANSPARENT);
						sprintf(number, "%d",map[i][j]);
						int temp = textwidth(number);
						temp = GRID_WIDTH / 2 - temp / 2;
						int temp1 = textheight(number);
						temp1 = GRID_WIDTH / 2 - temp1 / 2;
						outtextxy(pos[i][j].x+temp, pos[i][j].y+temp1, number);
					}
				}
			}	
			}
		}
	}
void moveup(){
	for (int i = 0; i < 4; i++){
		int temp = 0;
		for (int b = 1; b < 4; b++){
			if (map[b][i]!=0){
				if (map[temp][i] == 0){
					map[temp][i] = map[b][i];
					map[b][i] = 0;
				}
				else if(map[temp][i]==map[b][i]){
					map[temp][i] += map[b][i];
					map[b][i] = 0;
				}
				else{
					map[temp+1][i] = map[b][i];
					if (temp + 1 != b){
						map[b][i] = 0;
					}
				}
				temp++;
				flag = true;
			}
		}
	}
}
void movedown(){
	for (int i = 0; i < 4; i++){
		int temp = 3;
		for (int b = 2; b >=0; b--){
			if (map[b][i] != 0){
				if (map[temp][i] == 0){
					map[temp][i] = map[b][i];
					map[b][i] = 0;
				}
				else if (map[temp][i] == map[b][i]){
					map[temp][i] += map[b][i];
					map[b][i] = 0;
				}
				else{
					map[temp - 1][i] = map[b][i];
					if (temp - 1 != b){
						map[b][i] = 0;
					}
				}
				temp--;
				flag = true;
			}
		}
	}
}
void moveleft(){
	for (int i = 0; i < 4; i++){
		int temp = 0;
		for (int b = 1; b < 4; b++){
			if (map[i][b] != 0){
				if (map[i][temp] == 0){
					map[i][temp] = map[i][b];
					map[i][b] = 0;
				}
				else if (map[i][temp] == map[i][b]){
					map[i][temp] += map[i][b];
					map[i][b] = 0;
				}
				else{
					map[i][temp+1] = map[i][b];
					if (temp + 1 != b){
						map[i][b] = 0;
					}
				}
				temp++;
				flag = true;
			}
		}
	}
}
void moveright(){
	for (int i = 0; i < 4; i++){
		int temp = 3;
		for (int b = 2; b >=0; b--){
			if (map[i][b] != 0){
				if (map[i][temp] == 0){
					map[i][temp] = map[i][b];
					map[i][b] = 0;
				}
				else if (map[i][temp] == map[i][b]){
					map[i][temp] += map[i][b];
					map[i][b] = 0;
				}
				else{
					map[i][temp - 1] = map[i][b];
					if (temp - 1 != b){
						map[i][b] = 0;
					}
				}
				temp--;
				flag = true;
			}
		}
	}
}
void panduan(){
	if (flag){
		CreatNumber();
		flag = false;
	}
}
void GameControl(){
	char key = _getch();
	if (key == 'w' || key == 'W' || key == 72) moveup();
	if (key == 's' || key == 'S' || key == 80) movedown();
	if (key == 'a' || key == 'A' || key == 75) moveleft();
	if (key == 'd' || key == 'D' || key == 77) moveright();
}
int main(){
	initgraph(4 * 100 + 5 * 15, 400 + 5 * 15);
	Gameinit();
	while (1){
		
		Gamedraw();
		GameControl();
		panduan();
	}
	
	getchar();
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛大了202X

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值