基于五子棋框架上的 象棋 小游戏

本游戏是上各种水课无聊时的产物。。。不参考现有游戏从零开始实现各项功能。

游戏配置:二维数组,循环系统,wasd基本移动,调整窗台的函数,以及富足的发呆时间。。

完整代码

代码已和五子棋整合在此链接中https://paste.ubuntu.com/p/HZBWXMWT8K/

github链接:https://github.com/404name/C-game

主体进展: (全部实现)

  1. o 搭建框架中

  2. o 实现全局指标移动

  3. o 实现中文(2个字符)同时移动

  4. o 实现象棋棋子取子与放回

  5. o 实现判断回合

  6. o 实现后台判断每一个棋子

  7. o 定义全局规则

  8. o 定义每一个棋子的规则

  9. o 调bug

<!--more-->

前言: 走迷宫 - 五子棋 -象棋

本游戏基于我之前做的   基于走迷宫的五子棋的游戏   之上,本质上都是靠基础的知识点穿插而成的。

五子棋是只下棋,象棋是先取后下,并且取棋子后台要能识别它是哪方的哪个棋,并根据规

则能正确下落在合法的点上。并且下落后判断游戏是否继续。

解决问题过程

1.凭空搭建一个一模一样的象棋棋盘模型

一步一步慢慢的敲与改进最后终于符合棋盘原样。(一开始''\' 就是打不出本来要放弃这个布局,后来记起书上说过转义符   )

2.实现取棋子和下棋

当我布置好棋盘,按好棋子,设置好移动距离调适时,一个惊人的现实摆在了我的面前——汉字占两个字节。这个时候,愁苦之时,发现我实现五子棋单个字符移动的原理(设置temp储存指针所在坐标状态,不改变情况下显示指针状态,指针移开恢复temp原坐标原状)只要设置两个temp和2个指针状态就能同时实现2个坐标的改变!!

ch = getch();
   if ( ch == 's')                     //下移
  {
       if( map[x+1][y]!= '-')
      {                                 //将要移动
           map[x][y] =temp;             //恢复移动前坐标状态
           map[x][y+1] = temp1;
           x = x + 2;                 //移动
           temp = map[x][y];         //储存新坐标状态  
           temp1 = map[x][y+1];
           map[x][y] = turn;    //turn即鼠标指针(拿起棋子)的状态
           map[x][y+1] = turn1;   //把鼠标指针状态打印在新的坐标上    
      }      
  }                            //后续选择移动   原坐标恢复,循环。
//后续选择下棋   将turn给temp 下一次移动时map则存储棋子并显现。
3.实现后台判断双方次序,与下棋;

按下 “L” 则num++

第一次按下  先手方取棋    num = 1;第二次按下   先手方下棋  num = 2;

第三次按下  后手方取棋    num = 3; 第四次按下  后手方下棋 num = 4;

设置规律4次一循环即可判断;

要是取了棋又放回呢?

  • printf 就是不允许悔棋。一开始我是这么想的,给自己找个理由偷懒。马上就想到了这样会某些特殊群体(马,相)容易卡死导致棋局作废。。

  • 被迫改进 取临时坐标 与 新坐标比较,判断放回则还是提醒下少悔棋,并num--回到上一步变成空鼠标状态继续选其他棋子。其实也蛮简单实现。。

4.实现取棋子的识别与判断是否可下棋(第一次没考虑,直接拿我的士吃了我的将军。。)

暴力循环判断法。。

char check—1【8】【3】={"车","马","象","士","将","炮","卒","+-"};    //这里的+-是棋盘上的空位
char check_—2【8】【3】={"俥","馬","相","仕","帥","軳","兵","+-"};

鼠标指针所在坐标的临时temp(原坐标棋子)循环比较一波就知道了,并且提示“这不是你的棋子喔” ,使取对方棋子的举动无效。再与后续规则合并可实现许多其他规则。

定义check函数判断是下棋点位是空位与对方棋子在符合棋子规则走法情况下则可下吃。

这里说下这里的妙处

  • 定义函数可在14种棋子规则移动后调用判断,缩短代码量。

  • 二维数组储存信息量是8,这里取棋时循环判断是否为己方7位(即棋子),下棋时判断是否是对方8位(即对方的棋子与空位)

5.定义每一个棋子的规则(伤脑筋的地方)(易到难)

每个棋子都是3个依次的判断:

o 是否改变坐标(比较)

o 是否符合该棋子规则(下面介绍)

o 终点是否可下棋(调用上面说的check函数)

  • 车:保证走直线, x,y仅能改变一个值,并且for循环新坐标到原坐标中间是否全是空格,是则终点进入check函数,判断可否执行。

  • 象:不能过河,那就简单设定7个可移动坐标点位,且保证每次只移动一个田字。且两次坐标中间坐标要为空格。

  • 士:同理“象”设定;

  • 将:同理“士”的设定;

  • 兵:河后只能向前,过河可前可左右

  • 马:走日字,判断走了2个单位的方向的正前方是否为空格。(判断卡马脚)

  • 炮:同理车的直线走法,若不跳跃则仅能走空格,若跳跃判断中间仅一个棋子,且落点必须是对方棋子。

其实实现起来会发现你怎样思考,都能用计算机取模拟出来,做出这个棋局规定很简单,但能不能让它高效的运行起来才是最困难的。最痛苦的还是debug过程,,因为这时候已经800多行了qwq。。。

还好思路没错,几乎没啥bug。

定义胜利规则

把 将 卡死在9个点位上,每次下棋后循环判断它是否在,

不存在:   对方胜利

存在: 判断是否对将

对将: 记录其坐标与对方的 帥的坐标对比,若x方向对上了,且这条直线上是否都为空格,则上把谁下的棋则谁输。

后续

不足之处

1.代码不够简洁

2.不能简单明了的区分双方棋子。(尝试了各种方法最后还是用简体字与繁体字区分)

3.ing

收获

1.看几百行的代码再也不头晕了。

2.灵活运用c语言可以实现好多实例。

3.还要提升c语言的准确表达做到更精简的写代码。

用C语言实现中国象棋的更多相关文章

  1. C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!

    中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史.由于用具简单,趣味性强,成为流行极为广泛的棋艺活动. 它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规 ...

  2. JavaScript中国象棋程序(0) - 前言

    “JavaScript中国象棋程序” 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.希望通过这个系列,我们对博弈程序的算法有一定的了解.同时,我们也将构建出一个不错的中国象棋程序 ...

  3. HTML5之中国象棋,附带源码!

    好久没写随笔了,好怀恋2013年的日子,因为现在不能回到过去了! 再见了 感谢你为我做的一切! 进入正题:HTML5之中国象棋 很小就会下象棋了,  这是象棋的测试地址:点击我吧   然后点击里面的象 ...

  4. C/C++游戏项目:中国程序员一定要会的中国象棋教程

    中国象棋是中国一种流传十分广泛的游戏. 下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘这块特定的战场上进行着象征性的军事战斗. 象棋,亦作"象碁&qu ...

  5. BZOJ 1801中国象棋 DP

    1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1426  Solved: 826[Submit][ ...

  6. C#中国象棋+游戏大厅 服务器 + 客户端源码

    来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...

  7. 中国象棋引擎的C#源代码

    以前写的中国象棋引擎的C#源程序,可在VS2010中编译运行,由于个人精力有限,难以完成后续的开发工作,如果谁感兴趣,请关注微信公众号(“申龙斌的程序人生”,ID:slbGTD),发送后台消息“象棋引 ...

  8. 1.2 中国象棋将帅问题进一步讨论与扩展:如何用1个变量实现N重循环?[chinese chess]

    [题目] 假设在中国象棋中只剩下将帅两个棋子,国人都知道基本规则:将帅不能出九宫格,只能上下左右移动,不能斜向移动,同时将帅不能照面.问在这样条件下,所有可能将帅位置.要求在代码中只能使用一个字节存储 ...

  9. 基于HTML5实现的中国象棋游戏

    棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...

随机推荐

  1. C# 调用word进程操作文档关闭进程

    C# 调用word进程操作文档关闭进程 作者:Jesai 时间:2018-02-12 20:36:23 前言: office办公软件作为现在主流的一款办公软件,在我们的日常生活和日常工作里面几乎每天都 ...

  2. Flask蓝图(Blueprint)

    一.作用 1.目录结构划分 2.url添加前缀 url_prefix 3.应用特殊装饰器,在该蓝图定义的特殊装饰器,只在改蓝图的起效 二.简单示例 1.创建一个项目文件 2.创建一个同名的python ...

  3. [洛谷 P5053] [COCI2017-2018#7] Clickbait

    Description 下图是一个由容器和管道组成的排水系统.对于这个系统,\(Slavko\) 想知道如果一直向容器1灌水,那么所有容器从空到充满水的顺序. 系统共有 \(K\) 个容器标号为1到 ...

  4. 【java面试】IO流

    一.IO 1.IO概念 ·输入流:把能够读取一个字节序列的对象称为输入流(百度百科) ·输出流:把能够写一个字节序列的对象称为输出流(百度百科) 从定义上看可能会让你感到困惑,这里解释一下:];    ...

  5. 演示共享布局 Demonstrating Shared Layouts 精通ASP-NET-MVC-5-弗瑞曼 Listing 5-10

  6. 一份中规中矩的 iOS笔试题

    一.背景 因为一些原因,我从公司离职,在此之前,我需要帮忙招聘一个新人来做我的工作,于是就有了这篇文章. 由于公司项目16年就已经上线了,前同事写的项目中,有用xib.storyBoard.代码自动布 ...

  7. DOCKER 学习笔记5 Springboot+nginx+mysql 容器编排

    前言 在上节的内容中,我们已经通过一个简单的实例,将Docker-compose 进行了实际的应用.这一小节中.我们将通过学习和了解,着重认识容器的编排,上一节只算是一个小小的测试.在这一节中.我们将 ...

  8. python笔记15

    今日内容 模块知识 内置模块 time datetime json 其他 内容回顾 & 作业题 重要知识点 构造字典和函数对应关系,避免重复的if else a=1 b=2 ==> a, ...

  9. 使用alpine制作最小化的JDK基础镜像

    注意:这里使用的是oracle的JRE,版本是1.8. 1.解压jre包,删除根目录下文本文件,然后删除其他不必要文件. #解压 tar xvcf jre-8u161-linux-x64.tar.gz ...

  10. python中更人性化的一个单元测试框架:nose2

    如果你学过 python 进行自动化测试,你一定使用过 unittest.今天我们要讲的 nose2 是一个高级版本的 unittest.他比 unittest 更容易理解,用起来也更加方便一些. 快 ...