三字棋游戏

三字棋游戏
源代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>

//此时最好把数组的长度定义为宏,方便未来对程序的扩展
#define ROW 3
#define COL 3

//1.定义二维数组表示棋盘
char g_chess_board[ROW+2][COL+2];

 void Init(){
	for (int row = 1; row <= ROW; ++row){
		for (int col = 1; col <= COL; ++col){
			g_chess_board[row][col] =' ';
		}
	}
}

void Print(){
	//打印棋盘
	//打印第一行的行标
	for (int col = 0; col <= COL; ++col){
		printf(" %d| ", col);
	}
	printf("\n");
	printf("---------------\n");
	for (int row = 1; row <= ROW; ++row){
		printf(" %d|", row);
		for (int col = 1; col <= COL; ++col){
			printf("  %c|", g_chess_board[row][col]);
		}
		printf("\n");
		printf("---------------\n");
	}
	//for (int row = 1; row <= ROW; ++row){
	//	printf("|  %c  |  %c  |  %c  |\n", g_chess_board[row][1], g_chess_board[row][2], g_chess_board[row][3]);
	//	if (row != ROW ){
	//		//避免最后一行溢出边界
	//		printf("|-----|-----|-----|\n");
	//	}
	//}
}
void Playergame(){
	//玩家落子
	while(1){
		//1.提示玩家输入一个坐标
		printf("请玩家输入要落子的坐标(row col)\n");
		//2.读取玩家的输入
		int row = 0;
		int col = 0;
		scanf("%d %d",&row,&col);
		//3.对玩家的输入进行校验(永远不要相信用户的输入)
		//4.如果玩家输入非法,就循环提示玩家重新输入
		// a)校验坐标是否是合理范围
		if (row<1 || row>ROW || col<1 || col>COL){
			printf("请重新输入,你所输入的坐标有误!\n");
			continue;
		}
		// b)玩家输入的坐标是否已经有子
		if (g_chess_board[row][col] != ' '){
			printf("当前位置已有子,请重新输入!\n");
			continue;
		}
		//5.如果玩家输入合法,就把棋盘上对应位置设为X
		g_chess_board[row][col] = 'X';
		break;
	}
}

void ComputerMove(){
//电脑落子,难度比较低,落子完全靠缘分
//1.靠随机数产生一个行,随机数产生一个列
//2.如果当前的行和列已经被占用,就再产生一次
	printf("请电脑落子!\n");
	int row = 0;
	int col = 0;
	//利用时间来取随机变量
	srand(time(0));
	while (1){
		row = rand() % ROW+1;//[0,2]
		col = rand() % COL+1;//[0,2]
		if (g_chess_board[row][col] == ' '){
			g_chess_board[row][col] = '0';
			break;
		}
	}
}
//使用X表示玩家,使用0表示电脑
//约定CheckWinner函数,返回X表示玩家胜利
//如果返回0表示电脑胜利,返回一个Q表示和棋
//如果返回 空格 表示胜负未分
char CheckWinner(){
  //检测游戏是否结束
  //1.先检查所有的行是不是三子连在一起
	for (int row = 1; row <= ROW; ++row){
		if (g_chess_board[row][1] == g_chess_board[row][2] &&
			g_chess_board[row][1] == g_chess_board[row][3] &&
			g_chess_board[row][1] != ' ')
			return g_chess_board[row][1];
	}
  //2.在检查所有的列是否连在一起
	for (int col = 1; col <= COL; ++col){
		if (g_chess_board[1][col] == g_chess_board[2][col] &&
			g_chess_board[1][col] == g_chess_board[3][col] &&
			g_chess_board[1][col] != ' ')
			return g_chess_board[1][col];
	}
  //3.检查对角线
	if (g_chess_board[1][1] == g_chess_board[2][2] &&
		g_chess_board[1][1] == g_chess_board[3][3] &&
		g_chess_board[1][1] != ' '){
		return g_chess_board[1][1];
	}
	if (g_chess_board[3][1] == g_chess_board[2][2] &&
		g_chess_board[3][1] == g_chess_board[1][3] &&
		g_chess_board[1][3] != ' ')
		return g_chess_board[1][3];
  //4.检查是否和棋
	if (IsFull()){
		return 'Q';
	}
	return ' ';
}
//满了返回1,没满返回0
int IsFull(){
	for (int row = 1; row <= ROW; ++row){
		for (int col = 1; col <= COL; ++col){
			if (g_chess_board[row][col] == ' ')
				return 0;
		}
	}
	return 1;
}
int main(){
	//2.需要对棋盘进行初始化(例如可是把数组全部初始化成空格)
	Init();
	Print();
	while (1){
		//3.玩家落子,顺便检查一下游戏是否结束
		Playergame();
		CheckWinner();
		Print();
		if (CheckWinner() == 'X'){
			printf("恭喜你呀!玩家胜利\n");
			break;
		}
		if (CheckWinner() == 'Q'){
			printf("和棋!\n");
			break;
		}
		//4.电脑落子,顺便检查一下游戏是否结束
		ComputerMove();
		CheckWinner();
		Print();
		if (CheckWinner() == '0'){
			printf("很遗憾,电脑胜利\n");
			break;
		}
		if (CheckWinner() == 'Q'){
			printf("和棋!\n");
			break;
		}
	}
	//回到第3步

	syetem("pause");
	return 0;
}

运行截图:
在这里插入图片描述
在这里插入图片描述
博主还想安利五子棋盘,思路是一样的,就是需要在判定的时候,考虑到更多种的情况,三字棋比较简单,只需要考虑横,列,斜,三种情况,如果变成五子棋还需要考虑更多种情况。
或许用一个套嵌的循环可以搞定,但是博主现在还没有想到,如果有更好方法的小伙伴,可以私信博主,给博主安利一波更棒的操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值