2048小游戏
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/25 15:37
  • 上次更新2023/11/25 17:12:28
查看原帖
2048小游戏
800153
封禁用户楼主2023/11/25 15:37
#include<bits/stdc++.h>
#include<time.h>
#include<windows.h>
#include<conio.h>
using namespace std;
int sq[5][5], c = 16, m, mx = 0;
bool b;
char a[5];
bool up() { //上移
	bool flag = false;
	for(int i = 0; i < 3; i++)
		for(int j = 1; j <= 4; j++)
			for(int k = 2; k <= 4; k++)
				if(sq[k - 1][j] == 0 && sq[k][j] != 0) {
					sq[k - 1][j] = sq[k][j];
					sq[k][j] = 0;
					flag = true;
				}
	for(int i = 1; i <= 4; i++) {
		if(sq[1][i] == sq[2][i] && sq[1][i] != 0) {
			sq[1][i] *= 2;
			sq[2][i] = 0;
			flag = true;
		}
		if(sq[2][i] == sq[3][i] && sq[2][i] != 0) {
			sq[2][i] *= 2;
			sq[3][i] = 0;
			flag = true;
		}
		if(sq[3][i] == sq[4][i] && sq[3][i] != 0) {
			sq[3][i] *= 2;
			sq[4][i] = 0;
			flag = true;
		}
	}
	for(int i = 0; i < 2; i++)
		for(int j = 1; j <= 4; j++)
			for(int k = 2; k <= 4; k++)
				if(sq[k - 1][j] == 0 && sq[k][j] != 0) {
					sq[k - 1][j] = sq[k][j];
					sq[k][j] = 0;
				}
	c = 0;
	for(int i = 1; i <= 4; i++)
		for(int j = 1; j <= 4; j++)
			if(sq[i][j] == 0)
				c++;
	return flag;
}

bool down() { //下移
	bool flag = false;
	for(int i = 0; i < 3; i++)
		for(int j = 1; j <= 4; j++)
			for(int k = 2; k <= 4; k++)
				if(sq[k][j] == 0 && sq[k - 1][j] != 0) {
					sq[k][j] = sq[k - 1][j];
					sq[k - 1][j] = 0;
					flag = true;
				}
	for(int i = 1; i <= 4; i++) {
		if(sq[3][i] == sq[4][i] && sq[4][i] != 0) {
			sq[4][i] *= 2;
			sq[3][i] = 0;
			flag = true;
		}
		if(sq[2][i] == sq[3][i] && sq[3][i] != 0) {
			sq[3][i] *= 2;
			sq[2][i] = 0;
			flag = true;
		}
		if(sq[1][i] == sq[2][i] && sq[2][i] != 0) {
			sq[2][i] *= 2;
			sq[1][i] = 0;
			flag = true;
		}
	}
	for(int i = 0; i < 2; i++)
		for(int j = 1; j <= 4; j++)
			for(int k = 2; k <= 4; k++)
				if(sq[k][j] == 0 && sq[k - 1][j] != 0) {
					sq[k][j] = sq[k - 1][j];
					sq[k - 1][j] = 0;
				}
	c = 0;
	for(int i = 1; i <= 4; i++)
		for(int j = 1; j <= 4; j++)
			if(sq[i][j] == 0)
				c++;
	return flag;
}
bool left() { //左移
	bool flag = false;
	for(int i = 0; i < 3; i++)
		for(int j = 2; j <= 4; j++)
			for(int k = 1; k <= 4; k++)
				if(sq[k][j - 1] == 0 && sq[k][j] != 0) {
					sq[k][j - 1] = sq[k][j];
					sq[k][j] = 0;
					flag = true;
				}
	for(int i = 1; i <= 4; i++) {
		if(sq[i][1] == sq[i][2] && sq[i][1] != 0) {
			sq[i][1] *= 2;
			sq[i][2] = 0;
			flag = true;
		}
		if(sq[i][2] == sq[i][3] && sq[i][2] != 0) {
			sq[i][2] *= 2;
			sq[i][3] = 0;
			flag = true;
		}
		if(sq[i][3] == sq[i][4] && sq[i][3] != 0) {
			sq[i][3] *= 2;
			sq[i][4] = 0;
			flag = true;
		}
	}
	for(int i = 0; i < 2; i++)
		for(int j = 2; j <= 4; j++)
			for(int k = 1; k <= 4; k++)
				if(sq[k][j - 1] == 0 && sq[k][j] != 0) {
					sq[k][j - 1] = sq[k][j];
					sq[k][j] = 0;
				}
	c = 0;
	for(int i = 1; i <= 4; i++)
		for(int j = 1; j <= 4; j++)
			if(sq[i][j] == 0)
				c++;
	return flag;
}

bool right() { //右移
	bool flag = false;
	for(int i = 0; i < 3; i++)
		for(int j = 2; j <= 4; j++)
			for(int k = 1; k <= 4; k++)
				if(sq[k][j] == 0 && sq[k][j - 1] != 0) {
					sq[k][j] = sq[k][j - 1];
					sq[k][j - 1] = 0;
					flag = true;
				}
	for(int i = 1; i <= 4; i++) {
		if(sq[i][3] == sq[i][4] && sq[i][4] != 0) {
			sq[i][4] *= 2;
			sq[i][3] = 0;
			flag = true;
		}
		if(sq[i][2] == sq[i][3] && sq[i][3] != 0) {
			sq[i][3] *= 2;
			sq[i][2] = 0;
			flag = true;
		}
		if(sq[i][1] == sq[i][2] && sq[i][2] != 0) {
			sq[i][2] *= 2;
			sq[i][1] = 0;
			flag = true;
		}
	}
	for(int i = 0; i < 2; i++)
		for(int j = 2; j <= 4; j++)
			for(int k = 1; k <= 4; k++)
				if(sq[k][j] == 0 && sq[k][j - 1] != 0) {
					sq[k][j] = sq[k][j - 1];
					sq[k][j - 1] = 0;
				}
	c = 0;
	for(int i = 1; i <= 4; i++)
		for(int j = 1; j <= 4; j++)
			if(sq[i][j] == 0)
				c++;
	return flag;
}
void try_again() {
	for(int i = 1; i <= 4; i++)
		for(int j = 1; j <= 4; j++)
			sq[i][j] = 0;
	c = 16;
	m += rand() % c;
	m %= c;
	int x = 1, y = 1;
	for(int i = 0; i <= m; i++) {
		do {
			x++;
			if(x > 4) {
				y++;
				x = 1;
			}
			if(y > 4) {
				y = 1;
				x = 1;
			}
			rand();
		} while(sq[x][y] != 0);
	}
	sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
}
/*
void r(){
	srand(time(0));
	int m = rand() % c;
	int x = 1, y = 1;
	for(int i = 0; i <= m; i++){
		do{
			x++;
			if(x > 4){
				y++;
				x = 1;
			}
			if(y > 4){
				y = 1;
				x = 1;
			}
			rand();
		} while(sq[x][y] != 0);
	}
	sq[x][y] = (rand() % 2 + 1) * 2;
}
*/
int main() {
	srand(time(0));
	m = rand() % c;
	int x = 1, y = 1;
	for(int i = 0; i <= m; i++) {
		do {
			x++;
			if(x > 4) {
				y++;
				x = 1;
			}
			if(y > 4) {
				y = 1;
				x = 1;
			}
			rand();
		} while(sq[x][y] != 0);
	}
	sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
	m += rand() % c;
	m %= c;
	for(int i = 0; i <= m; i++) {
		do {
			x++;
			if(x > 4) {
				y++;
				x = 1;
			}
			if(y > 4) {
				y = 1;
				x = 1;
			}
			rand();
		} while(sq[x][y] != 0);
	}
	sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
	while(true) {
		system("cls");
		cout << "+----------------+\n";
		for(int i = 1; i <= 3; i++) {
			cout << '|';
			for(int j = 1; j <= 4; j++)
				if(sq[i][j]) printf("%4d", sq[i][j]);
				else cout << "   _";
			cout << "|\n|                |\n";
		}
		cout << '|';
		for(int j = 1; j <= 4; j++)
			if(sq[4][j]) printf("%4d", sq[4][j]);
			else cout << "   _";
		cout << "|\n";
		cout << "+----------------+\nw = up; s = down; a = left; d = right. (press e to exit, press r to try again)\n-- ";
		a[0]=getch();
		if(a[0] == 'e') return 0;
		else if(a[0] == 'w') b = up();
		else if(a[0] == 's') b = down();
		else if(a[0] == 'a') b = left();
		else if(a[0] == 'd') b = right();
		else if(a[0] == 'r') {
			b = true;
			try_again();
		} else b = false;
		//cout << b;
		while(!b) {
//			cout << "\nerror\nplease press again.\n-- ";
			a[0]=getch();
			if(a[0] == 'e') return 0;
			else if(a[0] == 'w') b = up();
			else if(a[0] == 's') b = down();
			else if(a[0] == 'a') b = left();
			else if(a[0] == 'd') b = right();
			else if(a[0] == 'r') {
				b = true;
				try_again();
			} else b = false;
		}
		m += rand() % c;
		m %= c;
		for(int i = 0; i <= m; i++) {
			do {
				x++;
				if(x > 4) {
					y++;
					x = 1;
				}
				if(y > 4) {
					y = 1;
					x = 1;
				}
				rand();
			} while(sq[x][y] != 0);
		}
		sq[x][y] = (rand() % (rand() % 2 + 1) + 1) * 2;
	}
	return 0;
}


以前上课摸鱼玩的,甚至做了存档功能(这个不带存档) wasd移动 e退出(方便摸鱼) r重开

2023/11/25 15:37
加载中...