全网最详细的三子棋来了哦,赶紧接收啦

想必大家都玩过下棋吧,儿时的乐趣,今天阿博带领兄弟们重拾童年,好了,话不多说,进入正题.

全网最详细的三子棋来了哦,赶紧接收啦_第1张图片

一.创建编译环境

二.打印游戏菜单

2.1启动游戏
2.2打印一个3乘3的棋盘
2.3初始化这个棋盘
2.4需要显示这个棋盘
2.5玩家下棋
2.6电脑下棋
2.7判断输赢

三.

3.1创建存放游戏主体文件test.h
3.2创建存放头文件的文件game.h
3.3创建游戏的实现文件game.c

这里我们首先实现打印游戏菜单和启动游戏的代码

#include"game.h"
void  menu()
{
	printf("********************\n");
	printf("****** 1.play ******\n");
	printf("****** 0.exit ******\n");
	printf("********************\n");
}
int  main()
{
	int  input = 0;
	srand((unsigned int )time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf_s("%d", &input);
		switch (input)
		{
		case 1:
			/*printf("三子棋\n");*/
			/*测试游戏的逻辑*/
			game();
	      break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新选择\n");
			break;
		}

	} while (input);
	return  0;
}

让我们看看打印的具体实现

全网最详细的三子棋来了哦,赶紧接收啦_第2张图片
是不是已经开始期待游戏的内容了,来继续跟着阿博探索吧.
接下来我们开始打印棋盘,这里先给兄弟们看个图片全网最详细的三子棋来了哦,赶紧接收啦_第3张图片
我们可以把棋盘的行和列定义到game.h里面,这样我们可以随意修改棋盘的大小,如果这里我们不这样做的话,后续我们修改行和列的话,我们需要在这三个文件中全部找到行和列,那样我们小脑瓜就要哭唧唧啦.
接下来看打印棋盘的具体代码实现

void Displayboard(char  board[ROW][COL], int row, int col)
{
	int  i = 0;
	int  j = 0;
	for (i = 0; i < row; i++)
	{
		int  j = 0;
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[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");
			     
	}
}

这里点出一个小细节,为什么j的值要小于col-1呢,因为我们的三子棋盘呈现出一个#状,所以打印行和列的时候,最后一行和最后一列我们不需要打印,可以把它理解为一个开空间嘻嘻.

带大家看看有弊端的写法

void Displayboard(char  board[ROW][COL], int row, int col)
{
	int  i = 0;
	int  j = 0;
	for (i = 0; i < row; i++)
	{
		printf(" %c | %c | %c \n",board[i][0],board[i][1],board[i][2]);      /*把上面数据下面横线看为一组,这种解法很妙*/
		if(i<row-1)          /* 把最后一行去掉*/
		printf("---|---|---\n");     /*这样做有弊端,相当于把棋盘固定了*/
	}
}

我们这样写其实也没有错误,但是我们就把这个棋盘封锁了,它的规格只能是3乘3,我们没办法再修改棋盘的规格了,所以我们要灵活运用代码

好了,接下来我们开始初始化棋盘,直接上代码

void  Initboard(char  board[ROW][COL],int row ,int col)
{
	int  i = 0;
		for (i = 0; i < row; i++)
		{
			int  j = 0;
			for (j = 0; j < col; j++)
			{
				board[i][j] = ' ';
			}
		}
		/*memset(&board[0][0], ' ', row * col * board[0][0]);*/
}

这里我们大家可能会有一个疑问,为什么初始化棋盘不是0呢,让我们看看0的效果

全网最详细的三子棋来了哦,赶紧接收啦_第4张图片
这就是初始化为0的效果,所以我们一定要多动手尝试哦.
接下来我们开始进入人机大战环节,“战歌走起”

void  Playermove(char board[ROW][COL], int row, int col)
{
	int  x = 0;
	int  y = 0;
	printf("玩家下棋:>\n");
	while (1)
	{
		printf("请输入要下棋的坐标:>\n");
		scanf_s("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')     /*因为数组下标从0开始,所以我们需要减去1,判断棋盘某个位置是否被占用*/
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入:>\n");
		}
	}
}

这里我们需要注意集中情况,包括坐标重复使用或者坐标超出棋盘规模,最重要的一点就是board[x-1]和board[y-1],这里这样写的原因是数组下标从0开始,而玩家下棋他们传统的理念从1开始!!!

接下来电脑出手,“上战歌”.

void  Computermove(char  board[ROW][COL], int row, int col)
{
	int  x = 0;
	int  y = 0;
	printf("电脑下棋:>\n");               /*电脑随机下棋*/
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}

}

兄弟们,有时候会发现电脑走着走着不会下棋了,这个时候我们一定要注意当我们随机生成x和y的时候,要把它放进while循环里面使用,我都掉坑一次

最后我们该判断哪一方“夺取了江山,赢得了美人和天下”。

int Isfull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
			
		}
	}
	return 1;
}
char  Iswin(char board[ROW][COL], int row, int col)  /* 玩家获胜-'*',电脑获胜-'#'平局-'Q'继续-'C'*/
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];    /*不需要判断是什么符号了*/
		}
		
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
		{
			return  board[0][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	/*判断是否平局*/
	if (Isfull(board, row, col))
	{
		return 'Q';
	}
	/*游戏继续*/
	return 'C';
}

好了,兄弟们,以上就是我们代码的全部实现了大家一定要注意在使用函数之前,一定要先声明后使用
让我们欣赏一下我们的劳动成果吧
全网最详细的三子棋来了哦,赶紧接收啦_第5张图片

总结:今天的内容就到此结束了,有没有发现代码其实很有趣爱,我们在以后编程的路上,要多多探索,我相信我们的人生亦是如此,只管去努力,前方就是曙光,让我们下期再见吧

全网最详细的三子棋来了哦,赶紧接收啦_第6张图片

你可能感兴趣的:(c语言)