三子棋游戏

1、打印游戏菜单界面,判断开始游戏或者结束游戏
2、若选择结束游戏,则直接退出
3、若选择开始游戏,然后选择玩家先下还是电脑先下
4、若选择玩家先下,则玩家输入落子坐标,打印棋盘,判断输、赢、和棋
5、电脑落字(使用随机函数,随机落在无子处),并打印棋盘,判断输、赢、和棋
6、玩家输入落子坐标,打印棋盘,判断输、赢、和棋
7、依次循环,直到出现输、赢、和棋,打印游戏结果,结束本局游戏
8、若选择电脑先下,过程与玩家先下相同,只是顺序不同
9、再次打印游戏菜单界面,开始下一局游戏

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3

void Menu(int board[ROW][COL]);//游戏菜单
void Init(int board[ROW][COL]);//初始化棋盘
void HumanGame(int board[ROW][COL]);//玩家落棋
void ComputerGame(int board[ROW][COL]);//电脑落棋
void PrintBoard(int board[ROW][COL]);//打印棋盘
int CheckWin(int board[ROW][COL]);//判断输赢
int CheckerBoard[ROW][COL] = { 0 };//定义一个二维数组,作为棋盘
void Game1(int board[ROW][COL]);//玩家先下
void Game2(int board[ROW][COL]);//电脑先下
int CheckEqual(int board[ROW][COL]);//判断和棋
int Game(int board[ROW][COL]);//判断落棋顺序
int Ret = 0;
int ret;
//菜单
void Menu(int board[ROW][COL]) {
	while (1) {
		Init(board);
		printf("*********************************************\n");
		printf("*****************三子棋游戏******************\n");
		printf("*********************************************\n");
		int input1;
		int ret=0;
		while (1) {
			printf("请输入你的选择\n1.开始游戏 0.结束游戏\n");
			scanf("%d", &input1);
			if (input1 == 1) {
				Game(board);
				break;
			}
			if (input1 != 1 && input1 != 0) {
				printf("输入内容不合法,请输入1或者0!\n");
				continue;
			}
			if (input1 == 0) {
				ret = 'w';
				break;
			}
		}
		if (ret == 'w') {
			break;
		}
		if (ret == 'q') {
			continue;
		}
	}

}
int Game(int board[ROW][COL]) {
	while (1) {
		int input2;
		printf("请输入你的选择\n1.玩家先下 0.电脑先下\n");
		scanf("%d", &input2);
		if (input2 == 1) {
			Game1(CheckerBoard);
			ret = 'q';
			break;
		}
		if (input2 == 0) {
			Game2(CheckerBoard);
			ret = 'q';
			break;
		}
		if (input2 != 1 && input2 != 0) {
			printf("输入内容不合法,请输入1或者0!\n");
			continue;
		}
	}
}

//初始化棋盘
void Init(int board[ROW][COL]) {
	for (int i = 0; i < ROW; i++) {
		for (int j = 0; j < COL; j++) {
			board[i][j] = ' ';
		}
	}
}
//打印棋盘
void PrintBoard(int board[ROW][COL]) {
	for (int row = 0; row < ROW + 1; row++) {
		printf("|-----|-----|-----|\n");
		if (row < ROW) {
			printf("|  %c  |  %c  |  %c  |\n", board[row][0], board[row][1], board[row][2]);
		}
	}
	printf("\n");
}
//判断输赢
int CheckWin(int board[ROW][COL]) {
	//判断列
	for (int col = 0; col < COL; col++) {
		if (board[ROW - 1][col] == board[ROW - 2][col] && board[ROW - 1][col] == board[ROW - 3][col]) {
			if (board[ROW - 1][col] == 'X') {
				return 1;
			}
			if (board[ROW - 1][col] == 'O') {
				return 2;
			}
		}
	}
	//判断行
	for (int row = 0; row < ROW; row++) {
		if (board[row][COL - 1] == board[row][COL - 2] && board[row][COL - 1] == board[row][COL - 3]) {
			if (board[row][COL - 1] == 'X') {
				return 1;
			}
			if (board[row][COL - 1] == 'O') {
				return 2;
			}
		}
	}
	//判断斜对角
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2]) {
		if (board[0][0] == 'X') {
			return 1;
		}
		if (board[0][0] == 'O') {
			return 2;
		}
	}
	if (board[0][2] == board[1][1] && board[0][2] == board[2][0]) {
		if (board[0][2] == 'X') {
			return 1;
		}
		if (board[0][2] == 'O') {
			return 2;
		}
	}
	return CheckEqual(board);
}
//判断和棋
int CheckEqual(int board[ROW][COL]) {
	for (int row = 0; row < ROW; row++) {
		for (int col = 0; col < COL; col++) {
			if (board[row][col] == ' ') {
				return 'w';
			}
		}
	}
	return 3;
}
//玩家落子
void HumanGame(int board[ROW][COL]) {
	int inputrow = 0;
	int inputcol = 0;
	while (1) {
		//玩家输入坐标
		printf("请输入落棋坐标(row,col)\n");
		scanf("%d %d", &inputrow, &inputcol);
		//判断坐标是否合法
		if (inputrow<0 || inputrow>ROW - 1 || inputcol<0 || inputcol>COL - 1) {
			printf("您输入的坐标不合法,请重新输入坐标\n");
		}
		else {
			if (board[inputrow][inputcol] == ' ') {
				board[inputrow][inputcol] = 'X';
				break;
			}
			else {
				printf("该坐标已有棋子,请重新输入坐标\n");
			}
		}

	}
	Ret = CheckWin(board);
}
//电脑落子
void ComputerGame(int board[ROW][COL]) {
	int row = 0;
	int col = 0;
	while (1) {
		row = rand() % ROW;
		col = rand() % COL;
		if (board[row][col] == ' ') {
			board[row][col] = 'O';
			break;
		}
	}
	Ret = CheckWin(board);
}
//玩家先下
void Game1(int board[ROW][COL]) {
	while (1) {
		HumanGame(board);
		PrintBoard(board);
		if (Ret == 1) {
			printf("恭喜你,赢了!\n");
			break;
		}
		if (Ret == 2) {
			printf("你输了!\n");
			break;
			if (Ret == 3) {
				printf("和棋!\n");
				break;
			}
		}
		ComputerGame(board);
		printf("对手落棋!\n");
		PrintBoard(board);
		if (Ret == 1) {
			printf("恭喜你,赢了!\n");
			break;
		}
		if (Ret == 2) {
			printf("你输了!\n");
			break;
		}
		if (Ret == 3) {
			printf("和棋!\n");
			break;
		}
	}
}
//电脑先下
void Game2(int board[ROW][COL]) {
	while (1) {
		ComputerGame(board);
		printf("对手落棋!\n");
		PrintBoard(board);
		if (Ret == 1) {
			printf("恭喜你,赢了!\n");
			break;
		}
		if (Ret == 2) {
			printf("你输了!\n");
			break;
		}
		if (Ret == 3) {
			printf("和棋!\n");
			break;
		}
		HumanGame(board);
		PrintBoard(board);
		if (Ret == 1) {
			printf("恭喜你,赢了!\n");
			break;
		}
		if (Ret == 2) {
			printf("你输了!\n");
			break;
		}
		if (Ret == 3) {
			printf("和棋!\n");
			break;
		}
	}
}

int  main() {
	srand((unsigned int)time(0));//重置随机种子不要放在循环内,循环一次时间间隔极小,并且至在程序启动的时候设置一次
	Menu(CheckerBoard);
	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值