2048 系列之普通版

$ 自编 2048 小游戏$

//2048小游戏原创
#include <bits/stdc++.h>
#include <conio.h>
#include <windows.h>
#pragma GCC optimize(2)
#pragma GCC optimize(3)
inline int max1 (int x, int y) {
	return x > y ? x : y;
}
const int N = 4;
int jiemian[N][N], fangxiang1, M = 2048;
using namespace std;
void put (int n) {
	while (n --)
		puts ("") ;
}
void guangbiao() { 	
	CONSOLE_CURSOR_INFO cursor;
	cursor.bVisible = FALSE;
	cursor.dwSize = sizeof(cursor);
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorInfo(handle, &cursor);
	return ;
}
void yan () {
	int cnt = rand () % 6 + 1;
	if (cnt == 1)
		system ("color 2") ;
	if (cnt == 2)
		system ("color 3") ;
	if (cnt == 3)
		system ("color 6") ;
	if (cnt == 4)
		system ("color B") ;
	if (cnt == 5)
		system ("color C") ;
	if (cnt == 6)
		system ("color E") ;
}
void print (string str) {
    for (int i = 0; i < str.size() - 1; ++ i) {
        Sleep (10) ;
        cout << str[i];
    }
    cout << str [str.size() - 1];
	Sleep (100);
}
void ko (int n) {
	while (n --)
		putchar (' ');
}
void xianshi () {
	system ("cls") ;
	put (1) , ko (12) ;
	printf ("目标:%d", M) ;
	put (1) , ko (5) ;
	for (int i = 1; i < N + 1; ++ i) {
		ko (4) ;
		putchar ('_') ;
	}
	put (2) ;
	for (int i = 0; i < N; ++ i) {
		ko (4) ;
		putchar ('|') ;
		for (int j = 0; j < N; ++ j)
			if (jiemian[i][j] != 0)
				printf ("%5d", jiemian[i][j]) ;
			else
				ko (4) , putchar ('_') ;
		ko (4) ;
		putchar ('|') ;
		put (2) ;
	}
	ko (5) ;
	for (int i = 1; i < N + 1; ++ i)
		ko (4) , putchar ('_') ;
	put (1) ;
}
bool kongwei () {
	for (int i = 0; i < N; ++ i)
		for (int j = 0; j < N; ++ j)
			if (jiemian[i][j] == 0)
				return 1;
	return 0;
}
void suiji () {
	int i, j;
	do {
		i = rand () % N;
		j = rand () % N;
	} while (jiemian[i][j] != 0) ;
	jiemian[i][j] = rand() % 2 * 2 + 2;
}
int MAX () {
	int maxx = 0;
	for (int i = 0; i < N; ++ i)
		for (int j = 0; j < N; ++ j)
			maxx = max1 (jiemian[i][j], maxx) ;
	return maxx;
}
bool xiangjia () {
	int sum;
	bool ok, flag = 0;
	if (fangxiang1 == 1) {
		for (int i = 1; i < N; ++ i)
			for (int j = 0; j < N; ++ j) {
				sum = i, ok = 0;
				while (sum >= 1 && jiemian[sum][j] != 0 ) {
					if (jiemian[sum - 1][j] == 0) {
						jiemian[sum - 1][j] = jiemian[sum][j];
						jiemian[sum][j] = 0;
						flag = 1;
					} 
					else {
						if (jiemian[sum - 1][j] == jiemian[sum][j] && ok == 0) {
							jiemian[sum - 1][j] = jiemian[sum - 1][j] * 2;
							jiemian[sum][j] = 0;
							ok = 1, flag = 1;
						} 
						else
							break;
					}
					-- sum;
				}
			}
	}
	if (fangxiang1 == 2) {
		for (int i = N - 2; i >= 0; -- i)
			for (int j = 0; j < N; ++ j) {
				sum = i, ok = 0;
				while (sum <= N - 2 && jiemian[sum][j] != 0 ) {
					if(jiemian[sum + 1][j] == 0) {
						jiemian[sum + 1][j] = jiemian[sum][j];
						jiemian[sum][j]=0;
						flag = 1;
					} 
					else {
						if (jiemian[sum + 1][j] == jiemian[sum][j] && ok == 0) {
							jiemian[sum + 1][j] = jiemian[sum + 1][j] * 2;
							jiemian[sum][j] = 0;
							ok = 1, flag = 1;
						} 
						else
							break;
					}
					++ sum;
				}
			}
	}
	if (fangxiang1 == 3) {
		for (int i = 0; i < N; ++ i)
			for (int j = 1; j < N; ++ j) {
				sum = j, ok = 0;
				while (sum >= 1 && jiemian[i][sum] != 0 ) {
					if (jiemian[i][sum - 1] == 0) {
						jiemian[i][sum - 1] = jiemian[i][sum];
						jiemian[i][sum] = 0;
						flag = 1;
					} 
					else {
						if (jiemian[i][sum - 1] == jiemian[i][sum] && ok == 0) {
							jiemian[i][sum - 1] = jiemian[i][sum - 1] * 2;
							jiemian[i][sum] = 0;
							ok = 1, flag = 1;
						} 
						else
							break;
					}
					-- sum;
				}
			}
	}
	if (fangxiang1 == 4) {
		for(int i = 0; i < N; ++ i)
			for(int j = N - 2; j >= 0; -- j) {
				sum = j, ok = 0;
				while (sum <= N - 2 && jiemian[i][sum] != 0 ) {
					if (jiemian[i][sum + 1] == 0) {
						jiemian[i][sum + 1] = jiemian[i][sum];
						jiemian[i][sum] = 0;
						flag = 1;
					} 
					else {
						if (jiemian[i][sum + 1] == jiemian[i][sum] && ok == 0) {
							jiemian[i][sum + 1] = jiemian[i][sum + 1] * 2;
							jiemian[i][sum] = 0;
							ok = 1, flag = 1;
						} 
						else
							break;
					}
					++ sum;
				}
			}
	}
	return flag;
}
bool shuru () {
	char str = getch () ;
	if (str < 0) {
		str = getch () ;
		if(str == 72) {
			fangxiang1 = 1;
			return 1;
		}
		if(str == 80) {
			fangxiang1 = 2;
			return 1;
		}
		if(str == 75) {
			fangxiang1 = 3;
			return 1;
		}
		if(str == 77) {
			fangxiang1 = 4;
			return 1;
		}
	}
	return 0;
}
void hebing () {
	for (int i = 0; i < N; i ++)
		for (int j = 0; j < N - 1; ++ j)
			if (jiemian[i][j] == jiemian[i][j + 1])
				return ;
	for (int j = 0; j < N; j ++)
		for (int i = 0; i < N - 1; ++ i)
			if (jiemian[i][j] == jiemian[i + 1][j])
				return ;
}
void guize () {
	yan () , system ("cls") , put (2) , ko (9);
	print ("用方向键移动方块") ;
	put (2) , ko (3) ; 
	print ("当两个有相同数字的方块接触时") ;
	put (2) , ko (6) ;
	print ("它们会合并为一个方块") ;
	put (2) , ko (5) ;
	print ("数字到达目标即为胜利!") ;
	put (2) , ko (9) ;
	print ("按任意键观看结束") ;
	getch () , system ("cls") ;
}
void chongxing () {
	system ("cls") ;
	yan (), put (6), ko (12);
	print ("请重新输入!") ; 
}
int main () {
	guangbiao () , yan () ;
	system ("mode con cols=35 lines=15") ;
	srand (time (0) ) ;
	put (6) , ko (10) ;
	print ("作者:刘科杰") ;
	system ("cls") ;
	yan () , put (6) , ko (3) ;
	while (1) {
		while (1) {
			system ("cls") , yan () , put (2) ;
			ko (15) ;
			print ("首页") ;
			put (2) ;
			ko (11) ;
			print ("1.开始游戏") ;
			put (2) ; 
			ko (11) ;
			print ("2.游戏规则") ;
			put (2) ; 
			ko (11) ;
			print ("3.结束游戏") ;
			put (2) ; 
			ko (11) ;
			print ("请选择:") ;
			string n;
			cin >> n;
			if (n.size () > 1)
				chongxing () ;
			if (n[0] == '1')
				break;
			else if (n[0] == '2')
				guize () ;
			else if (n[0] == '3')
				return 0;
			else 
				chongxing () ;
			system ("cls") ;
		}
		while (1) {
			system ("cls") , yan () , put (1) ;
			ko (15) ;
			print ("难度") ;
			put (2) , ko (10);
			print ("1.目标:128 ") ;
			put (2) , ko (10);
			print ("2.目标:256 ") ;
			put (2) , ko (10);
			print ("3.目标:512 ") ;
			put (2) , ko (10);
			print ("4.目标:1024") ;
			put (2) , ko (10);
			print ("5.目标:2048") ;
			put (2) , ko (10);
			print ("请选择:") ;
			string n;
			cin >> n;
			if (n.size () > 1)
				chongxing () ;
			if (n[0] == '1') {
				M = 128;
				break;
			}
			else if (n[0] == '2') {
				M = 256;
				break;
			}
			else if (n[0] == '3') {
				M = 512;
				break;
			}
			else if (n[0] == '4') {
				break;
				M = 1024;
			}
			else if (n[0] == '5') {
				break;
				M = 2048;
			}
			else 
				chongxing () ;
		}
		memset (jiemian, 0, sizeof (jiemian) ) ;
		bool ok = 0, flag;
		int k, geshu;
		suiji () , suiji () ;
		xianshi () , yan () ;
		while(1) {
			k = shuru () ;
			if (k == 0)
				continue;
			flag = xiangjia () ;
			if (flag == 1)
				xianshi () ;
			if (MAX() == M) {
				ok = 1;
				break;
			}
			geshu = kongwei () ;
			if (geshu == 1 && flag == 1)
				suiji () , xianshi () ;
			if (geshu == 0) {
				hebing () ;
				break;
			}
		}
		if (ok == 1) {
			system ("cls") ;
			Sleep (100) ;
			yan (), put (6) ,ko (14) ;
			print ("你赢了!") ;
		}
		else {
			system ("cls") ;
			Sleep (100) ;
			yan () , put (6) , ko (14) ;
			print ("你输了!") ;
		}
	}
	return 0;
}


$ 我的博客写的这么好,为什么不点个赞呢? $

posted @ 2023-07-01 11:25  liukejie  阅读(14)  评论(0编辑  收藏  举报