C语言版三子棋小游戏

本文实例为大家分享了C语言版三子棋小游戏的具体代码,供大家参考,具体内容如下

①游戏效果

  • 有一个3*3的棋盘
  • 每次下棋后(电脑和玩家),棋盘会更新数据
  • 会有菜单提示相关命令进行相关操作
  • 下棋方法是输入坐标
  • 每一局游戏结束后,会询问是否继续.

②主函数逻辑搭建

任何一个项目的实现,最重要的就是逻辑结构搭建,而各个功能的实现就是采取函数(模块化)进行细分.

所以我们需要搭建逻辑,那么逻辑结构是啥呢?

  • 首先会跳出提示菜单,内容为 0退出游戏,1开始/继续游戏,其他键提示错误,并重新输入
  • 按0后提示 “成功退出游戏”
  • 按1开始游戏
#include <stdio.h>
int main()
{
 int input = 0;
 do
 {
        remind(); // 提示菜单
        scanf("%d",&input); //开始输入命令
  switch (input)
  {
  case 0:
   printf("成功退出游戏\n");
   break;
  case 1:
   playgame(); // 开始游戏
            printf("是否继续游戏\n");
   break;
  default :
   printf("命令错误,请重新选择\n");
   break;
  }
 } while (input);
 return 0;
}

③游戏模块(playgame)逻辑搭建

前面的逻辑结构已经搭建,而我们需要实现的就是 playgame()模块.

那么他的功能逻辑是啥呢??

  • 棋盘内容用二维数组存储
  • 初始化棋盘(即棋盘上还没有下子).所以初始化是一个单独模块
  • 对弈分为两个模块(电脑下子与玩家下子)
  • 每一局对弈后,都要判断电脑或玩家是否赢.(所以又是一个单独的判断输赢模块)
#define row 3
#define col 3

void playgame()
{
 char board[row][col]; // 存储下子内容
 int result = 0; //用来接收Iswin函数判断的返回值

 Initboard(board, row, col); //初始化棋盘,即最开始棋盘都没有下子

 Displayboard(board, row, col); //显示棋盘,即显示棋盘目前的状态

 while (1) //开始进行对弈,直到一方赢或者平局结束循环
 {
  player(board, row, col);  //玩家下子函数

  if ((result = Iswin(board, row, col)) == 1) break; // Iswin函数的设定是如果玩家胜利,返回1

  computer(board, row, col);  //电脑下子函数

  if ((result = Iswin(board, row, col)) == -1) break; // Iswin函数的设定是 如果电脑胜利,返回-1

  if (!result) break; //返回0平局,如果既没有输赢也不是平局,则继续对弈
 }

 if (result == 1) printf("恭喜您取得胜利!!!!!!!!!\n");
 else if (result == -1) printf("你也太辣鸡了吧,电脑都下不赢\n");
 else printf("哎~~,你的技术不行啊,居然和电脑达成平手\n");
}

解释:

可以清晰的明白playgame()函数的逻辑结构.

其中有一步骤是这样的if (Iswin(board, row, col) >= 0),它的执行是先调用函数(满足我们需要判断谁赢的要求),再利用返回结果判断是否结束循环,一条程序就达到两个效果,比较妙.

④分支模块具体实现

0.remind函数实现

就是起到一个提示作用,直接打印就行.

void remind()
{
 printf("+------------------------------------------+\n"
        "+--------------  0 结束游戏  --------------+\n"
        "+-----------  1 开始/继续游戏  ------------+\n"
        "+------------------------------------------+\n");

}

1.Initboard函数实现

既然是初始化函数,说明我们的要求就是把二维数组board初始化为全空格.

void Initboard(char(*board)[3],int Row,int Col )
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  for (j = 0; j < Col; j++)
  {
   board[i][j] = ' '; // 赋予空格
  }
 }
}

2.Displayboard函数实现

显示棋盘内容显示的不止是二维数组board的内容,还要加上边界(如图),所以Displayboard的要求是什么?

既要显示边界,也要显示board的存储内容.

而显示边界我们可以分成小块循环显示,比如看成3个条形加上最后下边界

每一个条形又可以看成三个小方块加上小右边界

void Displayboard(char(*board)[3], int Row, int Col)
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  printf("+---+---+---+\n");   //打印小条形的上边界
  for (j = 0; j < Col; j++)
  {
   printf("| %c ",board[i][j]); //打印小条形中的方块内容
  }
  printf("|\n"); //补上 小右边界
 }
 printf("+---+---+---+\n"); //补上 下边界
}

3.player函数实现

玩家下棋采用的是坐标输入方式

玩家输入一个坐标,那么棋盘上的相应位置就应该更新.(相应位置用 * 表示)

输入坐标时候还要检验该位置是否已经落子了.

void player(char(*board)[3], int Row, int Col)
{
 printf("请分别输入横纵坐标(输入数据请用空格隔开):\n");
 scanf("%d%d", &Row, &Col);
 while (1)
 {
  if (((1 <= Row) && (Row <= 3))  //边界必须合格,且该地方无子
   && ((1 <= Col) && (Col <= 3))
   && (board[Row-1][Col-1] == ' '))
  {
   board[Row - 1][Col - 1] = '*'; //之所以Row - 1  Col - 1是考虑到玩家不一定是程序员,他不知道编程从0开始数
   break;
  }
  else
  {
   printf("请仔细坚持你的坐标位置,是否已经落子或坐标超界,然后重新输入坐标.\n");
   printf("请输入坐标:\n");
   scanf("%d%d", &Row, &Col);
  }
 }
 printf("下子成功!\n");
 Displayboard(board, row, col); // 无论是玩家还是电脑下子,都需要显示出下子内容
}

4.Iswin函数实现

玩家或者电脑下子后,需要判断双方有一方是否赢.

Iswin的作用就是判断是否有一方赢.

其中返回值1代表玩家胜利,返回值0代表平局,返回值-1代表电脑赢

判断胜利方法就是检查每行每列以及斜线是否有一样的,以及是否不输不赢

int Iswin(char(*board)[3], int Row, int Col)
{
 //怎么判断一方赢?? 横,竖,斜线只要都一样,则可以知道一方赢(全是空格除外)
 for (int i = 0; i < Row; i++) //每一行
 {
  if ((board[i][0] == board[i][1])
   && (board[i][1] == board[i][2])
   && (board[i][0] != ' '))
  {
   if (board[i][0] == '*') return 1;  //如果一行都是*,说明玩家胜利,否则电脑胜利
   return -1;
  }
 }

 for (int j = 0; j < Col; j++) //每一列
 {
  if ((board[0][j] == board[1][j])
   && (board[1][j] == board[2][j])
   && (board[0][j] != ' '))
  {
   if (board[0][j] == '*') return 1; //如果一列都是*,说明玩家胜利,否则电脑胜利
   return -1;
  }
 }

 if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜线
  ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != ' ')))
 {
  if (board[1][1] == '*') return 1;
  return -1;
 }

 for (int i = 0; i < Row; i++)
 {
  for (int j = 0; j < Col; j++)
  {
   if (board[i][j] == ' ')
    return -2; //如果前三者情况都没有,只要目前棋盘上还剩下空余位置
                  //就说明不输不赢,需要继续对弈.返回[-1,1]之外的值就行
  }
 }

 return 0; //除去上面4种情况就是平局
}

5.computer函数实现

由于是电脑下载,我们无法操作,于是只有让电脑随机下载了.缺陷是电脑就有点智障了,哈哈.

#include <stdlib.h>
#include <time.h>
void computer(char(*board)[3], int Row, int Col)
{
 srand(time(NULL));
 while (1)
 {
  int i = rand() % 3;
  int j = rand() % 3;
  if (board[i][j] == ' ')
  {
   board[i][j] = '#';//#代表电脑下子
   break;
  }
 }
 printf("电脑已下子:\n");
 Displayboard(board, row, col); //电脑下子后,显示棋盘
}

⑤完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define row 3
#define col 3

void remind()
{
 printf("+------------------------------------------+\n"
        "+--------------  0 结束游戏  --------------+\n"
        "+-----------  1 开始/继续游戏  ------------+\n"
        "+------------------------------------------+\n");

}

void Initboard(char(*board)[3],int Row,int Col )
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  for (j = 0; j < Col; j++)
  {
   board[i][j] = ' '; // 赋予空格
  }
 }
}

void Displayboard(char(*board)[3], int Row, int Col)
{
 int i = 0, j = 0;
 for (i = 0; i < Row; i++)
 {
  printf("+---+---+---+\n");
  for (j = 0; j < Col; j++)
  {
   printf("| %c ",board[i][j]);
  }
  printf("|\n");
 }
 printf("+---+---+---+\n");
}

void player(char(*board)[3], int Row, int Col)
{
 printf("请分别输入横纵坐标(输入数据请用空格隔开):\n");
 scanf("%d%d", &Row, &Col);
 while (1)
 {
  if (((1 <= Row) && (Row <= 3))  //边界必须合格,且该地方无子
   && ((1 <= Col) && (Col <= 3))
   && (board[Row-1][Col-1] == ' '))
  {
   board[Row - 1][Col - 1] = '*'; //之所以Row - 1  Col - 1是考虑到玩家不一定是程序员,他不知道编程从0开始数
   break;
  }
  else
  {
   printf("请仔细坚持你的坐标位置,是否已经落子或坐标超界,然后重新输入坐标.\n");
   printf("请输入坐标:\n");
   scanf("%d%d", &Row, &Col);
  }
 }
 printf("下子成功!\n");
 Displayboard(board, row, col); // 无论是玩家还是电脑下子,都需要显示出下子内容
}

void computer(char(*board)[3], int Row, int Col)
{
 srand(time(NULL));
 while (1)
 {
  int i = rand() % 3;
  int j = rand() % 3;
  if (board[i][j] == ' ')
  {
   board[i][j] = '#';//#代表电脑下子
   break;
  }
 }
 printf("电脑已下子:\n");
 Displayboard(board, row, col); //电脑下子后,显示棋盘
}

int Iswin(char(*board)[3], int Row, int Col)
{
 //怎么判断一方赢?? 横,竖,斜线只要都一样,则可以知道一方赢(全是空格除外)
 for (int i = 0; i < Row; i++) //每一行
 {
  if ((board[i][0] == board[i][1])
   && (board[i][1] == board[i][2])
   && (board[i][0] != ' '))
  {
   if (board[i][0] == '*') return 1;  //如果一行都是*,说明玩家胜利,否则电脑胜利
   return -1;
  }
 }

 for (int j = 0; j < Col; j++) //每一列
 {
  if ((board[0][j] == board[1][j])
   && (board[1][j] == board[2][j])
   && (board[0][j] != ' '))
  {
   if (board[0][j] == '*') return 1; //如果一列都是*,说明玩家胜利,否则电脑胜利
   return -1;
  }
 }

 if (((board[0][0] == board[1][1]) && (board[1][1] == board[2][2]) && (board[1][1] != ' ')) //斜线
  ||((board[0][2] == board[1][1]) && (board[1][1] ==board[2][0]) && (board[1][1] != ' ')))
 {
  if (board[1][1] == '*') return 1;
  return -1;
 }

 for (int i = 0; i < Row; i++)
 {
  for (int j = 0; j < Col; j++)
  {
   if (board[i][j] == ' ')
    return -2; //如果前三者情况都没有,只要目前棋盘上还剩下空余位置
                  //就说明不输不赢,需要继续对弈.返回[-1,1]之外的值就行
  }
 }

 return 0; //除去上面4种情况就是平局
}

void playgame()
{
 char board[row][col]; // 存储下子内容
 int result = 0; //用来接收Iswin函数判断的返回值

 Initboard(board, row, col); //初始化棋盘,即最开始棋盘都没有下子

 Displayboard(board, row, col); //显示棋盘,即显示棋盘目前的状态

 while (1) //开始进行对弈,直到一方赢或者平局结束循环
 {
  player(board, row, col);  //玩家下子函数

  if ((result = Iswin(board, row, col)) == 1) break; // Iswin函数的设定是如果玩家胜利,返回1

  computer(board, row, col);  //电脑下子函数

  if ((result = Iswin(board, row, col)) == -1) break; // Iswin函数的设定是 如果电脑胜利,返回-1

  if (!result) break; //返回0平局,如果既没有输赢也不是平局,则继续对弈
 }

 if (result == 1) printf("恭喜您取得胜利!!!!!!!!!\n");
 else if (result == -1) printf("你也太辣鸡了吧,电脑都下不赢\n");
 else printf("哎~~,你的技术不行啊,居然和电脑达成平手\n");
}

#include <stdio.h>
int main()
{
 int input = 0;
 do
 {
  remind(); // 提示菜单
  scanf("%d", &input); //开始输入命令
  switch (input)
  {
  case 0:
   printf("成功退出游戏\n");
   break;
  case 1:
   playgame(); // 开始游戏
   printf("是否继续游戏\n");
   break;
  default:
   printf("命令错误,请重新选择\n");
   break;
  }
 } while (input);
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言实现三子棋程序

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 先直接上代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //2.实现三子棋游戏. #include<Windows.h> //Sleep() RAND_MAX 的头文件 void menu() //打印菜单 { printf("****************************\n"); printf("***

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

  • C语言实现简单三子棋游戏

    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 游戏介绍:使用C语言中二维数组和函数的基本知识实现一个三子棋游戏,这个游戏要实现的基本功能有初始化棋盘.棋盘的打印.玩家下棋.电脑下棋.判断输赢. 代码框架: 1.头文件(game.h) #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<st

  • C语言三子棋小游戏的实现代码

    本文实例为大家分享了C语言三子棋小游戏的具体代码,供大家参考,具体内容如下 一.介绍: 运用C语言的数组等相关知识:实现一个简易的三子棋小游戏: 三子棋小游戏的大概内容为 此游戏在设计时:总共设计了三个文件: game.h: 类型的声明和函数的声明 game.c:函数功能的具体实现 test.c: 测试文件 二.具体实现: (1).game.h模块: 代码实现如下: #define _CRT_SECURE_NO_WARNINGS 1 //头文件包含 #include <stdio.h> #in

  • C语言实现简单的三子棋

    本文实例为大家分享了C语言实现简单三子棋游戏的具体代码,供大家参考,具体内容如下 一.主要思想 1.创建一个3*3的棋盘(使用字符数组) 2.初始化棋盘(用空格填充) 3.打印棋盘(使其有可见的边框) 4.玩家落子,用x表示(检验是否越界,是否已经落子,是否赢) 5.电脑落子,用o表示(检验是否已经落子,是否赢)  注:电脑在有效范围内随机落子,使用当前时间戳设置随机种子即srand(time(0)) 6.三种情况:玩家赢,电脑赢,和棋 二.代码实现 #define _CRT_SECURE_NO

  • C语言实现三子棋小游戏

    在这里我们要写出一个三子棋的小游戏,能够实现所需要的三字连珠的功能,并且可以使得游戏让玩家进行选择是否继续的功能. 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void init_board(char arr[ROW][COL]) { int i=0; int j=0; for

  • C语言实现简单三子棋程序

    使用C语言实现简单的三子棋程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的三子棋程序,首先需要创建一个二维数组,并完成数组初始化. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 3 //行 #define COL 3 //列 char arr[ROW][COL] = { 0 }; Arr_init(arr,

  • C语言实现三子棋的步骤和代码详解

    一.问题描述 用c语言实现三子棋. 二.基本流程 在写三子棋的代码之前,我们来看看实现这个游戏的逻辑: 1.菜单界面选择开始或者退出游戏. 2.创建棋盘并初始化. 3.打印棋盘. 4.玩家落子(玩家输入行列坐标的方式来落子),'x'表示玩家落子. 5.判定胜负关系(输,赢,和棋),'q'表示和棋. 6.电脑落子(随机位置落子) ,'o'表示电脑落子. 7.判定胜负关系. 8.回到 步骤2 继续执行. 三.步骤 1.菜单界面 1.开始游戏 0.退出游戏 int menu(){ printf("--

  • C语言实现三子棋小游戏详解

    在用c语言实现三子棋小游戏之前,我们应当了解三子棋的游戏规则:在九宫格棋盘上,哪一方三个棋子连成一线(一行或一列或对角线)即判定哪一方胜利. 以下为源代码: 1.首先打印出菜单. void menu() { printf("**********************************\n"); printf("**********************************\n"); printf("***** 0.play *********

  • C语言实现三子棋

    本文实例为大家分享了C语言实现三子棋的具体代码,供大家参考,具体内容如下 题目:C语言实现三子棋 问题分析:首先用到数组,存储信息.棋盘的信息和棋子的信息 打印棋盘 读取棋子的位置 判断是否连子 打印棋盘 然后重复 代码如下: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> //数组沙盘 char Global_Gobang[10][10]; int Global_line, Global_p

随机推荐