c#五子棋(使用简单的语法)


PS:本人学生一名,自学,没有项目经验,可能对程序的理解有误,有问题欢迎提出。
变量的名字有翻译,单击变量的右上角的数字,到文章的下面,有对变量的解释。理解之后,单击对应解释的后面回车键可回到刚刚阅读的地方。
欢迎大家去作者本人的B站的频道,观看相同的内容,拜托了,增加浏览量一下
https://www.bilibili.com/read/cv17308823
成果
上面就是我们的成品,只要看完能学会逻辑(大概吧 ( ̄ェ ̄;) )

画面

大小

五子棋的棋盘,形状近于正方形,15×15大小,共有225个交点,邻近两个交点的距离纵线约为2.5厘米,横线约为2.4厘米。
但是,我将棋盘的大小交给游玩的人自己决定,所以你可以在任意大小的长方形或正方形去游玩。
例如 3X9大小的 ,18X6大小的,7X7大小的
五子棋各种棋盘
等等之类的长方形,关键就是输入值给变量,但是输入的时候可能会输入空格(没有数字的意思),或者输入一个非法值(即0或负数)。
输入值这个过程分一下几步

  1. 判断是否是正常值(是,输入变量checkerboard_x_axis /checkerboard_y_axis 1 )/否,到下一步)
  2. 判断是否是为空(是,回到第一步,告诉用户输入空值,重新输入/否,到下一步)
  3. 判断是否是非法值(是,回到第一步,告诉用户输入非法值,重新输入)

这里不需要用其他的变量来操控,使用try语句,输入空值能被识别到,使用标签控制程序运行的位置。这里可以参考一下c#限制输入的值,它有多种方法,每一种都有对其判断值这个过程解释,这里就使用作者喜欢的方法。

while (checkerboard_line_numder)
{
    try
      {checkerboard_x_axis = Convert.ToInt32(Console.ReadLine());}
    catch
      {
          Console.WriteLine("输入为空,请重新输入");
          continue;
      }
          if (checkerboard_x_axis < 0)
          {
             Console.WriteLine("负值");
             Console.WriteLine("输入有误,请重新输入");
          }
          else
          {
            if (checkerboard_x_axis == 1)
              {
                 Console.WriteLine("地图的边界不能为1");
              }
            else
              {
                 Console.WriteLine("输入正确,棋盘的x轴已确认");
                 checkerboard_line_numder = false;
              }
      }
}

这里有一个新的变量叫checkerboard_line_numder2
提一点,int在声明时是不能输入空值(null),但是 int? 可以在声明时赋入空值(null),不过后面用到int时,需要添加强转。

棋盘

这里使用特殊的字符,来描绘棋盘,分别为┌ ┐└ ┘,├ ┤┬ ┴, ┼,●○
前面四个为角落,中间四个为边框,第三个空,即没有下棋的中间,第四个双方的棋子。这里用到的变量为checkerboard_x_axis ,checkerboard_y_axis 1,我们将棋盘划分为四个部分:横向,竖向,中间,棋子

边框

这里说一下。作者采用;两个for语句,去绘画,每一种字符有向对应的优先级,之后会对其说明。这里的就随便取的变量名字 i(横向),j(竖向)

  • 特殊的四个角: 这我把四个角单独拿出来,它可能会重复绘画,毕竟它位于横向和竖向的交界,即图中的橙色,而且角落的字符是特殊的┌ ┐└ ┘,所以不能把它给忽略。
  • 横向:用if去判断 i== 1 || i== checkerboard_x_axis 。当 i 为1时,说明为最上层的边框,同样 i 的值为checkerboard_x_axis,说明为最下层的边框。即图片中的红色,
  • 竖向:用if去判断 j== 1 || j== checkerboard_y_axis 。当 j 为1时,说明为最左层的边框,同样 j 的值为checkerboard_y_axis,说明为最右层的边框。即图片中的黄色。
    边框
内部
  • 棋子:棋子分两种实心圆●和空心圆○,一般来说,棋会下在棋盘上,所以这里用到一个二维数组coordinate3。棋盘上每一个位置就只有三种的状态,无子,先手,后手,可以用数值来表示状态,具体用什么数值由自己设定。不过之后在胜利条件判定的时候,需要用到。
  • 中间:通过文字就知道,这里的中间,就是什么都没有的空,就是没有子的状态 ( ┼)。
    先手和后手
综合为一体

这里引入两个变量map_x_ayis,map_y_ayis 4 ,这个方法是将棋盘上每一个位置的规律写出来,这样用两个for,就可以将棋盘每一个位置都显示出来。

        public void frame(int map_x_ayis, int map_y_ayis, int i, int j)
        {
            Boolean repeat = true;
            if ((i == 1 && j == 1) && repeat) { Console.Write("┌ "); repeat = false; }
            if (((i == 1 && j < map_y_ayis) && (j != 1)) && repeat) { Console.Write("┬ "); repeat = false; }
            if ((i == 1 && j == map_y_ayis) && repeat) { Console.Write("┐ "); repeat = false; }
            if ((i < map_x_ayis && j == 1) && (i != 1)) { Console.Write("├ "); repeat = false; }
            if (((i < map_x_ayis && j < map_y_ayis) && (i != 1 && j != 1)) && repeat) { Console.Write("┼ "); repeat = false; }
            if (((i < map_x_ayis && j == map_y_ayis) && (i != 1)) && repeat) { Console.Write("┤ "); repeat = false; }
            if ((i == map_x_ayis && j == 1) && repeat) { Console.Write("└ "); repeat = false; }
            if (((i == map_x_ayis && j < map_y_ayis) && (j != 1)) && repeat) { Console.Write("┴ "); repeat = false; }
            if ((i == map_x_ayis && j == map_y_ayis) && repeat) { Console.Write("┘ "); repeat = false; }
        }

落子

到这里就是,将画面完成了,即
输入棋子 的位置
按下回车键,得到下图的效果
在这里插入图片描述

Q:这样那棋子如何输出在棋盘里?
A:之所以是用方法,是为了表示没有子的位置。而coordinate[,]会记录每一个棋的位置,所以将他们相结合。
先判断coordinate[i,j]上有没有子,有子即输出,无子即使用frame(int map_x_ayis, int map_y_ayis, int i, int j) 这个方法,画出这个位置的特殊字符。
4:map_x_ayis,map_y_ayis 翻译:地图_x轴,地图_y轴,即地图的大小

Q:这里的输入空格会发生什么
A:会出一个报错,其实就是一个输入格式不正确的错,解决方法就是使用 try 这个语句,去检测到这个报错,然后就重新输入。这里跟上面输入边框同理。

Q:如果边框为5,但是我们输入6,也就是不在棋盘的位置,需要这么改?
A:其实就在原来的基础上,添加if判断即可

Q:如何切换两个棋子的输入
A:其实两个棋子的输入可以使用同一个,只要我们声明一个变量去控制先手和后手,就可以了,先判断变量,然后改变输入到coordinate的值。
输入为空的报错

胜利条件

胜利条件其实很简单,就是将所有情况,全部判断一遍,使用最笨的方法,但这个逻辑就是十分简单了。

横向

横向总共就五种情况,当棋子下在棋盘时,五个位置中是否能连成五子。下面是程序运行的过程

  1. 设这个棋子位于位置1,然后向右边判断,包括自己的,五颗棋子是否相同。判断是否相同,这个问题很简单,还记得这个数组吗?coordinate,它表示棋盘。if(coordinate[最新一步的列,最新一步的行+0~4],总共五个位置)是否相同,相同返回值,到结束画面,否则,到下一步
  2. 设这个棋子位于位置2,左右判断和第一步一个道理,if(coordinate[最新一步的列,最新一步的行+ -1 ~ 3 ],总共五个位置)是否相同,相同返回值,到结束画面,否则,到下一步
  3. 设这个棋子位于位置3,左右判断和第一步一个道理,if(coordinate[最新一步的列,最新一步的行+ -2 ~ 2 ],总共五个位置)是否相同,相同返回值,到结束画面,否则,到下一步
  4. 设这个棋子位于位置4,左右判断和第一步一个道理,if(coordinate[最新一步的列,最新一步的行+ -3 ~ 1 ],总共五个位置)是否相同,相同返回值,到结束画面,否则,到下一步
  5. 设这个棋子位于位置5,左右判断和第一步一个道理,if(coordinate[最新一步的列,最新一步的行+ -4 ~ 0 ],总共五个位置)是否相同,相同返回值,到结束画面,否则,判断完毕,到竖向,继续判断
    可能到这里一步有点懵,需要一段时间的理解,用通俗的话解释就是。

Ps : 这样做,有可能会判断到边缘,就边长只有6,但你下在4的位置时,程序会执行横向位置1是会报错,因为数组没有那么长,它右边就2个位置,明显位置不够。这个时候在if(coordinate[最新一步的列,最新一步的行+0~4],总共五个位置)是否相同 的前面加多一个if判断,判断够不够位置给他判,没有就没有了,毕竟位置都不够,就不可能连五子。

每一种胜利的条件都判断一次,先判断横向的情况,横向的情况就有五种,分别为:最前,稍前,中间,稍后,最后。coordinate相当于棋盘一样,每一个棋子都有一个属于自己的位置,判断最新的那一个棋子的左右位置,是否相同。是的话,返回值,否则就,继续判断
横向的五种情况

竖向

如果横向的胜利条件,已经理解的话,那竖向也是一样的。这个就小说一下。其实就是竖向的判断,即对最新子的位置从_横向变为竖向_。

斜向

斜向,有两种大的情况:左上角到右下角,右上角到左下角,然后两个大情况分别有五种情况,其实跟竖向和横向是一样的道理。

结束画面

结束画面

就像图上一样,过程就是:棋盘整个输出->发文字说明结束->是否开启下一局
这里就很简单了,毕竟结束画面可以自己随心所欲。
至于红色颜色提示五子相连,其实秘诀就是在上面的返回值。这个返回值,你可以用true/false,去判断是否成功。不过作者使用int整形类型,例如11,表示横向的位置1 是最后一子。22表示竖向的位置2,等等。

这里就说明下,假设最后一子的坐标【y,x】,通过推理,这里我们用11来解释。我们知道最后一步为位置1上,而前面的1说明是横向获得胜利,所以连五子的坐标为__【y,x】【y,x+1】【y,x+2】【y,x+3】【y,x+4】__,然后在输出棋盘的时候if判断,程序输出到上面五个坐标,改变颜色就可以了,记得在每次输出完后,将颜色改回正常的颜色。

欢迎大家去作者本人的B站的频道,观看相同的内容,拜托了,增加浏览量一下
https://www.bilibili.com/read/cv17308823


  1. checkerboard_x_axis 翻译:棋盘_x轴,游戏棋盘的行数,横向的长度
    checkerboard_y_axis 翻译:棋盘_y轴,游戏棋盘的列数,竖向的长度 ↩︎ ↩︎

  2. checkerboard_line_numder 翻译:棋盘_行_数字,当输入的值为正确值是,改变为false,即跳出循环,就不在重新赋值。 ↩︎

  3. coordinate 翻译:坐标,可以把它理解为棋盘,每一个坐标会记录该位置是否有子。如coordinate[2,3]=2;。即(2,3)这个位置是有子的,具体是先手还是后手,可以自己定,作者这里将 0 设为空(没有子)1 为先手,2为后手。这里三个数值代表每一个坐标的状态 (无子,先手,后手)。 ↩︎

  4. map_x_ayis 翻译:地图_x轴,就是地图的长度
    map_y_ayis 翻译:地图_y轴,就是地图的宽度 ↩︎ ↩︎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值