一、问题描述
三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、井字棋、田字棋、对角棋等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,如果两个人都掌握了技巧,那么一般来说就是平棋。现在要求利用C语言实现玩家与电脑的对抗,并判断输赢。
二、解题思路
对于此问题的实现,我们分为打印棋盘,人机对抗,判断输赢等三大模块,其中人机对抗采用玩家与电脑各自走一步后判断输赢,谁先达到三个子一条线谁就先赢。因此,我们有以下的功能需要实现。
(1)三子棋棋盘的九个格子可看为一个3*3的二维数组,从而初始化棋盘代码如下:

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] = ' ';}}
}

(2)打印棋盘,棋盘如下图所示

棋盘可分为局部进行打印:
代码如下:

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)当棋盘打印完成后,就进行游戏部分,我们采用玩家和电脑交叉进行落子。
玩家落子代码:

void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋
{int x = 0;int y = 0;printf("玩家走");while (1){printf("请输入坐标:> ");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = 'x';break;}else{printf("坐标已被占用\n");}}else{printf("输入坐标不合理,请重新输入\n");}}
}

由于电脑是采用随机落子的方式所以要应尽随机数rand()函数,从而实现其功能,其代码如下:

void ComeputerMove(char board[ROW][COL], int row, int col)//电脑玩
{int x = 0;int y = 0;printf("电脑走:\n");while (1){x = rand() % row ;y = rand() % col ;if (board[x][y] == ' '){board[x][y] = 'o'; break;  }}
}

(4)经过前面模块性的描述,当玩家和电脑各走一步的时候都得对它们进行判断输赢,从而引进判断输赢代码:

static 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][0] != ' '){return board[i][0];}}for (i = 0; i<col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][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 'p';}return 'c';
}

(5)将这些模块化的函数板块在进行逻辑上的调整,对于三子棋的游戏的C语言实现就很简单了。
三、完整代码
(1)头文件game.h

#define _CRT_SECURE_NO_WARNINGS 1#ifndef  _GAME_H_
#define  _GAME_H_#include <stdio.h>
#include <time.h>
#include <stdlib.h>#define ROW 3
#define COL 3void 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 ComeputerMove(char board[ROW][COL], int row, int col);//'x'玩家赢
//'o'电脑赢
//'p'平局
//'c'继续
char IsWin(char board[ROW][COL], int row, int col);#endif

(2)game.c文件

#define _CRT_SECURE_NO_WARNINGS 1# 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++){//打印一行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");}
}void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋
{int x = 0;int y = 0;printf("玩家走");while (1){printf("请输入坐标:> ");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = 'x';break;}else{printf("坐标已被占用\n");}}else{printf("输入坐标不合理,请重新输入\n");}}
}void ComeputerMove(char board[ROW][COL], int row, int col)//电脑玩
{int x = 0;int y = 0;printf("电脑走:\n");while (1){x = rand() % row ;y = rand() % col ;if (board[x][y] == ' '){board[x][y] = 'o'; break;  }}
}static 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][0] != ' '){return board[i][0];}}for (i = 0; i<col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][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 'p';}return 'c';
}

(3)tect.c文件

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void meau()
{printf("*******************************\n");printf("*******      1.play   *********\n");printf("*******      0.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;}//电脑玩ComeputerMove(board, ROW, COL);//打印棋盘DisplayBoard(board, ROW, COL);//判断输赢ret = IsWin(board, ROW, COL);if (ret != 'c'){break;}}if (ret == 'x'){printf("你赢啦\n");}else if (ret == 'o'){printf("电脑赢了\n");}else if (ret == 'p'){printf("平局\n");}
}void rent()
{int input = 0;srand((unsigned int)time(NULL));do{meau();printf("请输入序号:> ");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);
}
int main()
{rent();system("pause");return 0;
}

C语言—三子棋小游戏解析相关推荐

  1. C语言 三子棋小游戏

    因为代码有些多,所以使用了头文件来方便理解. void initial(char arr[ROW][COL],int row,int col) //初始化棋盘函数 { for(row=0;row< ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. ROS学习--第3篇:ROS基础---创建工作空间和软件包
  2. 32位 shell.efi x86_Ubuntu 20.04 LTS或不再支持32位x86 (i386)
  3. 关于在n-1的数组中找到那个被减去的数及异或与位与
  4. 终于等到放学了的飞鸽传书
  5. Windows下UEFI环境的搭建
  6. Java框架篇---spring aop两种配置方式
  7. D3 datumdata
  8. SSIS 连接ORACLE 无法从 SQL 命令中提取参数的解决方案
  9. C#中时间格式的转换
  10. BS 百度Blog的字节限制!!!!!!!!!
  11. 怎么打断点_孩子注意力不集中怎么办?7招提升儿童专注力,方法简单效果好...
  12. kubernetes英语怎么读_小学三年级英语怎么学
  13. struts2与json的整合
  14. 编程基本功:带着本子却不记录,你以为听懂了记住了,不可能的
  15. PDFcrack暴力破解pdf密码
  16. Frank Pfenning
  17. 《Python 深度学习》刷书笔记 Chapter 8 Part-2 用Keras 实现 DeepDream
  18. java 压缩文件夹有几率压缩失败,打开显示不可预料的末端且用其他专业软件解压文件没压缩完全
  19. java中ref是啥意思_java – web.xml中的resource-ref是什么用的?
  20. 软件园十年造就核心推动力

热门文章

  1. 新星计划Day7【数据结构与算法】 栈Part1
  2. iOS中获取相册、相机、定位、以及麦克风权限设置
  3. HTML搜索框-滑块-简单验证
  4. 因为计算机安装了更新i,电脑安装iTunes时提示这台电脑已安装了更高版本的解决方法图文教程...
  5. 高仿一个微信其实很简单-即时通讯so Easy
  6. C++GUI之wxWidgets(2)-hello,world
  7. 机器学习(书籍推荐)
  8. tpl怎么搞_TPL详解、使用
  9. 网管必备的一键快速修复电脑网络批处理命令
  10. CSS Day-12