c语言实现三子棋

  • 分析
    玩法分析:将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。
  • 思路
    游戏流程:游戏初始化
    • 棋盘初始化
      1. 棋盘由二位数组模拟,且初始化数组
      2. 棋盘打印
    • 玩家下棋
      1. 判断下棋坐标是否越界
      2. 判断下棋坐标是否已经有子
      3. 如果满足上方条件则在此坐标插入棋子,否则重新输入
    • 电脑下棋
      1. 生成随机坐标数 注意需先随机种子
      2. 判断下棋坐标是否有子
      3. 如果满足上方条件则在此坐标插入棋子,否则重新随机坐标
    • 判断胜者
      1.判断每一行,如果每一行的棋子都为一个玩家,且其棋子不为空,则这个玩家胜出
      2.判断每一列,如果每一列的棋子都为一个玩家,且其棋子不为空,则这个玩家胜出
      3.判断对角线,如果对角线的棋子都为一个玩家,且其棋子不为空,则这个玩家胜出
      4.如果棋盘下满了,则为和棋
  • 实现
    1. 定义常量,以及二维数组
      #define ROW 3
      #define COL 3
      
      char chessboard[ROW][COL];
      
    2. 数组初始化
      void Init() {
      	for (int row = 0; row < ROW; row++)
      	{
      		for (int col = 0; col < COL; col++)
      		{
      			chessboard[row][col] = ' '; //初始化每个元素都为空格
      		}
      	}
      }
      
    3. 打印棋盘
      void Print() {
      	for (int i = 0; i < ROW; i++)
      	{
      		printf("| %c | %c | %c |\n", chessboard[i][0], chessboard[i][1], chessboard[i][2]);
      		printf("|...|...|...|\n");
      
      	}
      }
      
    4. 玩家下棋
      void PlayerMove() {
      	int x, y;
      	while (true)
      	{
      		printf("请输入你下棋的坐标!\n");
      		scanf("%d  %d", &x, &y);
      		if (x > ROW - 1 && x < 0 && y > COL - 1 && y < 0)
      		{
      			printf("输入错误!");
      			continue;
      		}
      		if (chessboard[x][y] == ' ')
      		{
      			chessboard[x][y] = 'O';
      			break;
      		}
      		else
      		{
      			printf("已经被下过了!");
      			continue;
      		}
      	} 
      }
      
    5. 电脑下棋
      void AiMove() {
      
      srand((unsigned int)time(0)); //随机种子
      
      while (true)
      {
      	int x = rand() % 3;
      	int y = rand() % 3;
      	if (chessboard[x][y] == ' ')
      	{
      		chessboard[x][y] = 'X';
      		break;
      	}
      	else
      	{
      		continue;
      	}
      }
      }
      
    6. 棋盘满了判断
      int isFull() {
      	for (int row = 0; row < ROW; row++)
      	{
      		for (int col = 0; col < COL; col++) {
      			if (chessboard[row][col] == ' ')
      			{
      				return 0;
      			}
      		}
      	}
      	return 1;
      }
      
    7. 判断胜者
      char CheckWinner() {
      	// 行
      	for (int row = 0; row < ROW; row++)
      	{
      		if (chessboard[row][0] == chessboard[row][1]
      			&& chessboard[row][1] == chessboard[row][2]
      			&& chessboard[row][0] != ' ')
      		{
      			return chessboard[row][0];
      		}
      		
      	}
      	// 列
      	for (int col = 0; col < COL; col++)
      	{
      		if (chessboard[0][col] == chessboard[1][col]
      			&& chessboard[1][col] == chessboard[2][col]
      			&& chessboard[0][col] != ' ')
      		{
      			return chessboard[0][col];
      		}
      	}
      	// 对角线
      	if (chessboard[0][0] == chessboard[1][1]
      		&& chessboard[1][1] == chessboard[2][2]
      		&& chessboard[0][0] != ' ')
      	{
      		return chessboard[0][0];
      	}
      	else if (chessboard[0][2] == chessboard[1][1]
      		&& chessboard[1][1] == chessboard[2][0]
      		&& chessboard[0][0] != ' ')
      	{
      		return chessboard[0][2];
      	}
      	else if (isFull())
      	{
      		return 'p';
      	}
      }
      8. 游戏初始化
      	```
      void gameInit() {
      	char winner;
      	Init();
      	Print();
      	while (true)
      	{	
      		PlayerMove();
      		winner = CheckWinner();
      		AiMove();
      		Print();
      		winner = CheckWinner();
      		if (winner == 'O')
      		{
      			printf("恭喜你!\n");
      			break;
      		}
      		else if (winner == 'X')
      		{
      			printf("恭喜电脑!\n");
      			break;
      		}
      		else if (winner == 'p')
      		{
      			printf("势均力敌的对手!");
      			break;
      		}
      		continue;
      	}	
      }
      

写在最后

最近推出了公众号 coding趣谈,一位在读学生的技术提升之路,为您提供一系列我在学习路上的笔记,经验,以及感悟。往与君共勉,共同进步! 欢迎大家来关注哦!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值