C语言多子琪的实现

多子琪的实现总共有这么几步

(1)游戏的大体设计

#include<stdio.h>
int main()
{
	int input = 0;
	do
	{
		menu();//游戏菜单
		printf("请作出选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:printf("选择有误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

先是利用do while()语句来实现游戏的重复使用,然后再使用Switch函数来搭建游戏开始界面和菜单搭配使用。

(2)游戏菜单的设计

void menu()
{
	printf("********************************\n");
	printf("***** 1、进入游戏 **************\n");
	printf("***** 0、退出游戏 **************\n");
	printf("********************************\n");
}

游戏菜单还是利用了printf()函数来简单的实现菜单功能。

(3)游戏的设计

由于棋盘是一个一个的小个子符合二维空间的意思,故采取二维数组来实现,首先定义数组一个二维数组。

int arr[ROW][COL] = {0} ;

ROW和COL是利用了宏定义的方式,就是为了能够实现多子琪,而不仅仅局限于三子棋或四子棋等等。

#define ROW 3
#define COL 3

这里我们先定义成三来讲解,后面可以自己随意改变数字。

棋盘首先是白板,我们得先把数组初始化,初始化为空格刚好可以留出下棋的空间。

先构建一个初始化函数initialize(arr,ROW,COL)。再继续搭建该函数的功能。

扫描二维码关注公众号,回复: 15616718 查看本文章
void initialize(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

初始化完成后,目前只有多了9个空间,还需要把棋盘的初始样子打印出来,构建一个函数来打印棋盘。

void copychec(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", arr[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

完成棋盘的打印后就正式开始下棋。

首先是玩家下棋,构建函数。

因为我们是了解了一些计算机的知识,因此知道数组是从下标0开始,而非计算机人士大概不知道因此我们玩家下棋的范围,横纵坐标都应该是大于等于1,小于等于ROW或COL(就是你一开始设置的多子琪的棋数,而我们开头是用三子棋来写,故我们这的范围是大于等于1,小于等于3)。

void playmove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	while (1)
	{
		printf("请输入下棋的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*' ;
				break;
			}
			else
			{
				printf("位置被占,请重新输入\n");
			}
		}
		else
		{
			printf("输入不合法,请重新输入\n");
		}
	}
}

下完棋后,为了方便下一步下棋,我们得把此时棋盘打印出来

再次调用copychec()函数。

然后轮到电脑下棋,也是构建函数。其中我们还利用了rand()函数,来让电脑下的坐标是随机值。使用rand函数前还需在main函数中加上 srand((unsigned int )time(NULL));头文件名为:#include<stdlib.h>和#include<time.h>

void computemove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#'; 
			break;
		}
	}
}

同样需要打印棋盘,调用copychec()函数。

--------------------------------------------------------------------------------

我们下棋不可能只下一步,所以我们把上述放在while()函数中

此时游戏框架简单搭建好

void game()
{
	char arr[ROW][COL] = { 0 };
	initialize(arr, ROW, COL);//数组初始化
	copychec(arr, ROW, COL);//打印棋盘

	while (1)
	{
		playmove(arr, ROW, COL);//玩家下棋
		copychec(arr, ROW, COL);//打印棋盘

		computemove(arr, ROW, COL);//电脑下棋
		copychec(arr, ROW, COL);//打印棋盘
	}
}

当然游戏是有输赢的。

得分别在玩家下完判断以及电脑下完棋进行判断。因此设计一个函数来满足这个功能。

在判断中总共有四种情况,“玩家赢、电脑赢、平局、继续”,分别用返回值“*、#、m、n”来表示而在判断过程中我们采用计数的形式来判断谁赢,这也满足了多子琪变化的要求,不局限于确定的棋子数,这样写更灵活。在判断列时,我们交换了i与j的循环位置,这样能让它一列一列的判断。

而最后在判断平局时我们利用了Inspect()函数来对整个棋盘检查是否还有空的格子,如果有则返回0,反之则返回1.

//返回的是‘*’玩家赢
//返回的是‘#’电脑赢
//返回的是‘m'平局
//返回的是‘n'继续
//

int Inspect(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;
		
		}
	}
	return 1;
}

char Deter(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//判断行
	for (i = 0; i < row ; i++)
	{
		int count = 0;
		for (j = 0; j < col - 1; j++)
		{
			if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if(count == row - 1)
				return arr[i][j];
		}
	}
	//判断列
	for (j = 0; j < col ; j++)
	{
		int count = 0;
		for (i = 0; i < row - 1; i++)
		{
			if (arr[i][j] == arr[i + 1][j] && arr[i][j] != ' ')
			{
				count++;
			}
			if(count == row -1)
				return arr[i][j];
		}
	}
	//判断对角线
		int countn = 0;
	for (i = 0; i < row - 1; i++)
	{
		//判断右对角线

		for (j = 0; j < col; j++)
		{
			if (i + j == row - 1 && arr[i][j] == arr[i + 1][j - 1] && arr[i][j] != ' ')
			{
				countn++;
			}
			if(countn == row - 1)
				return arr[i][j];
		}
	}
	//判断左对角线
	int count = 0;
	for (i = 0; i < row - 1; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			if (i == j && arr[i][j] == arr[i + 1][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if(count == row - 1)
				return arr[i][j];
		}
	}
	//平局
	if (Inspect(arr, ROW, COL) == 1)
	{
		return 'm';
	}
    //继续
	return 'n';
}

最后游戏的功能成功设计完成。

void game()
{
	char arr[ROW][COL] = { 0 };
	initialize(arr, ROW, COL);//数组初始化
	copychec(arr, ROW, COL);//打印棋盘
	char net = 0;
	while (1)
	{
		playmove(arr, ROW, COL);//玩家下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;

		computemove(arr, ROW, COL);//电脑下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;
	}
		if (net == '*')
		{
			printf("玩家赢了\n");
		}
		else if (net == '#')
		{
			printf("电脑赢了\n");
		}
		else if (net == 'm')
		{
			printf("平局\n");
		
		}
	
}

游戏整体的代码为:

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("********************************\n");
	printf("***** 1、进入游戏 **************\n");
	printf("***** 0、退出游戏 **************\n");
	printf("********************************\n");
}

void initialize(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void copychec(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", arr[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}
void playmove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家下棋\n");
	while (1)
	{
		printf("请输入下棋的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (arr[x - 1][y - 1] == ' ')
			{
				arr[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("位置被占,请重新输入\n");
			}
		}
		else
		{
			printf("输入不合法,请重新输入\n");
		}
	}
}

void computemove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = '#';
			break;
		}
	}
}


//返回的是‘*’玩家赢
//返回的是‘#’电脑赢
//返回的是‘m'平局
//返回的是‘n'继续
//

int Inspect(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;

		}
	}
	return 1;
}

char Deter(char arr[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	//判断行
	for (i = 0; i < row; i++)
	{
		int count = 0;
		for (j = 0; j < col - 1; j++)
		{
			if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return arr[i][j];
		}
	}
	//判断列
	for (j = 0; j < col; j++)
	{
		int count = 0;
		for (i = 0; i < row - 1; i++)
		{
			if (arr[i][j] == arr[i + 1][j] && arr[i][j] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return arr[i][j];
		}
	}
	//判断对角线
	int countn = 0;
	for (i = 0; i < row - 1; i++)
	{
		//判断右对角线

		for (j = 0; j < col; j++)
		{
			if (i + j == row - 1 && arr[i][j] == arr[i + 1][j - 1] && arr[i][j] != ' ')
			{
				countn++;
			}
			if (countn == row - 1)
				return arr[i][j];
		}
	}
	//判断左对角线
	int count = 0;
	for (i = 0; i < row - 1; i++)
	{
		for (j = 0; j < col - 1; j++)
		{
			if (i == j && arr[i][j] == arr[i + 1][j + 1] && arr[i][j] != ' ')
			{
				count++;
			}
			if (count == row - 1)
				return arr[i][j];
		}
	}
	//平局
	if (Inspect(arr, ROW, COL) == 1)
	{
		return 'm';
	}
	return 'n';
}

void game()
{
	char arr[ROW][COL] = { 0 };
	initialize(arr, ROW, COL);//数组初始化
	copychec(arr, ROW, COL);//打印棋盘
	char net = 0;
	while (1)
	{
		playmove(arr, ROW, COL);//玩家下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;

		computemove(arr, ROW, COL);//电脑下棋
		copychec(arr, ROW, COL);//打印棋盘
		net = Deter(arr, ROW, COL);//判断输赢
		if (net != 'n')
			break;
	}
		if (net == '*')
		{
			printf("玩家赢了\n");
		}
		else if (net == '#')
		{
			printf("电脑赢了\n");
		}
		else if (net == 'm')
		{
			printf("平局\n");
		
		}
	
}



int main()
{
	int input = 0;
	do
	{
		menu();//游戏菜单
		printf("请作出选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:printf("选择有误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

本次的多子琪游戏就讲解到此,因为本人水平有限,在某些地方讲解的不是很清楚,欢迎大家纠正,谢谢!

猜你喜欢

转载自blog.csdn.net/weixin_74967884/article/details/131342078