消消乐(初始版本)

今天想来想去,也不知道发啥知识点,所以所来想去就写了一个消消乐,娱乐一下。解释一下,叫初始版的原因是生成的工具我只能想出来一个消除行和列的工具,下面先看看代码吧。

#pragma once
#define ROW  11
#define COL  11
#include
#include
#include
#include
void mnue();
void game_entertainment();
void init(char board[ROW][COL],int row,int col);
void print(char board[ROW][COL],int row,int col);
void play(char board[ROW][COL], int row, int col);
void set_up(char board[ROW][COL], int row, int col);
void prop(char board[ROW][COL], int row, int col);
void use(char board[ROW][COL], int row, int col);
void win(char board[ROW][COL], int row, int col);

#define _CRT_SECURE_NO_WARNINGS 1
#include "entertainment.h"
//游戏菜单
void mnue()
{
	printf("**************************************\n");
	printf("************   消消乐游戏   **********\n");
	printf("************1.  play        **********\n");
	printf("************0.  exit        **********\n");
	printf("**************************************\n");
}

void game_entertainment()
{
	char board[ROW][COL] = { '\0' };
	int i = 1;
	//初始化棋盘
	init(board, ROW, COL);
	//打印棋盘
	print(board, ROW, COL);
	while (i)
	{
		//玩家开始选择坐标
		play(board, ROW, COL);
		//设置游戏规则
		set_up(board, ROW, COL);
		//生成道具
		prop(board, ROW, COL);
		//使用道具
		use(board, ROW, COL);
		//判断输赢
		win(board, ROW, COL);
		i--;
	}
	printf("很遗憾你没有闯关成功\n");
}
//初始化棋盘
void init(char board[ROW][COL], int row, int col)
{
	//赋初值
	int i = 0;
	int j = 0;
	int count = ((row - 1) * (col - 1)) / 2;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = '*';
		}
	}
	//赋随机值
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % 10 + 1;
		y = rand() % 10 + 1;
		if (board[x][y] == '#');
		else
		{
			board[x][y] ='#';
			count--;
		}
	}
}
//打印棋盘
void print(char board[ROW][COL],int row,int col)
{
	int i = 0;
	int j = 0;
	for (i = 1; i < row; i++)
	{
		for (j = 1; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 1; j < col; j++)
			{
				printf("___");
				if (j < col - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}
//玩家开始选择坐标
void play(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	while (1)
	{
		//先判断是否合理
		printf("请选择坐标\n");
		scanf("%d %d", &i, &j);
		if (i > row || j > col)
		{
			//不合理则继续输入,直到合理为止
			printf("请重新输入,超出范围\n");
		}
		else
		{
			//合理的话判断他要与之交换的坐标
			printf("请选择你要与之交换的坐标\n");
			int x = 0;
			int y = 0;
			while (1)
			{
				//继续判断坐标是否合理
				scanf("%d %d", &x, &y);
				if (x > row || i > col)
				{
					printf("范围不符合与之交换的坐标,请重新选择要与之交换的坐标\n");
				}
				else
				{
					int tem = board[i][j];
					board[i][j] = board[x][y];
					board[x][y] = tem;
					set_up(board, row, col);
					//交换完之后再打印
					system("cls");
					print(board, row, col);
					break;
				}
			}
			break;
		}
	}
}
//游戏规则
void set_up(char board[ROW][COL], int row, int col)
{
	int i = 1;
	int j = 0;
	//消除的规则(有四个一样的就消除)
	for (i = 1; i < row; i++)
	{
		for (j = 1; j < col; j++)
		{
			if ((j + 3 )< col)
			{
				if ((board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2])&&(board[i][j + 2]== board[i][j + 3]))
				{
					board[i][j] = ' ';
					board[i][j + 1] = ' ';
					board[i][j + 2] = ' ';
					board[i][j + 3] = ' ';
				}
			}
		}
	}
	for (j = 1; j < col; j++)
	{
		for (i = 1; i < row; i++)
		{
			if ((j + 3) < row)
			{
				if ((board[j][i] == board[j][i + 1]) && (board[j][i + 1] == board[j][i + 2])&&(board[j][i+2]==board[j][i+3]))
				{
					board[j][i] = ' ';
					board[j+1][i] = ' ';
					board[j+2][i] = ' ';
					board[j+3][i] = ' ';
				}
			}
		}
	}
}
//生成道具规则
void prop(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (j = 0; j < col; j++)
	{
		for (i = 0; i < row; i++)
		{
			if ((j + 2) < row)
			{
				if (((board[j][i] == board[j][i + 1]) && (board[j][i + 1] == board[j][i + 2])))
				{
					board[j][i] = 36;
					board[j+1][i] = ' ';
					board[j+2][i] = ' ';
				}
			}
		}
	}
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if ((j + 2) < col)
			{
				if (((board[i][j] == board[i][j + 1]) && (board[i][j + 1] == board[i][j + 2])))
				{
					board[i][j] = 36;
					board[i][j + 1] = ' ';
					board[i][j + 2] = ' ';
				}
			}
		}
	}
}
//使用道具
void use(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int t = 0;
	int p = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == 36)
			{
				p = i;
				while (p < row)
				{
					board[p][j] = ' ';
					p++;
				}
				while (t < col)
				{
					board[i][t] = ' ';
					t++;
				}
			}
		}
		
	}
}
//判断输赢
void win(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	int ret = 0;
	for (i = 1; i < row; i++)
	{
		for (j = 1; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				ret++;
			}
		}
	}
	if (ret == ((row - 1) * (col - 1)))
	{
		printf("恭喜你,你赢了\n");
	}
	else;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "entertainment.h"
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		mnue();

		scanf("%d", &input);
		/*system("cls");*/
		switch (input)
		{
		case 1:
			printf("play_entertainment\n");
			printf("--------------------------------\n");
			game_entertainment();
			break;
		case 0:
			printf("exit\n");
			break;
		default :
			printf("选择错误,请重新选择\n");
			break;
		}
		
	} while (input);
	return 0;
}

还是和以前一样,分了三个文件来写的,一个头文件,一个测试,一个是总结的文件

消消乐的规则相信大家都是知道的,所以我就让他们随机换位置(这个和正规的游戏规则不一样,因为这里生成随机数,要把数组复制成各种各样的不一样的,我感觉麻烦,所以就直接复制成*和#号了)。只要是有四个一样的,那就消除,把这四个一样的数组元素换成空格。如果换完有三个是一样的,那么就可以生成道具,道具的作用是消除行和列的所有元素,也是复制成空格。然后因为害怕出现死局(也就是小不完的情况,所以我就设置了次数,如果在规定次数内完成,那么就成功,否则失败)。下面是运行时的样子

消消乐(初始版本)_第1张图片

生成工具的样子

消消乐(初始版本)_第2张图片 

我用的是ASCII码为36的字符,本来想ASCII为2的,但是打印不出来2的字符,可以看我的注释,因为我是生成工具,就使用,所以在棋盘上是显示不出来的 ,下面是赢了的时候

消消乐(初始版本)_第3张图片

 下面是闯关不成功的时候

消消乐(初始版本)_第4张图片

想看源码点这:https://gitee.com/stickykkkkkk/game/tree/master/entertainment/game4/game4 

其实我觉得在生成工具和实用工具那应该使用递归应该是很好的,但是我没有想出来,导致写的代码量很多,如果有老铁想出来,麻烦私信告知或是评论区留言。其实我想了好多天这个游戏的规则,但是我总感觉我自己不太清楚,所以拖了好几天,也是今天写了一下午,希望大家支持吧!后面会发升级版的消消乐。其实这个游戏我觉得思想和三子棋,五子棋有点像,就是很麻烦(今天有一个小地方内存访问越界了,找了一晚上)。

最后,希望大家多多支持,多多点赞!谢谢!如果老铁知道更好的方法,希望私信告知或是评论区留言。

你可能感兴趣的:(平时练习篇,c++,c语言,算法)