大家好,今天为大家带来三子棋C语言版讲解,这个游戏看着简单,但是对于我这种新手实现起来还是有一定难度的,废话少说,直接开冲。

目录

一、事先准备

二、用户交互画面

三、三子棋棋盘的初始化和打印

四、玩家输入和电脑输入

玩家移动

电脑移动

五、判断输赢和平局

六、头文件和game函数


一、事先准备

我们要创建一个头文件和两个源文件

头文件game.h放游戏相关函数的声明

源文件test.c实现主函数,大致的框架

源文件game.c实现游戏相关函数

这样做的好处是将各复杂函数间模块化,也避免一个文件过于复杂,方便检查和相互调用。

定义三子棋棋盘的行和列,使用#define定义 ROW和COL,这里我们先定义为3,后期我们改造这个游戏为五子棋什么的只有改动ROW和COL就可以实现了。

二、用户交互画面

用户交互画面主要实现菜单mean函数的打印,供用户选择开始游戏和退出游戏。会用到do……while循环和switch选择结构。

交互画面还是比较简单的,在上一篇猜数字里就详细介绍到了,这里就不多说了。

int main()
{srand((unsigned int)time(NULL));//种子生成int input = 0;do{mean();printf("请输入选项:\n");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("游戏退出成功\n");break;default:printf("输入错误,请重新输入:->");break;}} while (input);return 0;
}

三、三子棋棋盘的初始化和打印

我们要来接受用户传来的值首先就要创建一个数组,并对数组中每个值赋值为空格。

这里我们创建一个char型的board数组行设为ROW,列设为COL。

然后创建一个void函数inti_board(初始化数组,将每个值初始化为空格)

这里我们将board数组作为函数参数传给inti_board,int_board用char board【ROW】【COL】接收数组,推荐使用数组的形式传参,使用指针的方式传二维数组还是比较容易出错的,不推荐。

//初始化棋盘
void inti_board(char board[ROW][COL])
{int i = 0;int j = 0;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){board[i][j] = ' ';}}
}

这样就对数组进行了初始化赋值,接下来我们就要来实现打印棋盘了,棋盘的样式如下:

这样的棋盘看着就比较像三子棋的棋盘了,接下来我们对这个棋盘进行分析:

表面上是三行,其实这个棋盘是打印三次,每次打印了两种内容的,由两种打印方式实现

1是空格、数据、空格加上竖杠,2是三个减号加上竖杠,

而且当列数为3时不打印最后那个竖杠,行数为最后一行时不打印减号和竖杠

这里我们画图来分析一下:

有了分析,我们就可以很轻松的用选择和循环语句来控制打印,代码如下:

void print_board(char board[ROW][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");}}printf("\n");
}

四、玩家输入和电脑输入

玩家移动

这时我们实现玩家移动player_move,设置一个x,y,用来接受用户输入的坐标,用*来表示用户的棋子同时我们要来进行判断两件事:

1、用户输入的坐标是不是在行列范围之内

2、用户输入的坐标原先是不是空格

这时我们就要来设置一个循环,只有上面两个条件满足了才能将那个坐标的值改动,并且跳出循环。

当然,我们还要考虑一件事,用户可能不知道数组是从零开始的,所以我们要将用户输入的坐标x,y进行减1,再放入到相对应的数组位子中去。代码实现如下:

//玩家移动
void player_move(char board[ROW][COL])
{//接受坐标int x = 0;int y = 0;while (1)                                    {printf("玩家请输入坐标->\n");scanf("%d %d", &x,& y);                     //玩家输入坐标if (x >= 1 && x <= 3 && y >= 1 && y <= 3)   //x和y的值在区间{if (board[x - 1][y - 1] == ' ')         //并且输入的位子是空格{board[x - 1][y - 1] = '*'; break;   //赋值退出}elseprintf ("位置被占用\n");}else printf("输入不合法");}}

电脑移动

我们将电脑落子定为#,首先我们来思考电脑应该如何下子,电脑应该如何产生坐标,这时我们就可以想到我们猜数字游戏中用过的rand函数来让电脑产生下棋的坐标(因为本人实力有限,不能设计算法来让电脑智能下棋)电脑下子的位子相比玩家下子就易控制一些,我们无需判断他是否会下出界,我们只用%3就可以让电脑产生的值一直再0-2之间,我们只用设置循环来让电脑产生的坐标原来是个空格就行了,然后让子落下,退出循环,再打印棋盘就行了。

这时我们可以设置一点细节,使用Windows.h中的Sleep函数,设置休息时间为Sleep(300)单位为毫秒,也就是0.3秒,来让下棋显得不那么僵硬,函数具体实现如下:

//电脑移动
void computer_move(char board[ROW][COL])
{int x = 0;int y = 0;while (1)      {x = rand() % ROW;y = rand() % COL;               //x,y不断判断;if (board[x][y] == ' ')         //判断生成的x和y的数组位子是空格{board[x][y] = '#';printf("电脑移动:\n");       //输出电脑在移动;Sleep(300);                  //假装电脑在思考break;                      //是空格就跳出循环}}
}

五、判断输赢和平局

首先判断输赢我们可以先思考,怎样算赢,三子棋有8种情况判为赢,即行三连,列三连,还有对角线三连。

那平局就很好想了,9个格子全不是空格。

那这里我们先来给个设定,下一步判断一次下棋状况,如果判断有一方胜利,则返回赢的情况中的一个值,如果有平局,则返回一个Q,代表和棋,如果都不满足,则返回C,游戏继续。

//判断输赢
char if_win(char board[ROW][COL])
{//玩家赢 返回*,电脑赢 返回#, 每次再判断平局返回Q,以上三种都没发生返回C;int i = 0;int j = 0;for (i = 0; i < ROW; i++){if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2])return board[i][0];if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i])return board[2][i];}if (board[1][1] != ' ' && board[0][0] == board[1][1] && board[2][2] == board[1][1])return board[1][1];else if (board[1][1] != ' ' && board[2][0] == board[1][1] && board[1][1] == board[0][2])return board[1][1];else if (if_full(board))return 'Q';else return 'C';
}
void print_win(int sign)
{if (sign == '*')printf("*****玩家赢*****\n");else if (sign == '#')printf("*****电脑赢*****\n");elseprintf("平局\n");}

我们可以想到,只要返回的是C,游戏继续,如果不是C,那就有三种情况:玩家赢,电脑赢,和平局,这时我们来进行判断。如果有一方触动了胜利的条件,则直接将其中的一个值返回就行了,然后我们来判断是*还是#号。同样,如果触发了平局条件,我们判断是不是平局条件,如果是平局,我们输出平局。那我们要再来实现if_full函数,棋盘满的条件。

和棋就是没有空格,那我们只用每次遍历一遍就行了,实现起来还是比较简单的。

//判断平局
int if_full(char board[ROW][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;
}

这样,输赢、和、继续就判断完了,我们只需要再来一个打印判断的结果的函数就行了

实现如下:

void print_win(int sign)
{if (sign == '*')printf("*****玩家赢*****\n");else if (sign == '#')printf("*****电脑赢*****\n");elseprintf("平局\n");}

这样,三子棋全部的函数部分就实现完了,我们现在要做的就是将函数声明放到头文件中,这样文件间就有了关系,文件间就可以相互调用了。

六、头文件和game函数

#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <Windows.h>
//定义常量
#define ROW 3
#define COL 3
//函数部分声明//菜单
void mean();
//游戏函数
void game();
//棋盘数组初始化
void inti_board(char board[ROW][COL]);
//打印棋盘
void print_board(char board[ROW][COL]);
//玩家输入
void player_move(char board[ROW][COL]);
//电脑移动
void computer_move(char board[ROW][COL]);
//判断输赢
char if_win(char board[ROW][COL]);
//判断平局
int  if_full(char board[ROW][COL]);
//结果打印
void print_win(int sign);

接下来我们来看一下主函数部分,看一下game函数的主要部分:

void game()
{char sign ;char board[ROW][COL] = { 0 };//初始化棋盘inti_board(board);//打印棋盘print_board(board);//游戏进行while (1){//玩家移动player_move( board);print_board(board);//移动一次判断一次输赢sign = if_win(board);if (sign != 'C'){print_win(sign);break;}//电脑移动computer_move(board);print_board(board);sign = if_win(board);if (sign != 'C'){print_win(sign);break;}}
}

这样,三子棋游戏就实现了,总结一下,我们将游戏的函数部分、主函数放在不同的文件,这样有利于我们一步一步的调试,也便于我们分析程序,再将函数声明放在头文件中,这样巧妙的连接了两份源文件,并且减少了冗余。

大家留个赞呗~~

【三子棋】C语言版——妈咪级讲解相关推荐

  1. C语言三子棋游戏进阶版详解(包括多子棋)

    目录 一,总体思路介绍 二,具体思路的实现 1.初始化游戏界面 2.初始化棋盘 3.打印棋盘 4.玩家移动 5.电脑移动 6.判断输赢 三,源码展示 game.h game.c test.c 一,总体 ...

  2. c语言程序下三子棋,C语言实现三子棋游戏(初级版)

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 game.h #include #include #include #define ROW 3 #define COL 3 ...

  3. 【C语言入门游戏】三子棋的实现———【保姆级教学】

    目录 1.何为三子棋,三子棋的规则如何? 2. 游戏的整体框架 2.1 创建游戏菜单 test.c game.h ​编辑 2.2 初始化棋盘 game.c 2.3 打印棋盘 2.4 玩家下棋 2.5 ...

  4. 三子棋 C语言【详解】

    目录 一:游戏的介绍 二:1>游戏文件的创立 2>游戏代码各部分的实现讲解 3>游戏的运行 三:完整代码的展示 最终代码 一:游戏的介绍 二:1>游戏文件的创立 2>游戏 ...

  5. 趣味益智小游戏 三子棋+五子棋 优化版(可任意选择棋盘大小)

    前言 今天牛牛给大家分享的是c语言实现三子棋和五子棋游戏,初学者可能有些不理解的地方,记得私信提问哦,牛牛会一 一回答的. 目录 前言 一.游戏介绍 二.游戏设计思路 2.1 主函数测试区(test. ...

  6. c语言小游戏 三子棋,C语言实现简单的三子棋小游戏

    学习完数组就能用C语言写出的简单小游戏: 编译器使用的为VS2013 代码分为三个部分 1.头文件 game.h 2.源文件 game.c 用来存放游戏中所有的函数 3.源文件 test.c 用来存放 ...

  7. 人机大战?——带你玩转三子棋(C语言)

    @TOC 1.前言 在学习完数组之后,我们就可以自己来实现一个简单游戏-三子棋了! 为了确保程序的独立性:我们创建了一个源函数game.c 和test.c,一个头文件game.h test.c--测试 ...

  8. 三子棋游戏--简易版

    大家好!又见面啦,这次给大家带来的是井字棋小游戏,话不多说,下面我们开始吧! 先创立头文件"game.h"用于放置游戏需要的函数声明,宏定义,其他头文件,源文件test.c用于实现 ...

  9. 万字解析:带你走进五子棋(普通版)和三子棋的世界(C语言)

    今天,我们来再来实现一个大家都不陌生的小项目:三子棋. 1,三子棋 1,思路分析 写一个小项目,必不可少的是思路的构建.写一个游戏,我们首先需要一个菜单,这是最基本的,让用户来选择是否要玩这个游戏.如 ...

最新文章

  1. 题目1182:统计单词
  2. 《构建之法》第三周阅读笔记
  3. ceo for one month final around
  4. HTTP 中的 304
  5. 用户 IP,里面藏了多少秘密?
  6. 当年我是如何死磕 MySQL 数据库的
  7. 图片像QQ有消息闪动的代码:
  8. cookie helper.php,CookieHelper cook crud 工具类
  9. 73. 文件上传(2)
  10. Codeforces Round #573 (Div. 2)
  11. 马科维茨投资组合理论总结
  12. tmap | 制作地图动画、放大局部区域
  13. selenium firefox 启动报错 Timed out wating 45 seconds for firefox to start
  14. Excel如何批量删除批注
  15. 教你怎样混社会[转]
  16. 如何在VMware虚拟机中查看Linux的IP地址
  17. 滴滴云服务器搭建网站的一键脚本,一键搭建流控脚本 一键搭建云免流服务器...
  18. C++ Lambda 表达式教程
  19. SSM学习笔记4(Spring整合Mybatis,P26-P28,真吉尔难)
  20. Python量化投资——七行python代码生成K线图(最后有干货)

热门文章

  1. HFCTF2022 Web ezphp
  2. 2D-UNet脑胶质瘤分割BraTs + Pytorch实现
  3. 100个让ChatGPT更听话的技巧之:提出更具体的问题
  4. 模块化思想重写之前写的My97DatePicker的例子
  5. antd 日期时间选择_antd日期选择器禁止选择当天之前的时间操作
  6. Vue学习Day6 插槽slot使用、编译作用域、作用域插槽、模块化开发、webpack介绍、安装
  7. github创建分支上传最后合并到主分支
  8. 火车票订票系统的几点优化思考
  9. AI算法示例-图像识别
  10. Java- 数据结构之树