【项目展示】自己用C语言编写的象棋小程序

1、前言

2017年应该是我迄今为止的人生当中最快乐的整年了(没有之一),虽然它也是我发誓这一年从头到尾都坚决不谈恋爱、坚决不找对象的一年。但,也许正因为如此,才让我的心灵没有了相思的羁绊,没有了虚妄的念头,从而发现了世界上除了儿女情长以外,还有更多更有意义、更有趣味、更有价值的美好事物吧!而这其中,就包括了3月份的时候,我在学校机房奋斗了三天三夜用C语言捣鼓出来的象棋小程序。
三天,九页A4纸。现在回过头来看,就对那句话颇感认同——真正令你快乐的,不是结果,而是过程。最后阶段看着BUG一个一个被改掉,测试表上面的项目一个一个通过,心里固然很高兴。但比这更让我的心中充满奇妙喜悦滋味的,是设计成功了一个又一个判定函数的算法的瞬间。一个你原本以为高不可攀的山峰,经过你的努力,也终于被你驯服。这一瞬间的自恋值真是爆表了,以致于都产生了幻觉:认为自己简直就是个天才,是这个世界上最聪明的人(just开个玩笑)——“仰天大笑出门去,我辈岂是蓬蒿人!”
而当时设计算法的草稿纸,我珍藏了将近4年,一直到租房期满搬家之前,都没舍得扔。但很可惜的是,最后搬家时,因为东西实在是太多了,才不得不选择性地带回了最最重要的几样东西,而把其他的全都忍痛割爱扔了——不管它刻录下了我怎样的美好时光。后来,由于一些原因,原本在CSDN只是一届潜水看客的我,也开始在这里的写博之旅了。于是灵光闪现——我能不能让自己以前写过的五子棋、汉诺塔、象棋等小程序的代码,在CSDN这片天地里得以永生呢?
但愿我今天写的所有程序,千百年后都能成为证明我曾经来到过这个世界上的化石吧!

2、程序规格

【外部规格】
界面表现形式:CUI

操作方法:通过WSAD键控制光标上下左右移动,按空格键选择或移动棋子。

对战形式:仅可进行双人单机对战,无法联网或人机对战。

胜负判定:程序无法自动判断绝杀或困毙,须棋手手动吃掉对方的将或帅,才判定胜负。将帅照面时,将或帅可以直接飞到对方的九宫里吃掉对方棋子。

犯规检测:本程序无用以检测是否存在长打犯规行为的功能。

回合制:否。当前版本暂时为一回合游戏。胜负分晓即结束游戏。

BUG情况:最新版本中暂未发现肉眼可见的BUG。

【内部规格】
开发所用语言:C语言

代码总行数:478行

函数总数:16个(包括main函数)

初版时间:2017年3月5日

此版时间:2021年4月23日

3、核心算法与象棋规则、术语

3.1 行棋规则与行棋判定函数设计

在这里,只考虑了红方棋子的情况,目的是为了让大家理解棋盘上的一些相对位置和线如何用数学语言去表达。至于黑方棋子的情况,由于这个博主很懒 为了给大家一个自己思考的机会,也为了文章更加简洁美观,在这里不作探讨。请有兴趣的同志自己思考补充完成。

3.1.0 象棋棋盘

象棋棋盘长这样。应该不会有人没见过吧?不会吧不会吧?
在这里插入图片描述

摆上棋子之后是这样滴。这是象棋布局的初始状态,这个记不住倒很正常。
在这里插入图片描述

河界:全称“楚河汉界”,是划分双方阵地的界限。过了河界就是对方阵地。
九宫:画斜线的地方的九个点叫九宫。将/帅和士只能在九宫内行棋,永远不可出宫(将帅照面的情况除外,此时将或帅可直接飞到对方九宫里吃掉对方的王)。

3.1.1 兵/卒

兵/卒的行棋规则
①兵卒全程禁止后退;
②兵卒每步只能走一格
③过河兵卒可横向行棋,没过河的只能前进
在这里插入图片描述在这里插入图片描述

兵/卒合法行棋条件的数学表达
{ ① 向 前 行 一 格   ( y 起 始 点 > 4 ) ① 向 前 行 一 格 ∨ ② 横 向 行 一 格   ( y 起 始 点 ≤ 4 ) \begin{cases}①向前行一格&\ (y_{起始点}>4)\\ ①向前行一格\lor②横向行一格&\ (y_{起始点}≤4) \end{cases} {  y4 y4

①向前行一格
y 起 始 点 − y 目 标 点 = 1   ∧   x 起 始 点 = x 目 标 点 y_{起始点}-y_{目标点}=1 \ \land \ x_{起始点}=x_{目标点} yy=1  x=x
②横向行一格
y 起 始 点 = y 目 标 点   ∧   ∣ x 目 标 点 − x 起 始 点 ∣ = 1 y_{起始点}=y_{目标点} \ \land \ |x_{目标点}-x_{起始点}|=1 y=y  xx=1

3.1.2 士

士的行棋规则
①士只可在九宫内行棋
②士只能斜向行棋,每次斜向一格
在这里插入图片描述

士合法行棋条件的数学表达
① 斜 向 行 一 格   ∧   ② 九 宫 内 行 棋 ①斜向行一格\ \land\ ②九宫内行棋   
①斜向行一格
∣ y 目 标 点 − y 起 始 点 ∣ = 1   ∧   ∣ x 目 标 点 − x 起 始 点 ∣ = 1 |y_{目标点}-y_{起始点}|=1\ \land\ |x_{目标点}-x_{起始点}|=1 yy=1  xx=1
②九宫内行棋
6 < y 目 标 点 < 10   ∧   2 < x 目 标 点 < 6 6<y_{目标点}<10\ \land\ 2<x_{目标点}<6 6<y<10  2<x<6

3.1.3 象

象的行棋规则
①象沿“田”字形对角线走(俗话说:马走日,象走田)
②象不能过河界
③当“田”字形中心点(象眼)受阻时,象不能移动。
在这里插入图片描述

象合法行棋条件的数学表达
① 沿 “ 田 ” 字 对 角 线 走   ∧   ② 象 眼 无 阻   ∧   ③ 不 能 过 河 ①沿“田”字对角线走\ \land\ ②象眼无阻\ \land\ ③不能过河 沿线    
①沿“田”字对角线走
∣ y 目 标 点 − y 起 始 点 ∣ = 2   ∧   ∣ x 目 标 点 − x 起 始 点 ∣ = 2 |y_{目标点}-y_{起始点}|=2\ \land\ |x_{目标点}-x_{起始点}|=2 yy=2  xx=2
②象眼无阻
点 ( y 目 标 点 + y 起 始 点

  • 32
    点赞
  • 131
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值