空闲时间用C语言写了下2048游戏

本身这个游戏逻辑挺简单的,所以,不多说了,直接上代码吧

 

玩法说明:编译运行后,输入一个整数n,表示自己想玩的游戏中是n*n的表格,现在手机上或者电脑上一般都是4*4的,所以我们可以输入4,回车就可以开始游戏了。

游戏开始后a s d w表示方向左 下 右 上四个方向。 

正如真实版的2048一样,会输出两个表格,move 表格显示按输入方向平移后的结果,fill 表格显示又随机填充一个格子后的表格

 

 

#include <climits>
#include <cstdio>
#include <cstring>
#include <stack>
#include <string>
#include <map>
#include <vector>
#include <cmath>


using namespace std;

const int MAXX = 10;

int box[MAXX][MAXX];

void moveLeft(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n; ++j){
			int k;
			for (k = j - 1; k >= 0; --k){
				if (box[i][k] != -1){
					break;
				}
			}
			box[i][k + 1] = box[i][j];

			if ((k + 1) != j){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeLeft(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n - 1; ++j){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i][j + 1]){
				box[i][j] *= 2;
				box[i][j + 1] = -1;
				ret = true;
				++j;
			}
		}
	}
}

bool left(int n){
	bool ret = false;
	moveLeft(n, ret);
	mergeLeft(n, ret);
	moveLeft(n, ret);
	return ret;
}

void moveRight(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = n - 1; j >= 0; --j){
			if (box[i][j] == -1)continue;

			int k;
			for (k = j + 1; k < n; ++k){
				if (box[i][k] != -1){
					break;
				}
			}

			box[i][k - 1] = box[i][j];
			if ((k - 1) != j){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeRight(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = n - 1; j >0; --j){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i][j - 1]){
				box[i][j] *= 2;
				box[i][j - 1] = -1;
				ret = true;
				--j;
			}
		}
	}
}

bool right(int n){
	bool ret = false;
	moveRight(n, ret);
	mergeRight(n, ret);
	moveRight(n, ret);
	return ret;
}

void moveUp(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = 0; i < n; ++i){
			int k;
			for (k = i - 1; k >= 0; --k){
				if (box[k][j] != -1){
					break;
				}
			}
			box[k + 1][j] = box[i][j];

			if ((k + 1) != i){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeUp(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = 0; i < n - 1; ++i){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i + 1][j]){
				box[i][j] *= 2;
				box[i + 1][j] = -1;
				ret = true;
				++i;
			}
		}
	}
}

bool up(int n){
	bool ret = false;
	moveUp(n, ret);
	mergeUp(n, ret);
	moveUp(n, ret);
	return ret;
}

void moveDown(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = n - 1; i >= 0; --i){
			if (box[i][j] == -1)continue;

			int k;
			for (k = i + 1; k < n; ++k){
				if (box[k][j] != -1)break;
			}

			box[k - 1][j] = box[i][j];

			if ((k - 1) != i){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeDown(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = n - 1; i > 0; --i){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i - 1][j]){
				box[i][j] *= 2;
				box[i - 1][j] = -1;
				ret = true;
				--i;
			}
		}
	}
}

bool down(int n){
	bool ret = false;
	moveDown(n, ret);
	mergeDown(n, ret);
	moveDown(n, ret);
	return ret;
}

void line(int n){
	for (int i = 0; i < n; ++i){
		printf("--------");
	}
	printf("-");
	printf("\n");
}

void print(int n){
	for (int i = 0; i < n; ++i){
		line(n);
		for (int j = 0; j < n; ++j){
			printf("|");
			if (box[i][j] == -1){
				printf("\t");
				continue;
			}

			printf("%2d\t", box[i][j]);
		}
		printf("|");
		printf("\n");
	}
	line(n);
}

bool isFull(int n){
	bool mark = true;
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n; ++j){
			if (box[i][j] == -1){
				mark = false;
				return mark;
			}
		}
	}
	return mark;
}

bool isOver(int n){
	if (!isFull(n)){
		return false;
	}
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n; ++j){
			if (box[i][j] == box[i][j + 1] || box[i][j] == box[i + 1][j]){
				return false;
			}
		}
	}
	return true;
}

void fillBox(int n){
	int i, j, num;

	if (isFull(n)){
		return;
	}

	while (true){
		i = rand() % n;
		j = rand() % n;
		num = rand() % 2 == 0 ? 2 : 4;

		if (box[i][j] == -1){
			box[i][j] = num;
			break;
		}
	}
}

int main(){
	//freopen("in.txt", "r", stdin);
	memset(box, -1, sizeof(box));

	int n;
	bool mark;
	scanf("%d%*c", &n);

	fillBox(n);
	fillBox(n);
	print(n);

	while (true){
		char ch;
		scanf("%c%*c", &ch);
		if (ch == 'a'){
			mark = left(n);
		}
		else if (ch == 'd'){
			mark = right(n);
		}
		else if (ch == 'w'){
			mark = up(n);
		}
		else if (ch == 's'){
			mark = down(n);
		}
		else{
			continue;
		}
		system("cls");
		printf("Move:\n");
		print(n);
		if (!mark){
			continue;
		}
		fillBox(n);
		printf("Fill:\n");
		print(n);

		if (isOver(n)){
			printf("\n\nGame Over!\n\n");
			break;
		}
	}
	
	
	return 0;
}

 

只是玩了几局,没有很深度的找bug,所以可能会有bug。

 

 

欢迎访问本人的新博客 www.iaccepted.net

评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值