C语言实现三子棋

C语言实现三子棋首先要创建一个3*3的二维数组.

其中有4个函数

首先是初始化函数,将数组里的每个元素都初始化为一个空格

其次是玩家输入函数,玩家先输入一个坐标,并判断此坐标是否为空格,如果是空格,则表示此坐标里没有棋子,则将这个元素落子为'x',如果此坐标不是空格,则有棋子,由玩家重新输入,直到输入的坐标没有棋子为止.

还有电脑输入函数,利用时间戳%2得到2个0-2之间的随机数,即为此次随机的坐标,在判断此坐标是否有棋子,没有的话落子为'o'.

还有判断是否游戏结束的函数,有4种判断方式,一种是一行里都是'x'或'o',或者一列里都是'x'或'o',或者一个对角线里都是'x'或'o',或者3*3的二维数组里没有空格了,即为游戏结束.前三种判断方式是有胜者的,返回这一行或这一列或这一个对角线的任意一个元素即可,如果是第四种判断方式,那么就返回's'.如果没有结束游戏,则返回空格.

在主函数里,先char 胜者为空格,再进行循环,循环体里写玩家输入和电脑输入,每次输入之后都要将游戏判断函数的返回值赋给胜者,再判断游戏是否结束.

如果结束了,在判断胜者是否为'x',是的话输出玩家胜利,在判断胜者是否为'o',是的话电脑胜利,否则就是和棋.

代码如下:

#include<stdio.h>
#include<string.h>
#include<time.h>
#include<Windows.h>
//  棋盘的长
#define max_row 3
//  棋盘的宽
#define max_col 3
//  初始化棋盘,棋盘里元素全部赋空格
void init(char board[max_row][max_col]) {
	for (int row = 0; row < max_row; row++) {
		for (int col = 0; col < max_col; col++) {
			board[row][col] = ' ';
		}
	}
	srand((unsigned int)time(0));
}
// 打印棋盘
void printboard(char board[max_row][max_col]){
	system("cls");
	for (int row = 0; row < max_row; row++) {
		printf("+---+---+---+");
		printf("\n");
		for (int col = 0; col < max_col; col++) {
			printf("| %c ", board[row][col]);

		}
		printf("|");
		printf("\n");
	}
	printf("+---+---+---+");
	printf("\n");
}
//判断棋盘是否已满
int full(char board[max_row][max_col]) {
	for (int row = 0; row < max_row; row++) {
		for (int col = 0; col < max_col; col++) {
			//判断棋盘里是否存在空格,若存在则返回0
			if (board[row][col] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}
//玩家落子
void player(char board[max_row][max_col]) {
	printf("请玩家落子:\n");
	while (1) {
		//玩家输入落子的坐标
		int row, col = 0;
		scanf("%d %d", &row, &col);
		//判断坐标是否在3*3的方格中
		if (row < 0 || col < 0 || row >= max_row || col >= max_col) {
			printf("输入错误,请重新落子!\n");
			continue;
		}
		//判断落子位置是否为' ',若是则结束本次循环,重新赋值
		if (board[row][col] != ' ') {
			printf("你落得位置已经有子了,请重新落子!\n");
			continue;
		}
		//玩家落子,落子赋为x
		board[row][col] = 'x';
		break;
	}
}
//电脑落子
void computer(char board[max_row][max_col]) {
	printf("请电脑落子:\n");
	while (1) {
		//电脑落子在0-2的随机数坐标中
		int row = rand() % max_row;
		int col = rand() % max_col;
		//如果不为空,则有子,结束本次循环,再随机一次
		if (board[row][col] != ' ') {
			continue;
		}
		//电脑落子,落子赋为o
		board[row][col] = 'o';
		break;
	}
}
//判断是否已出现胜者
char checkwinner(char board[max_row][max_col]) {
	//判断所有的行
	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];
			
		}
	}
	//判断所有的列
	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];
			
		}
	}
	//判断对角线
	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];
	}
	//判断棋盘是否已满
	if(full(board)){
		return 's';
	}
	return ' ';
}

int main(){
	char board[max_row][max_col] = { 0 };
	init(board);
	char winner=' ';
	while (1) {
		printboard(board);
		player(board);
		winner = checkwinner(board);
		printboard(board);
		if (winner != ' ') {
			break;
		}
		computer(board);
		printboard(board);
		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、付费专栏及课程。

余额充值