C语言实现三子棋(详解版)(二)

简介: C语言实现三子棋(详解版)

5. 判断胜负


在每一次下完棋之后,系统应该判断是否分出了胜负,所以在每次的下棋函数之后再写一个判断胜负的函数。


【判断胜负】


整个三子棋的游戏结局包含4中情况,分别是;


  1. 电脑获胜(返回#)
  2. 玩家获证(返回*)
  3. 平局(返回’Q’)
  4. 游戏继续(返回’C’)


【玩家/电脑获胜】


1.先判断行和列。


行:


//判断行
  int i = 0;
  for (i = 0; i < row; i++)
  {
  if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
    return board[i][0];
  }


列:


//判断列
for (i = 0; i < col; i++)
{
  if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
  return board[1][i];
}


2.再判断是否有斜着连着三个字的情况。(当然也可以先判断斜着再判断行和列)


//判断斜着
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2]&&board[1][1]!=' ')
  return board[1][1];
  if (board[1][1] == board[0][2] && board[1][1] == board[2][0]&&board[1][1]!=' ')
  return board[1][1];


【判断是否为平局】


若电脑和玩家都没有获胜,此时就要根据棋盘上是否还有空格(即未落子区域),若还有空格,则游戏继续,若没有空格了,则达成平局。


int IsFull(char board[ROW][COL], int row, int col)//判断棋盘是不是已经满了
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
  int j = 0;
  for (j = 0; j < col; j++)
  {
    if (board[i][j] == ' ')//有空格说明棋盘没满 返回0
    return 0;
  }
  }
  return 1;
}
//判断是否为平局
  if (IsFull(board, row, col) == 1)//等于1则说明平局
  {
  return 'Q';
  }
  else
  return 'C';


6.test.c


再来看test.c函数的设计


#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
  char board[ROW][COL] = {0};//创建一个3*3的数组
  InitBoard(board, ROW, COL);//初始化棋盘初始化成空格
  DisplayBoard(board, ROW, COL);//打印棋盘
  char ret = 0;
  while (1)
  {
  Player(board, ROW, COL);
  ret = IsWin(board, ROW, COL);//判断是否分出了胜负
  if (ret != 'C')
    break;
  DisplayBoard(board, ROW, COL);//打印棋盘
  printf("\n");
  Computer(board, ROW, COL);//电脑下棋
  DisplayBoard(board, ROW, COL);//打印棋盘
  ret = IsWin(board, ROW, COL);//判断是否分出了胜负
  if (ret != 'C')
    break;
  }
  if (ret == '*')
  {
  printf("玩家胜利!\n");
  }
  else if (ret == '#')
  {
  printf("电脑胜利!\n");
  }
  else
  {
  printf("平局!\n");
  }
}
void menu()
{
  printf("*******************\n");
  printf("******1. Play******\n");
  printf("******0. Exit******\n");
  printf("*******************\n");
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));//调用随机数种子
  do
  {
  menu();
  printf("请输入你的选择>:\n");
  scanf("%d", &input);
  switch (input)
  {
  case 1:
    game();
    break;
  case 0:
    printf("退出游戏!\n");
    break;
  default:
    printf("你的选择有误,请重新选择!\n");
    break;
  }
  } while (input);
  return 0;
}


当代码来到22行时,有两种情况,一种是某一方获胜,一种是达成平局,所以我们只需对ret的值进行判断就可以分辨出游戏最终结果。


7. game.c


#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int IsFull(char board[ROW][COL], int row, int col)//判断棋盘是不是已经满了
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
  int j = 0;
  for (j = 0; j < col; j++)
  {
    if (board[i][j] == ' ')//有空格说明棋盘没满 返回0
    return 0;
  }
  }
  return 1;
}
void InitBoard(char board[ROW][COL], int row, int col)//初始化棋盘
{
  int i = 0;
  for (i = 0; i < row; i++)
  {
  int j = 0;
  for (j = 0; j < col; j++)
  {
    board[i][j] = ' ';
  }
  }
}
//打印棋盘 版本一
//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
//  int i = 0;
//  for (i = 0; i < row; i++)
//  {
//  int j = 0;
//  for (j = 0; j < col; j++)
//  {
//    printf("%c", board[i][j]);
//  }
//  printf("\n");
//  }
//}
//打印棋盘 版本二  让棋盘可视化
//void DisplayBoard(char board[ROW][COL], int row, int col)
//{
//  int i = 0;
//  for (i = 0; i < row; i++)//控制行数
//  {
//  printf(" %c | %c | %c ", board[i][0], board[i][1], board[i][2]);
//  printf("\n");
//  if (i < row - 1)
//  {
//    printf("---|---|---");
//    printf("\n");
//  }
//  }
//}
//打印棋盘 版本三  让棋盘可视化,实现通用版
void DisplayBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  for (i = 0; i < row; i++)//控制行数
  {
  //每一行的打印  %c | %c | %c 
  int j = 0;
  for (j = 0; j < col; j++)
  {
    printf(" %c ", board[i][j]);
    if (j < col - 1)
    printf("|");
  }
  //每一行的打印 ---|---|---
  printf("\n");
  if (i < row - 1)
  {
    int j = 0;
    for (j = 0; j < col; j++)
    {
    printf("---");
    if (j < col - 1)
      printf("|");
    }
    printf("\n");
  }
  }
}
void Player(char board[ROW][COL], int row, int col)//玩家下棋
{
  int x = 0;
  int y = 0;
  printf("请玩家输入你的落子坐标>:(使用空格隔开)\n");
  while (1)
  {
  scanf("%d %d", &x, &y);
  //检查坐标的合法性
  if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))//如果坐标合法
  {
    if (board[x - 1][y - 1] == ' ')
    {
    board[x - 1][y - 1] = '*';//落子成功
    break;
    }
    else
    {
    printf("该坐标被占用!请重新输入坐标!\n");
    }
  }
  else
  {
    printf("你输入的坐标有误,请重新输入!\n");
    continue;
  }
  }
}
void Computer(char board[ROW][COL], int row, int col)//电脑下棋
{
  int x = 0;
  int y = 0;
  while (1)
  {
  x = rand() % 3;
  y = rand() % 3;
  if (board[x][y] == ' ')
  {
    board[x][y] = '#';
    break;
  }
  }
}
char IsWin(char board[ROW][COL], int row, int col)//判断是否分出了胜负
{
  //判断行
  int i = 0;
  for (i = 0; i < row; i++)
  {
  if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
    return board[i][0];
  }
  //判断列
  for (i = 0; i < col; i++)
  {
  if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
    return board[1][i];
  }
  //判断斜着
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2]&&board[1][1]!=' ')
  return board[1][1];
  if (board[1][1] == board[0][2] && board[1][1] == board[2][0]&&board[1][1]!=' ')
  return board[1][1];
  //判断是否为平局
  if (IsFull(board, row, col) == 1)//等于1则说明平局
  {
  return 'Q';
  }
  else
  return 'C';
}


8. game.h


#pragma once
#define ROW 3//行
#define COL 3//列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char board[ROW][COL],int row,int col);//初始化棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);//打印棋盘
void Player(char board[ROW][COL], int row, int col);//玩家下棋
void Computer(char board[ROW][COL], int row, int col);//电脑下棋
//玩家赢了返回 '*' 
//电脑赢了返回 '#' 
//平局返回 ‘Q'
//继续游戏返回 'C'
char IsWin(char board[ROW][COL], int row, int col);//判断是否分出了胜负


9. 完结


本章的内容就到这里啦,若有不足,欢迎评论区指正,最后,希望大佬们多多三连吧,下期见!


相关文章
|
6月前
|
C语言
以c语言为基础实现的简易三子棋
以c语言为基础实现的简易三子棋
40 1
|
6月前
|
C语言
c语言简单三子棋
c语言简单三子棋
|
6月前
|
算法 C语言 C++
【C语言实战项目】三子棋游戏
【C语言实战项目】三子棋游戏
59 1
|
6月前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
6月前
|
C语言
用c语言实现三子棋
用c语言实现三子棋
26 0
|
5月前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
30 1
|
6月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
65 1
|
6月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
76 1
|
5月前
|
存储 C语言
三子棋(C语言版)
三子棋(C语言版)
|
6月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
52 0
【C语言入门小游戏】三子棋