C语言简易版2048

效果图:

C语言简易版2048_第1张图片

完整的源代码:

#include
#include
#include
#include
#include
//二维数组
int board[4][4] = { 0 };
int if_need_rand;//是否需要生成随机数
int if_game_over;//游戏是否结束
//界面
void ShowGame()
{
	printf("┌────┬────┬────┬────┐\n");
	for (int i = 0; i < 4; i++)
	{
		printf("│");

		for (int j = 0; j < 4; j++)
		{
			//二维数组元素为0
			if (board[i][j] == 0)
			{
				printf("    │");
			}
			else
			{
				printf("%4d│", board[i][j]);
			}
		}
		if (i < 3)
		{
			printf("\n├────┼────┼────┼────┤\n");
		}
		else
		{
			printf("\n└────┴────┴────┴────┘\n");
		}
	}
}
void gameOver();

//随机位置生成随机数2或4
void addRand()
{
	srand((unsigned)time(NULL));//随机数种子,随机位置和随机数字,行号和列号0,1,2,3
	int i, j;//定义行号和列号
	while (1)
	{
		i = rand() % 4;//%求余数
		j = rand() % 4;

		if (board[i][j] == 0)
		{
			board[i][j] = (rand() % 3 ? 2 : 4);//随机生成2或4     3:1
			//三目运算符:表达式1?表达式2:表达式3 生成每个数字的概率都为三分之一,生成0假,1 2真,所以这里真与假的比例为2:1,若为假,则执行表达式3,为真,执行2
			break;//退出循环
		}
		else
		{
			//不能生成
			continue;//退出当前循环,马上进入下一个循环
		}
	}
}

//初始化
void initGame()
{
	if_need_rand = 1;
	if_game_over = 0;

	int i, j;
	i = rand() % 4;
	j = rand() % 4;

	board[i][j] = 2;
	addRand();
	ShowGame();
}


//上下左右四个方向

//左移
void moveLeft()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 1, k = 0; j < 4; j++)
		{
			//先找到k项后面第一个不为0的项j
			if (board[i][j] > 0)
			{
				// k项和j项相等
				if (board[i][k] == board[i][j])
				{
					board[i][k++] <<= 1;
					board[i][j] = 0;
					if_need_rand = 1;
				}
				//k项为0
				else if (board[i][k] == 0)
				{
					board[i][k] = board[i][j];
					board[i][j] = 0;
					if_need_rand = 1;
				}
				//K项不为0,j项和k项不相等
				else
				{
					board[i][++k] = board[i][j];
					//k项和j项挨在一起
					if (j != k)
					{
						board[i][j] = 0;
						if_need_rand = 1;
					}
				}
			}
		}
	}

}

//右移
void moveRight()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 2, k = 3; j >= 0; j--)
		{
			//先找到k项后面第一个不为0的项j
			if (board[i][j] > 0)
			{
				// k项和j项相等
				if (board[i][k] == board[i][j])
				{
					board[i][k--] <<= 1;
					board[i][j] = 0;
					if_need_rand = 1;
				}
				//k项为0
				else if (board[i][k] == 0)
				{
					board[i][k] = board[i][j];
					board[i][j] = 0;
					if_need_rand = 1;
				}
				//K项不为0,j项和k项不相等
				else
				{
					board[i][--k] = board[i][j];
					//k项和j项挨在一起
					if (j != k)
					{
						board[i][j] = 0;
						if_need_rand = 1;
					}
				}
			}
		}
	}

}

//上移
void moveUp()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 1, k = 0; j < 4; j++)
		{
			//先找到k项后面第一个不为0的项j
			if (board[j][i] > 0)
			{
				// k项和j项相等
				if (board[k][i] == board[j][i])
				{
					board[k++][i] <<= 1;
					board[j][i] = 0;
					if_need_rand = 1;
				}
				//k项为0
				else if (board[k][i] == 0)
				{
					board[k][i] = board[j][i];
					board[j][i] = 0;
					if_need_rand = 1;
				}
				//K项不为0,j项和k项不相等
				else
				{
					board[++k][i] = board[j][i];
					//k项和j项挨在一起
					if (j != k)
					{
						board[j][i] = 0;
						if_need_rand = 1;
					}
				}
			}
		}
	}

}

//下移
void moveDown()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 2, k = 3; j >= 0; j--)
		{
			//先找到k项后面第一个不为0的项j
			if (board[j][i] > 0)
			{
				// k项和j项相等
				if (board[k][i] == board[j][i])
				{
					board[k--][i] <<= 1;
					board[j][i] = 0;
					if_need_rand = 1;
				}
				//k项为0
				else if (board[k][i] == 0)
				{
					board[k][i] = board[j][i];
					board[j][i] = 0;
					if_need_rand = 1;
				}
				//K项不为0,j项和k项不相等
				else
				{
					board[k--][i] = board[j][i];
					//k项和j项挨在一起
					if (j != k)
					{
						board[j][i] = 0;
						if_need_rand = 1;
					}
				}
			}
		}
	}

}
int getNull()
{
	int n = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (board[i][j] == 0)
				n++;
		}
	}
	return n;
}

void gameOver()
{
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			if (board[i][j] == board[i][j + 1] || board[j][i] == board[j + 1][i])
			{
				if_game_over = 0;
				return;
			}
		}
	}
	if_game_over = 1;
}
void startGame()
{
	initGame();
	while (1)
	{
		if_need_rand = 0;
		//接收一个按键消息
		switch (_getch())//接收一个字符
		{
		case'a':
		case'A':
		case 75:
			moveLeft();
			break;
		case'd':
		case'D':
		case'77':
			moveRight();
			break;
		case'w':
		case'W':
		case'72':
			moveUp();
			break;
		case's':
		case'S':
		case'80':
			moveDown();
			break;
		default:
			break;
		}
		if (if_need_rand)
		{
			addRand();
			ShowGame();
		}

		//游戏判断
		if (getNull() == 0)//没有空位置
		{
			gameOver();
			if (if_game_over)
			{
				if (MessageBox(NULL, "是否重玩一局", "游戏结束", MB_YESNO) == IDYES)
				{
					initGame();
				}
				else
				{
					return;
				}
			}
		}
	}
}

int main() {
	startGame();
}

你可能感兴趣的:(笔记,c语言,小游戏,2048)