C语言——实现三子棋 (下)

简介: C语言——实现三子棋 (下)

这里我们又写了一个新的函数full()来判断棋盘是否填满

 
         
int full(char board[ROW][COL], int row, int col)
 {
   int j = 0, i = 0;
   for (i = 0;i < row;i++)
   {
     for (j = 0;j < col;j++)
     {
       if (board[i][j] == ' ')
         return 0;
     }
   }
   return 1;
 }

到这游戏实现,具体思路就这样的

 

最终代码部分

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
//初始化棋盘
void Init_board(char board[ROW][COL], int row, int col);
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//检测输赢
char IsWin(char board[ROW][COL], int row, int col);
//告诉我们四种游戏的状态
//玩家赢 - '*'
//电脑赢 - '#'
//平局   - 'Q'
//继续   - 'C'

game.c

//game.c游戏实现部分
#include "game.h"
//棋盘初始化为空格的函数
void InitBoard(char board[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 0;
    for (i = 0; i < row; i++)
    {
      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++)
//  {
//    //打印一行的数据
//    printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
//    //打印分割行
//    if (i < row - 1)
//      printf("---|---|---\n");
//  }
//}
//这个打印函数写死了棋盘边框,只有3*3的棋盘边框,因此不是很合适
//改进后的棋盘打印函数
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]);
      if (j < col - 1)
        printf("|");
    }
    printf("\n");
    //打印分割行
    if (i < row - 1)
    {
      for (j = 0; j < col; j++)
      {
        printf("---");
        if (j < col - 1)
          printf("|");
      }
      printf("\n");
    }
  }
}
//保存下棋步骤的函数
//玩家走步记录函数
//这里要站在玩家角度设计代码,3*3列棋盘玩家一般会认为是3行(1,2,3行)*3列(1,2,3列)
//实际上在计算机思维上应该是3行(0,1,2行)*3列(0,1,2列)
void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("玩家先走:(行+空格+列)\n");
  while (1)
  {
    printf("请输入要下的坐标:>");
    scanf("%d%d", &x, &y);
    //判断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");
    }
  }
}
//电脑走步记录函数
void ComputerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  printf("电脑走:>\n");
  while (1)
  {
    x = rand() % row;//模3只能产生0,1,2
    y = rand() % col;//模3只能产生0,1,2
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}
//棋盘是否下满的判断函数
//返回1表示棋盘满了
//返回0,表示棋盘没满
int IsFull(char board[ROW][COL], int row, int col)
{
  int i = 0;
  int j = 0;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < col; j++)
    {
      if (board[i][j] == ' ')//当二维数组中存在空格时,说明棋盘没满
      {
        return 0;//没满
      }
    }
  }
  return 1;//满了
}
//检查横三行,竖三列,对角线是否有三个相同的棋子
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][1];
    }
  }
  //竖三列
  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[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
    return board[1][1];
  //判断是否平局
  if (1 == IsFull(board, ROW, COL))
  {
    //当棋盘满了没有结果说明平局
    return 'Q';
  }
  //判断完,输赢,平局,只剩下一种继续的可能性
  return 'C';
}

ticktacktoe.c

//ticktacktoe.c游戏测试及初始化部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
  printf("**********************\n");
  printf("*** 1.play  2.exit ***\n");
  printf("**********************\n");
}
//游戏算法实现
void game()
{
  char ret = 0;
  //采用数组存储走出的棋盘信息
  char board[ROW][COL] = { 0 };
  //棋盘初始化为空格
  InitBoard(board,ROW,COL);
  //打印棋盘边框
  DisplayBoard(board, ROW, COL);
  //下棋程序,玩家先下,电脑后下
  //既然是在棋盘内下棋,那么形参列表应该有棋盘的相关信息
  //调用需要行列信息,棋盘信息
  while (1)
  {
    //玩家走步记录函数及打印
    PlayerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断玩家是否赢
    ret = IsWin(board, ROW, COL);
    if (ret != 'C')
    {
      break;
    }
    //电脑走步记录函数及打印
    ComputerMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断电脑是否赢
    ret = IsWin(board, ROW, COL);
    if (ret != 'C')
    {
      break;
    }
  }
  //通过Iswin输赢判断函数的返回值输出游戏结果
  if (ret == '*')
  {
    printf("玩家赢\n");
  }
  else if (ret == '#')
  {
    printf("电脑赢\n");
  }
  else
  {
    printf("平局\n");
  }
}
void test()
{
  int input = 0;
  srand((unsigned int)time(NULL));//用时间戳控制生成随机值
  do
  {
    menu();
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    {
    case 0:
      printf("退出游戏\n");
      break;
    case 1:
      printf("游戏开始\n");
      game();
      break;
    default:
      printf("选择错误,请重新选择!\n");
        break;
    }
  } while (input);
}
int main()
{
  test();
  return 0;
}

效果展示

image.png

image.png

目录
相关文章
|
7月前
|
C语言
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
【海贼王编程冒险 - C语言海上篇】C语言如何实现简单的三子棋游戏?
36 1
|
8月前
|
C语言
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(二)
我们可以通过创建并定义符号常量NUMBER,来作为判断是否胜利的标准。如三子棋中,令NUMBER为3,则这八个方向中有任意一个方向达成3子连珠,则连珠的这个棋子所代表的玩家获胜。
87 1
|
8月前
|
算法 C语言 C++
万字详解:C语言三子棋进阶 + N子棋递归动态判断输赢(一)
三子棋游戏设计的核心是对二维数组的把握和运用。
105 1
|
8月前
|
编译器 C语言
【C语言入门小游戏】三子棋
【C语言入门小游戏】三子棋
62 0
【C语言入门小游戏】三子棋
|
7月前
|
存储 C语言
三子棋(C语言版)
三子棋(C语言版)
|
7月前
|
程序员 C语言 索引
【️C语言-游戏设置】---三子棋(N满)
【️C语言-游戏设置】---三子棋(N满)
|
8月前
|
人工智能 算法 数据可视化
C语言”三子棋“升级版(模式选择+”模拟智能“下棋)
C语言”三子棋“升级版(模式选择+”模拟智能“下棋)
|
8月前
|
存储 C语言
C语言实现三子棋
C语言实现三子棋
38 0
|
8月前
|
C语言
C语言实现三子棋
C语言实现三子棋
39 0
|
8月前
|
C语言
C语言:三子棋的实现。
C语言:三子棋的实现。
41 0

热门文章

最新文章