三子棋游戏

本文介绍了一个使用C语言编写的三子棋游戏程序。程序包括创建游戏菜单、初始化棋盘、玩家和电脑交替落子以及判断胜负等功能。玩家通过输入行列坐标进行落子,电脑则随机选择位置落子。游戏会根据棋盘状态判断是否有人获胜或和棋,直至游戏结束。
摘要由CSDN通过智能技术生成

1、游戏规则

三子棋是一个很古老的民间传统游戏,玩起来也非常便捷。三子棋也叫做OOXX棋,井字棋等,用“井”字分出3×3的格子,双方轮流下棋子(可以用O或者X来区别),只要将自己的棋子连成直线就赢了。 

2、程序流程

  1. 建立一个游戏菜单
  2. 创建一个棋盘并将其初始化
  3. 将初始化后的棋盘进行打印
  4. 玩家落子并打印棋盘(玩家输入行列坐标的方式来落子)
  5. 判定胜负关系(玩家是否获胜?有则直接游戏结束无则继续进行)
  6. 电脑落子并打印棋盘(随机位置落子)
  7. 判定胜负关系(电脑是否获胜?有则直接游戏结束无则继续进行)
  8. 若无胜负关系则回到 2 继续交替下棋直至出现胜负或和棋。

 3、源代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<unistd.h>
#include<time.h>
 #include <stdlib.h>
//三子棋游戏
#define MAX_ROW 3//宏定义行数,列数,方便后续进行修改
#define MAX_COL 3

//一·创建一个游戏菜单
//菜单函数
int menu(){
	printf("========================\n");
	printf(" 1. 开始游戏\n");
	printf(" 0. 结束游戏\n");
	printf("========================\n");
	printf(" 请输入您的选择: ");
	int num = -1;
	scanf("%d", &num);;//利用键盘输入选项	
	return num;//将选项值返回到主函数中进行判断
}
//二·游戏内容
//棋盘初始化
void init(char chessBoard[MAX_ROW][MAX_COL]) {
	// 把数组中的每个元素都设为 “空格”
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			chessBoard[row][col] = ' ';
		}
	}
}
//打印棋盘
void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]){
	printf("+---+---+---+\n");
	for (int row = 0; row < MAX_ROW; row++){
		printf("| %c | %c | %c |\n", chessBoard[row][0],
			chessBoard[row][1], chessBoard[row][2]);
		printf("+---+---+---+\n");
	}
}
//玩家落子“x”
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
	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("您的坐标不在合法范围内 [0, 2]\n");
					continue;
			}
			// 校验玩家落子位置是否已经有子了. 
			if (chessBoard[row][col] != ' ') {
				printf("您的坐标位置已经有子了!\n");
				continue;
			}
			//最终落子
			chessBoard[row][col] = 'x';
			break;
	}
}

//电脑落子“o”
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
	while (1){
		int row = rand() % MAX_ROW;//设置随机数让棋子落在棋盘内
		int col = rand() % MAX_COL;
		//对落子进行判断
		// 校验玩家落子位置是否已经有子了. 
		if (chessBoard[row][col] != ' ') {
			continue;
		}
		//最终落子
		chessBoard[row][col] = 'o';
		break;
	}
}

//判断棋盘是否有剩余空间
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
	// 找空格?如果找不到就是满了返回1:找到了则说明未满返回0
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			if (chessBoard[row][col] == ' ') {
				// 找到了
				return 0;
			}
		}
	}
	//未找到
	return 1;
}
//判断是否胜利
char isWin(char chessBoard[MAX_ROW][MAX_COL]) {
	// 'x' 表示玩家获胜
	// 'o' 表示电脑获胜
	// ' ' 表示胜负未分
	// 'q' 表示和棋

	// 判定是否行相等
	for (int row = 0; row < MAX_ROW; row++) {
		if (chessBoard[row][0] != ' '//行不都等于“ ”
			&& chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2]) {
			return chessBoard[row][0];
		}
	}
	// 判定是否列相等
	for (int col = 0; col < MAX_COL; col++) {
		if (chessBoard[0][col] != ' '
			&& chessBoard[0][col] == chessBoard[1][col]
			&& chessBoard[0][col] == chessBoard[2][col]) {
			return chessBoard[0][col];
		}
	}
	// 判定两个对角线是否相等
	if (chessBoard[0][0] != ' '
		&& chessBoard[0][0] == chessBoard[1][1]
		&& chessBoard[0][0] == chessBoard[2][2]) {
		return chessBoard[0][0];//主对角线相等
	}
	if (chessBoard[2][0] != ' '
		&& chessBoard[2][0] == chessBoard[1][1]
		&& chessBoard[2][0] == chessBoard[0][2]) {
		return chessBoard[2][0];//副对角线相等
	}
	// 判定是否和棋看棋盘中是否有剩余空间?有剩余继续:无剩余则为和棋
	if (isFull(chessBoard)) {
		return 'q';
	}
	//若游戏未结束则继续游戏
	return ' ';
}


//游戏函数
void game(){
	
	//1创建一个3x3的棋盘
	char chessBoard[MAX_ROW][MAX_COL] = { 0 };
	//2初始化棋盘
	init(chessBoard);
	char winner = ' ';
	while (1){
		//3将棋盘进行打印
		printChessBoard(chessBoard);
		//4玩家落子
	    playerMove(chessBoard);
		//5判断是否胜利
		winner = isWin(chessBoard);
		//如果未结束则继续游戏
		if (winner != ' ') {
			break;
		}
		//7电脑落子
		computerMove(chessBoard);
		//8判断是否胜利
		winner = isWin(chessBoard);
		//如果未结束则继续游戏
		if (winner != ' ') {
			break;
		}
		//循环操作3直至游戏结束
	}
	printChessBoard(chessBoard);
	//胜利条件判断
	if (winner == 'x') {
		printf("恭喜您, 您赢了!\n");
	}
	else if (winner == 'o') {
		printf("很遗憾, 您连人机下不过!\n");
	}
	else {
		printf("很遗憾, 您和人机五五开!\n");
	}
		}


int main(){
	srand((unsigned int)time(0));//用时间设置一个随机种子,将时间从 time_t 转成 unsigned int
	while (1){
		//一·创建一个游戏菜单
		int choice = menu();//菜单函数
		if (choice == 1){
			game();//游戏函数
		}
       else if (choice == 0) {
	        printf("goodbye!\n");
	        break;
		}
	   else{
		   printf("您输入的有误请重新输入\n");
	   }
	}
	system("pause");
	return 0;
}

转载:https://blog.csdn.net/qq2977078774/article/details/109409664 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值