c语言编写简单的三子棋

利用c语言编写三子棋的代码,相对来说比较简单,三子棋其实就可以看作是以个三行三列的二维数组,然后对其里面的每个元素进行赋值。因此我们首先需要理清楚三子棋完成的思路。

1.首先我们需要一个棋盘,所以需要一个print()函数来打印棋盘。而棋盘内容需要什么呢,很显然是棋子。我们选择‘x’为玩家落子,‘o’为电脑落子。

2.然后就是落子的过程了。我们玩家落子的时候,以输入坐标的方式来进行,我们用player()函数实现;而电脑落子的话,我们就直接采用随机数的方式完成电脑落子,用computer()函数实现。

3.落子完了之后,我们就需要判定当前棋局的状况了。当前棋局的状况可以能有以下几种情况:(1)玩家获胜;(2)电脑获胜;(3)和棋。这三种情况都是游戏结束时的情况,当然还有一种就是棋局没有结束,玩家电脑继续落子。判定当前棋局状况的话我们就用一个check()函数来完成。

理清楚思路后,接下来看看各个函数如何实现吧。

首先时print()函数来打印棋盘:由于每个函数都需要进行二维数组传参,所以我直接将二维数组arr[row][col]定义为全局变量,这样也更加方便,打印棋盘很简单,就是直接printf就可以了,至于打印出来的效果,看个人的看法吧。

void print()
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			printf("|  %c ",arr[i][j]);
			if (j == 2)
			{
				printf("|");
			}
		}
		printf("\n");
		printf("|____|____|____|");
		printf("\n");
	}
}

然后是用play()函数完成玩家落子:play()函数需要注意的是你输入的坐标问题,如果你输入的坐标超过数组下标了,或者该坐标已经落过子了,则显示输入错误,请重新输入,因此我们需要一个while循环来完成。当输入的坐标合法了,就把该位置赋值为‘x',也就可以退出循环了。

void player()
{		
	int x = 0;
	int y = 0;
 	while (1)
	{	
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		if (x<0 || x>=row || y<0 || y>=col)
		{
			printf("输入错误,请重新输入!\n");
			continue;
		}
		if (arr[x][y] != ' ')
		{
			printf("输入错误,请重新输入!\n");
			continue;
		}
		arr[x][y] = 'x';
		break;
	}
}

然后是computer()函数完成电脑落子:由于电脑落子是直接采用随机数,所以需要使用rand()函数和随机种子。我们知道rand()函数的随机值是0~99,而我们的数组是3X3的,所以让数组下标等于rang()%3就可以保证电脑落子有坐标越界的问题,但是依旧要考虑坐标上有子的问题,所以也需要while循环重新落子。

void computer()
{		
	while (1)
	{
		int a = rand() % row;
		int b = rand() % col;
		if (arr[a][b] != ' ')
		{
			continue;
		}
		arr[a][b] = 'o';
		break;
	}

}

接下来是check()函数来完成棋局的判断:判断也很简单,就是一行或者一列或者对角线相同时,当然还要保证它们不等于’ ‘,因为我们一开始打印棋盘时,把二维数组里的元素全部定义为空格也就是字符’ ‘。check()函数我们需要返回一个值用来表示棋局状况,当玩家赢时,我们返回’x’;当电脑赢时,我们返回‘o’;若是和棋,则返回‘p’ ;若游戏没有结束我们就返回‘ ’。而判断和棋我定义了一个Isfull函数,若棋盘满了且不满足上面两种胜负情况就表示和棋。

int Isfull()
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			if (arr[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char check()
{
	int i = 0;
	for (i = 0; i < row; ++i)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2]&&arr[i][0] != ' ')
		{
			return arr[i][0];
		}
	}
	for (i = 0; i < col; ++i)
	{
		if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
		{
			return arr[i][0];
		}
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')
	{
		return arr[1][1];
	}
	else if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
	{
		return arr[1][1];
	}
	else if (Isfull() == 1)
	{
		return 'p';
	}
	else
		return ' ';
}

最后就是主函数部分了。主函数部分这里我定义了一个init()函数完成二维数组的初始化。然后就是我们需要在每一次玩家和电脑落子之后调用check()函数,还有我使用了一个system("cls")清理屏幕,让输出结果更明了,最后当游戏结束时,再打印一次棋盘,看最后的棋盘状况。

#define   _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row  3
#define col  3
char arr[row][col];
void init()
{
	for (int i = 0; i < row; ++i)
	{
		for (int j = 0; j < col; ++j)
		{
			arr[i][j] = ' ';
		}
	}
}
int main()
{
	srand((unsigned int)time(0));
	init();
	char winner = '\0';
	while (1)
	{
		print();
		player();
		winner = check();
		if (winner != ' ')
		{
			break;
		}
		computer();
		winner = check();
		if (winner != ' ')
		{
			break;
		}
		system("cls");
	}
	if (winner == 'x')
	{
		printf("you win\n");
	}
	else if (winner == '0')
	{
		printf("you lost\n");
	}
	else if (winner == 'p')
	{
		printf("和棋!\n");
	}
	print();
	system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值