C语言实现三子棋小游戏

本文介绍了一个3x3三子棋游戏的代码实现,包括游戏菜单显示、棋盘初始化、棋盘显示、玩家和电脑下棋、输赢判断等功能。玩家和电脑轮流落子,当某一方在行、列或对角线上形成连续三个棋子时获胜。此外,还提供了判断输赢的详细逻辑。

游戏规则

在3x3的棋盘上,玩家与电脑进行下棋,当有任意一方,先实现某一行或列都是自己所落的棋子,或者说在对角线上出现都是自己所落的棋子时,则表示该方获胜。

基本流程

  1. 首先在菜单界面选择1 或 0,即,开始或退出游戏
  2. 若选择开始游戏,则创建棋盘并初始化
  3. 在人机交互下棋的过程中,玩家先落子(输入棋盘上的相应坐标,用 '* '表示)
  4. 判定输赢关系(有四种情况:玩家赢,电脑赢,平局,继续下棋)
  5. 电脑落子(采用随机位置落子的方式,用’#’ 表示)
  6. 判定输赢关系(有四种情况:玩家赢,电脑赢,平局,继续下棋)

代码实现

1)菜单显示

void menu(){
	printf("#######三子棋游戏########\n");
	printf("########1. play #######\n");
	printf("########0. exit #######\n");
	printf("#######################\n");
}

2)初始化棋盘

在3x3的棋盘上,把每一个坐标位置初始化为空

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] = ' ';
		}
	}
}

3)显示棋盘

为了尽可能的是棋盘显示的美观,我们把棋盘设计成如下形式:

void DisplayBoard(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++){
			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");	
		}
	}
}

4)玩家下棋

玩家在棋盘上的空格处进行下棋,玩家根据输入的坐标来确定其落子处,首先要保证输入坐标的合法性,其次要保证落子处没有被其他棋子所占。

void PlayerMove(char board[ROW][COL], int row, int col){
	int x = 0;
	int y = 0; 
	printf("玩家下棋\n");
	while (1){
		printf("请输入坐标-> ");
		scanf("%d %d", &x, &y);
		if (x - 1<0 || x - 1 > 2 || y - 1<0 || y - 1 > 2){
			printf("坐标输入不合法,请重新输入!\n");
		}
		else if (board[x - 1][y - 1] != ' '){
			printf("坐标已被占用,请重新输入!\n");
		}
		else{
			board[x - 1][y - 1] = '*';
			break;
		}
	}
}

5)电脑下棋

电脑在棋盘上的空格处进行下棋,电脑随机生成坐标的位置来确定其落子处,要保证落子处没有被其他棋子所占。

void ComputerMove(char board[ROW][COL], int row, int col){
	printf("电脑下棋->\n");
	while (1){
		int x = rand() % 3;
		int y = rand() % 3;  //保证坐标的合法性
		if (board[x][y] == ' '){
			board[x][y] = '#';
			break;
		}
	}
}

6)判断输赢

当该函数返回‘*’号时,表示玩家赢;当该函数返回‘#’号时,表示电脑赢;当该函数返回‘Q’号时,表示平局;当该函数返回‘C’号时,表示继续下棋过程。

char is_win(char board[ROW][COL], int row, int col){
	//赢的情况:1.某一行或一列相等(三个元素两两相等且不为空)
	//2. 对角线元素相等,然后返回相等的元素
	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[0][0] != ' ')
		return board[0][0];
	else if (board[0][2] == board[1][1] && board[1][1] == board[2][0]
		&& board[0][2] != ' ')
		return board[0][2];
	//否则,要么平局,要么继续下棋
	else if (is_full(board, row, col))
		return 'Q';
	else
		return 'C';
}
// 判断棋盘是否是满的
int is_full(char board[ROW][COL], int row, int col){
	for (int i = 0; i < row; i++){
		for (int j = 0; j < col; j++){
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}

游戏效果显示

1)玩家赢

在这里插入图片描述

2)电脑赢

在这里插入图片描述

3)平局

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值