C语言实现三子棋

#include<stdio.h>
#include<memory.h>
#include<time.h>
int row = 3, col = 3;
int vis[3][3] = { 0 };//表示格子里的数字是否被下过
char arr[3][3] = { 0 }; 

int menu();//显示菜单
void board();//显示棋盘
void player();//玩家下棋
void com();//电脑随机下棋
int win();//判断是否有人胜利

int main()
{
	int i = 0, j = 0;
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 3; j++) {
			arr[i][j] = ' ';
		}
	}
	int ret = 0;//接受win的返回值
	srand((unsigned int)time);//播下随机数的种子
	while (menu()) {
		
		while (1) {//break控制循环
			board();//显示棋盘
			player();
			com();//双方下棋
			if (ret = win()) {
				if (ret == 1) {
					board();//显示一次你赢了的状况
					printf("你赢了\n");
					break;
				}
				else {
					board();//不让你输得不知不觉,再显示一次
					printf("你输了,电脑获胜\n");
					break;
				}
			}
		}
		//重新初始化棋盘
		for (i = 0; i < 3; i++) {
			for (j = 0; j < 3; j++) {
				arr[i][j] = ' ';
			}
		}
		memset(vis, 0, 9);
	}
	return 0;
}

int menu()
{
	printf("****************\n");
	printf("*****1 play*****\n");
	printf("*****2 exit*****\n");
	printf("****************\n");
	printf("请输入你的选择>");
	int choose = 0;
	scanf("%d", &choose);
	if (choose == 1) {
		return 1;//玩就返回真
	}
	return 0;//不玩返回假
}

void board()
{
	printf("  %c |  %c |  %c\n", arr[0][0], arr[0][1], arr[0][2]);
	printf(" ---|----|---\n");
	printf("  %c |  %c |  %c\n", arr[1][0], arr[1][1], arr[1][2]);
	printf(" ---|----|---\n");
	printf("  %c |  %c |  %c\n", arr[2][0], arr[2][1], arr[2][2]);//%占用了一个空格,所以多输入一个空格
	printf(" ---|----|---\n");
}

void player()
{
	printf("来到你的回合\n");
	printf("请输入行和列>");
	int x, y;
	while (scanf("%d %d", &x, &y)) {//输入正确之后再跳出循环
		if (x <= 0 || y <= 0 || x >= 4 || y >= 4) {//越界了
			printf("输入错误,请重新输入\n");
			continue;
		}
		if (vis[x - 1][y - 1] == 1) {//被下过了
			printf("这里被下过了,请重新输入\n");
			continue;
		}
		arr[x - 1][y - 1] = 'X';
		vis[x - 1][y - 1] = 1;//标记为下过了
		break;//跳出循环
	}
}

void com()
{
	int t;
	while (1) {
		t = rand() % 8;//0-8随机数
		int crow = t / 3;
		int ccol = t - crow * 3;//一维化二维
		//不会越界,所以只考虑是否走过
		if (vis[crow][ccol] == 1)
			continue;
		arr[crow][ccol] = 'O';
		vis[crow][ccol] = 1;
		break;
	}
}

int win()
{
	int i, j = 0;
	for (i = 0; i < 3; i++) {//判断三行
		if (arr[i][0] == 'X' && arr[i][1] == 'X' && arr[i][2] == 'X')
			return 1;
		if (arr[i][0] == 'O' && arr[i][1] == 'O' && arr[i][2] == 'O')
			return 2;
	}
	for (i = 0; i < 3; i++) {//判断三列
		if (arr[0][i] == 'X' && arr[1][i] == 'X' && arr[2][i] == 'X')
			return 1;
		if (arr[0][i] == 'O' && arr[1][i] == 'O' && arr[2][i] == 'O')
			return 2;
	}
	if (arr[0][0] == 'O' && arr[1][1] == 'O' && arr[2][2] == 'O')//主对角线
		return 2;
	if (arr[0][0] == 'X' && arr[1][1] == 'X' && arr[2][2] == 'X')
		return 1;
	if (arr[0][2] == 'O' && arr[1][1] == 'O' && arr[2][0] == 'O')//副对角线
		return 2;
	if (arr[0][2] == 'X' && arr[1][1] == 'X' && arr[2][0] == 'X')
		return 1;
	return 0;//以上情况均不满足,没人赢,返回假
}

没啥好说的,能力有限,电脑不能实现智能,只能随机下棋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值