用c语言实现简单的五子棋

这个小游戏是从零开始的实现的,框架灵感来自于小游戏《走迷宫》。

游戏代码配置: 二维数组+简单逻辑+getch读取键盘+windows函数(刷屏,改颜色,改窗口大小)

画面演示

<!--more-->

胜利画面

娱乐画面

整体代码

代码太长
移步paste

https://paste.ubuntu.com/p/PjwdHs7Vtq/


实现过程

o设计棋盘 |

o实现棋子选点下落|  (主要难点)

o设定交叉下棋|

o设定胜利规则|


■设计棋盘

搭建框架

char map[1000][1000]= {      "||==================================||",
                            "||   x     ||欢乐五子棋||     o   ||",
                            "||         ==============         ||",
                            "[====================================]",
                            "[[==================================]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[                                 ]]",
                            "[[==================================]]",
                            "[====================================]"
本来中间想用“ + ”填充就和棋盘一样,但太密了。就还是空格代替。

印象中五子棋棋盘应该是横竖线交纵的,但好像仅仅以键盘上的字符很难实现布线。尝试了各种符号填充(理论上'+'能实现但成像很花),jpg,最后选择了空格,视觉效果好点**

■实现棋子选点下落(如何下棋这是个大问题)

首先要在已有棋盘框架上下棋要解决以下几个问题

1.棋子在指定棋盘内

棋子要是下在外边可就不好判断了

2.棋子不可覆盖已有棋子

还记得玩贪吃蛇删了一些代码,结果边界被我给吃完了。

3.棋子能下在任何符合规定的棋盘内

因为一开始我设置棋子作为实体不可覆盖,那假若指针被棋子围起来了那该如何出去是个大问题。

1.一开始要构思一种控制选点下棋的思路
首先我考虑了

1.<鼠标确定下点>
这是最理想的方法,鼠标点一下,棋盘上就出现对应棋子,但问题在于就目前所学而言,鼠标来选点下棋太难实现。

于是马上转变另一种控制途径

2.<键盘控制虚拟指针来选点>
这里我不由的想起了《啊哈c》这本书最后的游戏教学部分:走迷宫小游戏。

这个小游戏实现wasd上下左右控制小球移动,并碰到“#”可判断不能执行移动。(简单的if判断该坐标是否为“#”而决定是否移动,这可以将#理解成实体了)

下面简单说下原理,自行可以了解下小球是如何移动的,并认清问题1.2为什么存在;

ch = getch();                     //获取键盘命令
       if ( ch == 's')           //下移
      {                        
           if( map[x+1][y]!= '#')//如果不是”#“那就能移动(#变成实体)
          {
               map[x][y] = ' ';  //原坐标还原空格
               x++;
               map[x][y] = 'o';  //更新下一坐标
          }  //看懂原理后就知道如果没有if判断
           //小球可以随意移动,并进过的地方都变成空格(即问题2)
      }

受此启发,假若把已有棋子和边界都设定不可触碰的实体,小球改成我所需要的“鼠标”,用wasd控制移动,设置键盘按下“L”为确认下棋,这样问题1.2就都完美解决了。(但此时你能想到让棋子也变成实体变成这样会造成什么大bug嘛-后文说明)

■实现交叉下棋

很简单的思路,如果我设定 键盘 “l”是下棋,那么每次按下 “l”后num++,下一步鼠标储存的棋子就在“x”,“o”间交换。

 while(num)                                     
  {                          
       if(num % 2 != 0)
           turn = 'x';      //用turn 保存状态,并依次转变
       else
           turn = 'o';
    xxxxxx程序 然后 num++;    
  }

###

本游戏的指针可视为走迷宫的小球 “o”,按下键盘的“L”即会在棋盘上留下“o”的痕迹并在下一次移动时变为另一个状态“x”即可实现交叉下棋于留下棋盘痕迹。

■设计胜利规则

走到这一步了,后面判断胜利就不用说啦,处理水平,垂直,斜线判断五子连珠的能力还是绰绰有余的。这里就不介绍了。

■后期找bug (这个游戏的灵魂。。)

此时看似理论已实现只需敲代码了,结果。。。

这个局面,假设鼠标指针在小圈圈外面,,那我要下里面呢。

问题来的很突然,也很致命,我要思考如何让鼠标移动进入实体围成的区域内。

但恰恰是这个问题让我想到个很巧的解决方法,

甚至实现了我预期外的效果。

解决如何思路如下

建立在上面小球移动原理上

我想到了一个用一个temp巧妙地存储指标所在坐标之前的状态的方法,

指标移动到一个新的坐标,先用temp储存坐标原有状态,再将指标存储在坐标上打印呈现出来(作为鼠标指针显示出来);

然后执行下一次移动时,将temp所存值还给原有坐标,新坐标重复规则。`

ch = getch();
       if ( ch == 's')         //下移
      {                       //turn是该次鼠标指针的状态('x' or 'o');
                  //此时除棋盘界线 棋盘上任何坐标都是可移动的
           if( map[x+1][y]!= '=' &&map[x+1][y]!= ']' &&map[x+1][y]!= '[')//防越界
          {
               map[x][y] = temp;   //原坐标恢复原来的状态
               x++; //移动x++到新的坐标
               temp = map[x][y];   //储存新的坐标的状态
               map[x][y] = turn;   //在新的坐标上打印鼠标
          }        
      }                         //可以对比上面小球移动原理观察temp的妙用

再在这个基础上加入按下”L“才能改变状态(下棋),这样下来,除了棋盘边界,每个位置都能访问,每一个

坐标状态都是可改动的(按下“L”更改状态即下棋,加上判断语句又可避免在原有基础上下棋),所以整个棋

盘都是稳定的动态状态。

然后猛然发现,这个temp本质不就是程序: a 与 b交换值的升级版嘛!!虽然原理简单,但这个仅仅靠巧妙的改动,

一下子全部解决了 3 大问题,也让我感觉打开了新世界大门。

后续

就此我的五子棋就搞完了。从有想法到做完也只用一天,想加入更多元素,但后面马上有了个更有趣的东西“折磨”了我两三天——搭建博客。从周二到周五三天,我忙前忙后,美化主题时在各种小问题上摔跤,三两次把我的博客搞崩溃,最终才在今天有空在原来五子棋基础上加入了一些细节。也写下了这篇文章。。。

这是2019.10.18 周五的晚上

回顾起来这周收获了很多,学了许多新东西。

做了个小游戏,在学长帮忙下用了hexo搭了一个满意的博客,周五还初步被c语言老师教了用linux系统写代码,晚上又用markdown写了一篇博客。

所以完成这篇博客这周的忙碌也告一阶段了。

希望下周也能很充实

希望后续能记录更多有趣的东西~

但好像一个星期没有碰过oj系统做题了。。。尴尬。周末赶快去刷刷题找找感觉。顺便补补其他科目。

用c语言实现简单的五子棋的更多相关文章

  1. 李洪强漫谈iOS开发[C语言-042]-简单计算器

    李洪强漫谈iOS开发[C语言-042]-简单计算器

  2. 谁说C语言很简单?

    前两天,Neo写了一篇<语言的歧义>其使用C语言讨论了一些语言的歧义.大家应该也顺便了解了一下C语言中的很多不可思异的东西,可能也是你从未注意到的东西. 是的,C语言并不简单,让我们来看看 ...

  3. Linux 用C语言实现简单的shell(2)

    不知不觉两周没有发文了,因为“一万美金的福特奖学金答辩”,ACM比赛,网络论文阅读和网络大作业一大堆事把时间冲散了,所以先写一篇博文补上之前一坑. 之前发了一篇关于linux 用C语言实现简单shel ...

  4. Java语言实现简单FTP软件------>FTP软件主界面的实现(四)

    首先看一下该软件的整体代码框架                        1.首先介绍程序的主入口FTPMain.java,采用了一个漂亮的外观风格 package com.oyp.ftp; im ...

  5. Java语言实现简单FTP软件------>源码放送(十三)

    Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...

  6. Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)

    1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...

  7. C语言,简单计算器【上】

    由于工作需要最近在研究PHP扩展,无可避免的涉及到了C语言.从出了学校以后C语言在实际工作中还没有用到过,所以必须要先进行一点复习工作.个人认为对于熟悉一样东西说最好的方法是上手实践.于是便想起了当时 ...

  8. 008_用go语言实现简单的冒泡排序

    冒泡排序是各个语言中的基本排序算法,本次我们用go语言实现简单的冒泡排序 package main import "fmt" // [13,10,5,7,2] // [10,13, ...

  9. 实验报告系列:实验一 HTML语言的简单网页制作

    实验一 HTML语言的简单网页制作 一.实验目的: 1.掌握常用的HTML语言标记: 2.利用文本编辑器建立HTML文档,制作简单网页. 3.学习将其它格式的文档转换成HTML格式的文档 二.实验内容 ...

随机推荐

  1. Mysql-SQL优化-子查询替代LEFT JOIN

    表A:批次信息表, 表B:实际批次明细表, Mysql版本:5.6.36 两表之间的数据体量差异:表B是表A的10000倍. 经过结转,表B通常保留 1千5百万数据.表A就是1千多条数据. 计算近24 ...

  2. 异数OS 织梦师-云(五)-- 容器服务化,绿色拯救未来。

    . 异数OS 织梦师-云(五)– 容器服务化,绿色拯救未来. 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652 ...

  3. MySql主要性能指标说明

    在项目当中数据库一般都会成为主要的性能与负载瓶颈,那么针对数据库各项性能指标的监控与对应的优化是开发与运维人员需要面对的主要工作,而且这部分的工作会贯穿项目从开发到运行的整个周期里. 这篇文章中我们对 ...

  4. [洛谷P2962] [USACO09NOV] 灯Lights

    Description Bessie and the cows were playing games in the barn, but the power was reset and the ligh ...

  5. tensorflow框架

    一.tensorflow的工作流程,实际上它体现出来的是一个”懒性“方法论 (1)构建一个计算图. (2)初始化变量 (3)创建一个会话 (4)在会话中运行图的计算 (5)关闭会话 二.神经网络搭建八 ...

  6. Java中SMB的相关应用

    目录 SMB 服务操作 Ⅰ SMB简介 Ⅱ SMB配置 2.1 Windows SMB Ⅲ 添加SMB依赖 Ⅳ 路径格式 Ⅴ 操作共享 Ⅵ 登录验证 SMB 服务操作 Ⅰ SMB简介 ​ SMB(全称 ...

  7. django cms 5月第一弹

    官方文档: ##http://django-cms.readthedocs.io/en/latest/index.html #截图 #生存的项目结构

  8. 创建认证提供器 安全性与收尾工作 精通ASP-NET-MVC-5-弗瑞曼

  9. 安装 Xen

    安装 Xen 安装支持 Xen 的相关工具: $ sudo apt-get install ubuntu-xen-server 下载和安装支持 Xen 的 Linux 内核: http://secur ...

  10. C#反射与特性(九):全网最全-解析反射

    目录 1,判断类型 1.1 类和委托 1.2 值类型 1.3 接口 1.4 数组 2, 类型成员 2.1 类 2.2 委托 2.3 接口 [微信平台,此文仅授权<NCC 开源社区>订阅号发 ...