C语言实现玩家与电脑对战三子棋

头文件

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define max_row 3//用宏定义3行
#define max_col 3//用宏定义3列

使用init函数把棋盘的每个格子都初始化成空格

void init(char board[max_row][max_col]) {
	for (int row = 0; row < 3; row++) {
		for (int col = 0; col < 3; col++) {
			board[row][col] = ' ';
		}
	}

	srand((unsigned int)time(0));//设置电脑落子的随机种子
}

使用printboard函数打印棋盘格函数

void printboard(char board[max_row][max_col]){
	//打印之前先清屏
	system("cls");
	for (int row = 0; row < max_row; row++) {
		printf("+---+---+---+\n");
		for (int col = 0; col < max_col; col++) {
			printf("| %c ", board[row][col]);
		}
		printf("|");
		printf("\n");
	}
	printf("+---+---+---+\n");
}

在这里插入图片描述

使用playermove函数实现玩家落子,玩家落子显示为x(如果超出棋盘范围,显示输入有误;如果输入的位置已经有棋子,显示重新输入)

void playermove(char board[max_row][max_col]) {
	printf("请玩家落子!");
	while (1) {
		printf("请输入落子位置的坐标(row col):");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		//输入完了之后,一定要验证一下输入的内容是不是非法的.
		if (row < 0 || row >= max_row || col < 0 || col >= max_col) {
			printf("您的输入有误!请重新输入!\n");
			continue;
		}
		if (board[row][col] != ' ') {
			printf("当前位置已经有子了,无法落子!\n");
			continue;
		}
		board[row][col] = 'x';
		break;
	}
}

使用computermove函数实现电脑随机落子,电脑落子显示为o(如果输入的位置已经有棋子,就重新随机位置)

void computermove(char board[max_row][max_col]) {
	printf("轮到电脑落子!\n");
	while (1) {
		int row = rand() % max_row;
		int col = rand() % max_col;
		if (board[row][col] != ' ') {
			continue;//这个位置已经有子了,就重新生成随机数
		}
		board[row][col] = 'o';
		break;
	}
}

使用isfull函数判断是否和棋(如果在棋盘中找不到空格了,就说明已经满了;满了返回1,没满返回0)

int isfull(char board[max_row][max_col]) {
	for (int row = 0; row < max_row; row++) {
		for (int col = 0; col < max_col; col++) {
			if (board[row][col] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}

使用checkwinner函数判断胜负(如果玩家获胜,返回x;如果电脑获胜,返回y;如果和棋,返回q;如果胜负未分,返回空格)

//如果玩家获胜,返回x;如果电脑获胜,返回y
char checkwinner(char board[max_row][max_col]) {
	//1.检测所有行
	for (int row = 0; row < max_row; row++) {
		if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) {
			return board[row][0];
		}
	}
	//2.检测所有列
	for (int col = 0; col < max_col; col++) {
	if (board[0][col] != ' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) {
		return board[0][col];
	}
}
	//3.检测所有对角线
	if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
		return board[0][0];
	}
	if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
		return board[0][2];
	}
	//4.判定和棋
	if (isfull(board) ){
		return 'q';
	}
	return ' ';
}

主函数,调用上述函数

int main() {

	//1.创建一个棋盘,并进行初始化;
	char board[max_row][max_col] = { 0 };
	//2.使用init函数把棋盘的每个格子都初始化成空格
	init(board);
	char winner = ' ';
	while (1) {
		//3.先打印一下棋盘的内容
		printboard(board);
		//4.玩家落子
		playermove(board);
		winner = checkwinner(board);
		if (winner != ' ') {
			break;//胜负已分
		}
		//5.电脑落子
		computermove(board);
		//6.判定胜负
		winner = checkwinner(board);
		if (winner != ' ') {
			break;//胜负已分
		}
	}
	if (winner == 'x') {
		printf("玩家获胜!");
	}
	else if (winner == 'o') {
		printf("电脑获胜!");
	}
	else {
		printf("和局!");
	}

	return 0;
}

玩家获胜显示

在这里插入图片描述

电脑获胜显示

在这里插入图片描述

和局显示

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值