C语言:简单的三子棋游戏

简介: 谈到三子棋,想必大家都不陌生,童年的回忆呀,读小学的时候有事没事就和同学玩上个几把,玩起来很得劲,作为一个学习计算机的博主,自然而然用代码来实现三子棋啦,再次感受童年的记忆,闲话少谈,直接进入今天的主题-----C语言实现简单的三子棋游戏。

 谈到三子棋,想必大家都不陌生,童年的回忆呀,读小学的时候有事没事就和同学玩上个几把,玩起来很得劲,作为一个学习计算机的博主,自然而然用代码来实现三子棋啦,再次感受童年的记忆,闲话少谈,直接进入今天的主题-----C语言实现简单的三子棋游戏。


1b26a990963d4e7992a4b51aa6a7241c.jpg


一:三子棋框架。

b7bf5d05cf5d4ad7bffb29aa53ba1d6b.png



二:test.c实现


 ①:写出主函数。

主函数主要是能循环,继续玩,并且能包括三子棋所有功能。


a588f41fd4b64f60845f9c1f4995a67a.png



②: 其次game()函数的实现。(实现玩游戏)

1.初始化棋盘为空格  void InitBoard(char board[ROW][COL], int row, int col)

2.打印棋盘  void DisplayBoard(char board[ROW][COL], int row, int col)

3.下棋 :  玩家下棋 void PlayerMove(char board[ROW][COL], int row, int col)

               电脑下棋 void CompaterMove(char board[ROW][COL], int row, int col)

4.判断输赢  char Iswin(char board[ROW][COL], int row, int col)


void game()
{
  char board[ROW][COL] = { 0 };   //定义一个3×3的字符数组
  char ret;
  //初始化棋盘为空格
  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;
    //电脑下棋
    CompaterMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = Iswin(board, ROW, COL);
    if (ret != 'C')
      break;
  }
  //ret == * 为玩家赢
  //ret == # 为电脑赢
  //ret == Q 为平局
  //ret == C 为继续
  if (ret == '*')
  {
    printf("玩家赢\n");
  }
  else if (ret == '#')
  {
    printf("电脑赢\n");
  }
  else {
    printf("平局\n");
  }
}

细节注意:玩家下一个子就打印一下棋盘,玩家下一个子就打印一下棋盘,如不再继续下子,说明没有地方可以下子了,就跳出while(1)循环,看判断输赢返回的是什么,就判断输赢和平局。想要这些函数可以使用,直接调用game.h---->#include"game.h"


三:game.h实现


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3  //行
#define COL 3  //列
//打印菜单
void menu();
//初始化棋盘为空格
void InitBoard(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 CompaterMove(char board[ROW][COL], int row, int col);
//判断输赢
char Iswin(char board[ROW][COL], int row, int col);


三:game.c实现(重点)


①.打印菜单(简单)


//打印菜单
void menu()
{
  printf("*********************************\n");
  printf("*********    1.play    **********\n");
  printf("*********    0.exit    **********\n");
  printf("*********************************\n");
}


②.初始化棋盘为空格


因为初始化3×3棋盘空格,所以需要传入char board[ROW][COL], int row, int col,字符数组,行,列。


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] = ' ';
    }
  }
  /*for (i = 0; i < ROW; i++)
  {
    for (j = 0; j < COL; j++)
    {
      printf("%c", board[i][j]);
    }
    printf("\n");
  }*/
}


③.打印棋盘

02c21e3eff224dc88e7802ec781ee0df.png


void DisplayBoard(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++)
    {
      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");
    }
  }
}


④.玩家下棋


细节注意:如果玩家下好了就在棋盘打印*,如果输入的坐标有误,用循环while(1),输入成功就跳出循环,直到输入成功。

void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  while (1)
  {
    //正确的坐标
    printf("请玩家输入坐标-->:");
    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");
    }
  }
}


⑤.电脑下棋


细节注意:因为要产生随机坐标,就要用到#include<stdlib.h> #include<time.h>两个函数,而在主函数需要写上srand((unsigned int)time(NULL));(这里可以看看博主的C语言猜数字游戏),如果电脑下好了就在棋盘打印#,如果输入的坐标有误,用循环while(1),输入成功就跳出循环,直到输入成功。


void CompaterMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  while (1)
  {
    x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}


⑥.判断输赢

         只要判断行,列,对角线,平局问题。行,列,对角线判断完成就返回*或者#或者Q或者C

* 为玩家赢   # 为电脑赢  Q 为平局   C 为继续。


//判断平局
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;
  int j = 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[0][i];
    }
  }
  //对角线
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  {
    return board[1][1];
  }
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  {
    return  board[1][1];
  }
  if (IsFull(board, ROW, COL) == 1)
  {
    return 'Q';
  }
  else
  {
    return 'C';
  }
}


OK,上述test.c   game.h  game.c文件讲解完毕,上完整代码。


test.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
  char board[ROW][COL] = { 0 };
  char ret;
  //初始化棋盘为空格
  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;
    //电脑下棋
    CompaterMove(board, ROW, COL);
    DisplayBoard(board, ROW, COL);
    //判断输赢
    ret = Iswin(board, ROW, COL);
    if (ret != 'C')
      break;
  }
  //ret == * 为玩家赢
  //ret == # 为电脑赢
  //ret == Q 为平局
  //ret == C 为继续
  if (ret == '*')
  {
    printf("玩家赢\n");
  }
  else if (ret == '#')
  {
    printf("电脑赢\n");
  }
  else {
    printf("平局\n");
  }
}
int main()
{
  int input = 0;
  srand((unsigned int)time(NULL));
  do
  {
    menu();
    printf("请输入-->");
    scanf("%d", &input);
    switch(input)
    {
    case 1:
      game();//玩游戏
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default:
      printf("输入错误,请重新输入\n");
      break;
    }
  } while (input);
  return 0;
}


game.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//打印菜单
void menu();
//初始化棋盘为空格
void InitBoard(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 CompaterMove(char board[ROW][COL], int row, int col);
//判断输赢
char Iswin(char board[ROW][COL], int row, int col);


game.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//打印菜单
void menu()
{
  printf("*********************************\n");
  printf("*********    1.play    **********\n");
  printf("*********    0.exit    **********\n");
  printf("*********************************\n");
}
//初始化棋盘为空格
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] = ' ';
    }
  }
  /*for (i = 0; i < ROW; i++)
  {
    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;
  int j = 0;
  for (i = 0; i < ROW; i++)
  {
    //打印数据
    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");
    }
  }
}
//下棋
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  while (1)
  {
    //正确的坐标
    printf("请玩家输入坐标-->:");
    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");
    }
  }
}
//电脑下棋
void CompaterMove(char board[ROW][COL], int row, int col)
{
  int x = 0;
  int y = 0;
  while (1)
  {
    x = rand() % row;
    y = rand() % col;
    if (board[x][y] == ' ')
    {
      board[x][y] = '#';
      break;
    }
  }
}
//判断平局
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;
  int j = 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[0][i];
    }
  }
  //对角线
  if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  {
    return board[1][1];
  }
  if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  {
    return  board[1][1];
  }
  if (IsFull(board, ROW, COL) == 1)
  {
    return 'Q';
  }
  else
  {
    return 'C';
  }
}


不知不觉就到了尾声啦,作为小白的我,可能写的不是很好,不对的地方还请各位小伙伴留言给我谢谢啦。

目录
相关文章
|
1月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
97 0
|
3月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
42 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
12天前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
25 1
|
4月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
79 0
C语言实战 | Flappy Bird游戏
|
1月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
82 1
|
1月前
|
存储 C语言
揭秘C语言:泊舟的猜数字游戏
揭秘C语言:泊舟的猜数字游戏
|
1月前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
1月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
|
1月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
37 0
|
1月前
|
C语言
C语言扫雷游戏(详解)
C语言扫雷游戏(详解)
40 0