c语言井字棋(三子棋)简易版~~~~~~

1 井字棋游戏说明;

游戏的棋盘为3*3 的九宫格模式,( 玩家 vs 电脑 )
只要玩家(电脑)的某个方向的棋子连成一条线,就是玩家(电脑)或获胜。‘1’表示玩家、‘2’表示电脑。

这
此时就算是玩家胜利

2、编程逻辑;

  • 创建菜单

玩家进行选择‘0’表示开始游戏,‘1‘表示退出游戏、此处我们需要进行判断玩家输入是否有误,输入的值必须是0或者1,其他错误输入需要进行提示,重新输入,

int menu(){
	printf("=====================\n");
	printf("===== 0、开始游戏====\n");
	printf("===== 1、结束游戏====\n");
	printf("=====================\n");
	int choice;
	printf("请输入您的选择:\n");
	scanf("%d", &choice);
	if ((choice != 0) && (choice != 1)){
		printf("你的输入有误,请重新输入\n");
	}
	return choice;
}
  • 创建棋盘并且初始化

先创建一个二位数组表示棋盘,把数组元素初始化为’ ‘空格进行表示

char chessboard[MAX_ROW][MAX_COL] = { 0 };
	char winner = ' ';
	for (int row = 0; row < MAX_ROW; row++){
		for (int col = 0; col < MAX_COL; col++){
			chessboard[row][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表示玩家输入;
玩家落子后需要进行校验,1、输入的坐标不能超过数组下标,2、下过子的地方不能再下

void playermove(char chessboard[MAX_ROW][MAX_COL]){
	while (1){
		printf("请您输入坐标(row col)以
		坐标中间以空格间隔\n");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		if (row < 0 || row >2 || col < 0 || col > 2){
			printf("您输入的坐标不在范围内,请重新输入!\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;
	}
}
  • 判断胜负

判断胜负关系:(玩家获胜、电脑获胜、和棋,还有预期之外的情况
我们用 ‘x’表示玩家获胜 ‘o’表示电脑获胜 ‘z’表示和其
// ‘ ’表示胜负未分 就是格子沾满了 还没有分出胜负

int isFull(char chessboard[MAX_ROW][MAX_COL]){
	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]){
	//判断所有行
	for (int row = 0; row < MAX_ROW; row++){
		if (chessboard[row][0] != ' '&& chessboard[row][0] == chessboard[row][1]
			&& chessboard[row][1] == 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 ' ';
}

再次回到创棋盘盼初始化中继续执行

我们还需要继续回到创棋盘盼初始化中继续执行,玩家(机器)落一个子如果条件内没有满足,则玩家(电脑)继续下子,直到达到约束条件位置

3、完整的代码表述

接下来我们来演示完整的代码描述

#define	_CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>
#include<time.h>
#define MAX_ROW 3
#define MAX_COL 3
//1、创建 棋盘并且初始化
//2、打印棋盘
//3、玩家落子(玩家输入行列坐标的方式落子)
//4、电脑落子
//5、判断胜负
//再次回到2中继续执行




//让玩家落子,通过控制台输输入行列表的方式来实现;我们这里用字符x表示玩家输入;
//玩家落子后需要进行校验,1、输入的坐标不能超过数组下标,2、下过子的地方不能再下

void playermove(char chessboard[MAX_ROW][MAX_COL]){
	while (1){
		printf("请您输入坐标(row col)以坐标中间以空格间隔\n");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		if (row < 0 || row >2 || col < 0 || col > 2){
			printf("您输入的坐标不在范围内,请重新输入!\n");
			continue;
		}
		if (chessboard[row][col] != ' '){
			printf("你输入的位置已经有子了!!\n");
			continue;
		}
		chessboard[row][col] = 'x';
		break;
	}
}

//判断是否和棋--------------没有空格了就是何其了
int isFull(char chessboard[MAX_ROW][MAX_COL]){
	for (int row = 0; row < MAX_ROW; row++){
		for (int col = 0; col < MAX_COL; col++){
			if (chessboard[row][col] == ' '){
				return 0;
			}
		}
	}
	return 1;
}

// 判断胜负关系	我们用 ‘x’表示玩家获胜 ‘o’表示电脑获胜  ‘z’表示和其 
	// ‘ ’表示胜负未分 就是格子沾满了  还没有分出胜负

char iswin(char chessboard[MAX_ROW][MAX_COL]){
	//判断所有行
	for (int row = 0; row < MAX_ROW; row++){
		if (chessboard[row][0] != ' '&& chessboard[row][0] == chessboard[row][1]
			&& chessboard[row][1] == 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 ' ';
}

//电脑落子。随机数-=-=-=-=  判断下过棋子的地方不能再生成,电脑生成的位置用 字符‘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;
	}
}

void game()
{
	//1,创建棋盘进行初始化
	char chessboard[MAX_ROW][MAX_COL] = { 0 };
	char winner = ' ';
	for (int row = 0; row < MAX_ROW; row++){
		for (int col = 0; col < MAX_COL; col++){
			chessboard[row][col] = ' ';
		}
	}
	//2、打印棋盘
	while (1){
		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");
		}
		//3、玩家落子;
		playermove(chessboard);

		//4、判断胜负关系	
		winner = iswin(chessboard);
		if (winner != ' '){
			break;
		}
		//5、电脑落子  随机数进行落子;依然是在循环内进行
		computermove(chessboard);
		//6、判断胜负关系
		winner = iswin(chessboard);
		if (winner != ' '){
			break;
		}
	}
	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");
	}

	if (winner == 'x'){
		printf("恭喜你获胜\n");
	}
	if (winner == 'o'){
		printf("菜鸡\n");
	}
	if (winner == 'q'){
		printf("和棋\n");
	}
}



int menu(){
	printf("=====================\n");
	printf("===== 0、开始游戏====\n");
	printf("===== 1、结束游戏====\n");
	printf("=====================\n");
	int choice;
	printf("请输入您的选择:\n");
	scanf("%d", &choice);
	if ((choice != 0) && (choice != 1)){
		printf("你的输入有误,请重新输入\n");
	}
	return choice;
}
int main()
{
	srand((unsigned)time(0));
	while (1){
		int choice = menu();
		if (choice == 0){
			game();
		}
		else if (choice == 1){
			printf("拜拜!\n");
			break;
		}
	}
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值