目录

一、游戏菜单

二、打印棋盘

三、下棋

四、判断输赢

五、游戏结果

六、代码整合


自己上手写一个小游戏首先需要知道游戏的框架、步骤以及相关的逻辑

主要从以下三个文件着手:

  1. test.c  游戏的测试逻辑
  2. game.c  游戏的实现逻辑
  3. game.h  游戏实现函数的声明

一、游戏菜单

void menu()
{printf("***********************************\n");printf("***********  1. 开始  *************\n");printf("***********  0. 结束  *************\n");printf("***********************************\n");
} void test()
{int input;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game();break;      case 0:printf("退出游戏\n");break;default:printf("请输入正确数字\n");break;}} while (input);}int main()
{test();return 0;
}

二、打印棋盘

首先需要创建棋盘,棋盘有行有列,需要创建二维数组,二维数组中所填的为字符,所以创建字符

型二维数组。

【为什么要用宏来定义数组下标?(便于修改)】(将宏定义放入game.h头文件中)

需要使用头文件中的内容需要引用,当头文件是自己写的时,用双引号引用

#include "game.h"

初始化棋盘

//将二维数组置为空
void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}

打印棋盘:

版本1(仅限于三行三列):

void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 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");}
}

打印结果如下:

版本2:

修改ROW,COL的值进行打印

#define ROW 5
#define COL 5void 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");}
}

打印结果为:

三、下棋

玩家用O, 电脑用X.

玩家下棋:

void player_move(char board[ROW][COL], int row, int col)
{printf("玩家下棋:");int x = 0, y = 0;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] = 'O';}else{printf("该坐标已被占,请重新输入");}}else{printf("请输入正确坐标!");}}
}

电脑下棋:

因电脑下棋需要生成随机数,便用到以下函数,还需引用对应的头文件

C 库函数 int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。

RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。

在test() 函数中要添加    srand((unsigned int)time(NULL));

//将时间作为随机数种子,生成随机数

#include <time.h>
#include <stdlib.h>
void computer_move(char board[ROW][COL], int row, int col)
{int x = 0, y = 0;printf("电脑下棋:\n");while (1){x = rand() % ROW;//0-2y = rand() % COL;//0-2if (board[x][y] == ' '){board[x][y] = 'X';break;}}
}

四、判断输赢

  • 玩家赢 - 'O'
  • 电脑赢 - 'X'
  • 平局 - 'Q'
  • 继续 - 'C'
//判断数组是否满了
int is_full(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 is_win(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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断平局if (1 == is_full(board, row, col)){return 'Q';}//继续return 'C';
}

在game() 函数原有基础上添加判断

//void game()
//{
//  char board[ROW][COL] = { 0 };
//  InitBoard(board, ROW, COL);   //初始化棋盘
//  DisplayBoard(board, ROW, COL); //打印棋盘char ret = 0;//while (1)//{// player_move(board, ROW, COL);// DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}//   computer_move(board, ROW, COL);//   DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}}if (ret == 'O'){printf("玩家赢\n");}else if (ret == 'X'){printf("电脑赢\n");}else{printf("平局\n");}
//}

五、游戏结果

玩家赢

电脑赢

平局

六、代码整合

game.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>#define ROW 3
#define COL 3//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);//打印棋盘
void DisplaytBoard(char board[ROW][COL], int row, int col);//玩家下棋
void player_move(char board[ROW][COL], int row, int col);//电脑下棋
void computer_move(char board[ROW][COL], int row, int col);//判断输赢
char is_win(char board[ROW][COL], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void InitBoard(char board[ROW][COL], int row, int col)
{int i = 0, j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = ' ';}}
}//版本1  适用于三行三列
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;int j = 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");}
}//版本2 适用于多行多列
//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 player_move(char board[ROW][COL], int row, int col)
{printf("玩家下棋:");int x = 0, y = 0;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] = 'O';break;}else{printf("该坐标已被占,请重新输入");}}else{printf("请输入正确坐标!");}}
}void computer_move(char board[ROW][COL], int row, int col)
{int x = 0, y = 0;printf("电脑下棋:\n");while (1){x = rand() % ROW;//0-2y = rand() % COL;//0-2if (board[x][y] == ' '){board[x][y] = 'X';break;}}
}//判断数组是否满了
int is_full(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 is_win(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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '){return board[1][1];}//判断平局if (1 == is_full(board, row, col)){return 'Q';}//继续return 'C';
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu()
{printf("***********************************\n");printf("***********  1. 开始  *************\n");printf("***********  0. 结束  *************\n");printf("***********************************\n");
} void game()
{char board[ROW][COL] = { 0 };InitBoard(board, ROW, COL);   //初始化棋盘DisplayBoard(board, ROW, COL); //打印棋盘char ret = 0;while (1){player_move(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}computer_move(board, ROW, COL);DisplayBoard(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}}if (ret == 'O'){printf("玩家赢\n");}else if (ret == 'X'){printf("电脑赢\n");}else{printf("平局\n");}
}void test()
{int input;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);}int main()
{test();return 0;
}

三子棋小游戏(C语言版)相关推荐

  1. 呆头呆脑的电脑----三子棋小游戏(C语言版)

    目录 1.需求分析 2.程序架构 3.代码实现(分函数呈现) (1)主函数代码实现 分析: 异常处理: (2)菜单函数的实现 分析: (3)游戏函数的实现 分析: (4)棋盘的初始化 分析: (5)棋 ...

  2. 三子棋小游戏带你走进编程世界(c语言版)

    目录 一.游戏实现的整体思路 二.实现游戏大体框架 二.游戏函数的实现 1.初始化键盘 2.打印棋盘 3.下棋及胜负判断 (1)玩家下棋 (2)电脑下棋 (3)判断输赢 三.结语及源码 三子棋想必大家 ...

  3. 【牛客刷题】上手用C语言写一个三子棋小游戏超详解哦(电脑优化)

    作者:[南航科院小张 南航科院小张的博客 专栏:从c语言的入门到进阶 学习知识不只是要懂,还要会用:想要找到好的工作,这里给大家介绍一件可以斩获诸多大厂offer的利器–牛客网 点击免费注册和我一起开 ...

  4. 使用C语言编写三子棋小游戏

    使用C语言编写三子棋小游戏: 首先进行分析: 1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试. 2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构. 3.游戏 ...

  5. C语言实现三子棋小游戏(编程思路以及代码详解)

    目录 前言 一.三子棋游戏的实现逻辑 二.创建菜单并控制游戏开始或游戏结束 三.创建棋盘并且初始化棋盘 四.打印棋盘并验证打印棋盘和初始化棋盘模块的实现 五.玩家下棋 六.电脑下棋 六.输赢判断 七. ...

  6. C语言小项目--三子棋小游戏

    学了这么长时间的C语言,你是否觉得没有一个没写过稍微长点的代码显得很没有成就感!不怕,今天带你做一个小游戏,领略一下写C和小游戏的快乐.写完记得给自己一个鼓励哦! 一.三子棋小游戏 想必大家都玩过三子 ...

  7. vs2010c语言小游戏,用C语言写一个三子棋小游戏(用VS2010实现,加强版)

    前几天写了一个三子棋小游戏,但是比较简单,因为以前写的游戏棋盘只能是3x3那么大.今天对那个程序做了两点改进: 1.现在可以实现在任意大小的棋盘上下棋了. 2.因为棋盘可能变大,为了玩家方便确定坐标, ...

  8. 趣讲用c语言实现三子棋小游戏

    目录 直接先看看最后运行效果吧 三子棋如何设计的,及其步骤 1,源文件已经头文件的创建 2.创建主函数 3.test函数的创建 4.game函数的创建和运行 5.五个函数的实现 a.init_boar ...

  9. 三子棋小游戏(超详细)

    目录 一.实现三子棋游戏的基本逻辑 二.具体的函数实现 1. 菜单函数 2. 棋盘的实现 2.1 棋盘的初始化 2.2 棋盘的打印 3. 玩家下棋 4. 电脑下棋 5.判断棋盘状态 三. 三个文件 3 ...

  10. 如何制作三子棋小游戏

    首先,一个游戏的制作,必须由大化小,分步完成. 当我们想要制作三子棋小游戏时,必须先搞清楚这个小游戏的逻辑和原理. 三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋 ...

最新文章

  1. Python调用外部程序——os.system()和subprocess.call()
  2. 20155317《网络对抗》Exp4 恶意代码分析
  3. 3d相册 html 代码_HTML5 3D立体图片相册
  4. Redis数据持久化之AOF持久化
  5. C++_异常6-其他异常特性
  6. 转: Executor类
  7. java printf 版本_java – PrintStream类型中的printf(String,Object ...
  8. Python之List和Tuple类型(入门3)
  9. 树莓派 编译live555_树莓派raspberry4B入坑指南 part-6 docker编译古灵币钱包
  10. layui报错 “Layui hint: 模块名 xxx 已被占用“ 的问题解决方案
  11. 总结better-scroll插件的使用
  12. NOR Flash的原理与操作
  13. python机器学习之数据集(查看数据,划分训练集、测试集)
  14. 简单的病毒制作及破解方法
  15. NES模拟器[H_NES]
  16. 手机支付宝面临的风险和应对(III)---手机支付宝能照搬PC的思路吗?
  17. 遥感数据网站整理中......
  18. 从全球制造业的迁移史,看中国制造业未来会怎么走?
  19. 大数据小项目之电视收视率企业项目07
  20. 快速乘-在乘法溢出的边缘疯狂试探

热门文章

  1. 中国信号中继器市场趋势报告、技术动态创新及市场预测
  2. unity 实时画面投屏到手机_将Unity实时画面投屏到手机
  3. android 修改 dpi_红米2WC|魔趣100|安卓10.0|10.10定制|归属地|机型修改|性能调整|稳定流畅...
  4. 提灯人Project#1|元宇宙“高玩”的PVP大赛报名进行中
  5. Qt5获取windows系统下除去任务栏后的屏幕高度
  6. 亲身体验日全食全过程
  7. IConfiguration Interface
  8. 马云以2750亿财富第三次成为中国首富;扎克伯格:AWS云服务成本太高;小米否认冰箱由海尔代工 | EA周报...
  9. Felix Niklasson:全景声音频软件Spat Revolution简介
  10. 各大IT公司的名字由来(持续整理中ing...)