免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 14235 | 回复: 39
打印 上一主题 下一主题

SCO、Linux下的shell五子棋小游戏。  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-02-06 09:21 |只看该作者 |倒序浏览
偶也尝试用shell编个简单小游戏:代码很笨拙,还不能人机对抗,但必竟能玩了。
sco、linux测试通过,linux效果更好些。其它系统未测。


  1. #!/bin/sh
  2. # Programname: five
  3. # Author: CLD
  4. # 2004.01
  5. #
  6. L()
  7. {
  8. # 屏幕任意位置
  9.   h=$1;l=$2
  10.   echo -n "[$h;$l;H"
  11. }

  12. ## 界面颜色控制变量
  13. white_b=""        # 白底黑字
  14. green_b=""        # 绿底黑字(移动棋字亮块)
  15. blue_b=""         # 兰底白字
  16. gray_b=""       # 灰底黑字
  17. gray_w=""       # 灰底白字
  18. black_w=""      # 黑底白字
  19. # 棋盘换色控制变量
  20. brown_b=""        # 桔黄底黑棋
  21. brown_w=""        # 桔黄底白棋
  22. mage_b=""         # 紫底黑棋
  23. mage_w=""         # 紫底白棋
  24. lt_blue_b=""    # 浅兰底黑棋
  25. lt_blue_w=""    # 浅兰底白棋

  26. kkk()
  27. {
  28. # 棋盘
  29.   L 1 22;echo "$gray_b                                  $black_w"
  30.   L 2 22;echo "$gray_b  ┏┯┯┯┯┯┯┯┯┯┯┯┯┯┓  $black_w"
  31.   L 3 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  32.   L 4 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  33.   L 5 22;echo "$gray_b  ┠┼┼╋┼┼┼┼┼┼┼╋┼┼┨  $black_w"
  34.   L 6 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  35.   L 7 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  36.   L 8 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  37.   L 9 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  38.   L 10 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  39.   L 11 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  40.   L 12 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  41.   L 13 22;echo "$gray_b  ┠┼┼╋┼┼┼┼┼┼┼╋┼┼┨  $black_w"
  42.   L 14 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  43.   L 15 22;echo "$gray_b  ┠┼┼┼┼┼┼┼┼┼┼┼┼┼┨  $black_w"
  44.   L 16 22;echo "$gray_b  ┗┷┷┷┷┷┷┷┷┷┷┷┷┷┛  $black_w"
  45.   L 17 22;echo "$gray_b                                  $black_w"
  46. }

  47. getchar()
  48. {
  49.   key=`stty -g`
  50.   stty -echo
  51.   stty raw
  52.   dd if=/dev/tty bs=1 count=1 2>/dev/null
  53.   stty -raw
  54.   stty echo
  55.   stty $key
  56. }
  57.         
  58. clear
  59. kkk
  60.   L 5 34;echo " 五 子 棋 "   
  61.   L 10 24;echo "┌────游戏○设定────┐"
  62.   L 11 24;echo "│                          │"
  63.   L 12 24;echo "│  1_白先走  2_黑先走 [ ]  │"
  64.   L 13 24;echo "│                          │"
  65.   L 14 24;echo "└─────────────┘"
  66.   L 12 48;echo -n
  67. goo=`getchar`
  68. case $goo in
  69.   1) go="白";ss=0;sss=0;;
  70.   2) go="黑";ss=1;sss=1;;
  71.   *) clear;exit;;
  72. esac
  73.   by=0;bs=0;bsy=0;hy=0;hs=0;hsy=0  #初始化输赢局数
  74. tput civis

  75. help()
  76. {
  77. L 16 3;echo "┏━━━━━━━┓"
  78. L 16 57;echo "┏━━━━━━━┓"
  79. L 17 3;echo "┃              ┃"
  80. L 17 57;echo "┃              ┃"
  81. L 18 3;echo "┃              ┃                                    ┃              ┃"
  82. L 19 3;echo "┃ 赢盘数:      ┃┏━━━━━"$gray_b" m---和为贵 "$black_w"━━━━━┓┃ 赢盘数:      ┃"
  83. L 20 3;echo "┃ 输盘数:      ┃┃ 友                          比 ┃┃ 输盘数:      ┃"
  84. L 21 3;echo "┃              ┃┃ 谊   "$white_b"Press c change color"$black_w"   赛 ┃┃              ┃"
  85. L 22 3;echo "┃              ┃┃ 第                          第 ┃┃              ┃"
  86. L 23 3;echo "┃ 最后成绩:    ┃┃ 一                          二 ┃┃ 最后成绩:    ┃"
  87. L 24 3;echo "┗━━━━━━━┛┗━━━━━━━━━━━━━━━━┛┗━━━━━━━┛"
  88. }

  89. init_(){   # 继续棋局初始化
  90. kkk >abc
  91. a1=2      
  92. a2=38
  93. b1=52
  94. b2=16
  95. write=$green_b$go$black_w
  96. cat abc
  97. L $a1 $a2;echo $write  # 棋子初始位置
  98. ccc=1  #改变颜色次数
  99. color1=`expr substr $gray_b 3 8`;color2=`expr substr $gray_w 3 8` #默认棋子颜色
  100. L 19 13;echo $by;L 19 68;echo $hy
  101. L 20 13;echo $bs;L 20 68;echo $hs
  102. L 23 15;echo $bsy"  ";L 23 70;echo $hsy"  "
  103. }
  104. init_
  105. help

  106. ## 棋子移动函数
  107. left(){    ##左移
  108. if [ $a2 -eq 24 ];then a2=24;else a2=`expr $a2 - 2`;fi
  109. sort -t"[" -n +1 abc
  110. L $a1 $a2;echo $write
  111. }
  112. right(){   ##右移
  113. if [ $a2 -eq $b1 ];then a2=$b1;else a2=`expr $a2 + 2`;fi
  114. sort -t"[" -n +1 abc
  115. L $a1 $a2;echo $write
  116. }
  117. down(){    ##下移
  118. if [ $a1 -eq $b2 ];then a1=$b2;else a1=`expr $a1 + 1`;fi
  119. sort -t"[" -n +1 abc
  120. L $a1 $a2;echo $write
  121. }
  122. up(){     ##上移
  123. if [ $a1 -eq 2 ];then a1=2;else a1=`expr $a1 - 1`;fi
  124. sort -t"[" -n +1 abc
  125. L $a1 $a2;echo $write
  126. }

  127. sy(){    # 继续棋局输方先走,统计输赢结果
  128. if [ $qs -eq 7 ];then
  129.   go="黑"      #如果白棋赢则下一盘黑先走
  130.   run="白"
  131.   bs=`expr $bs + 0`;by=`expr $by + 1`
  132.   bsy=`expr $by - $bs`
  133.   hy=$bs;hs=$by;hsy=`expr $hy - $hs`
  134. else
  135.   go="白"      #如果黑棋赢则下一盘白先走
  136.   run="黑"
  137.   hs=`expr $hs + 0`;hy=`expr $hy + 1`
  138.   hsy=`expr $hy - $hs`
  139.   by=$hs;bs=$hy;bsy=`expr $by - $bs`
  140. fi
  141. }

  142. sy1(){      # 显示输赢结果,统计棋局,询问是否继续  
  143. while true;do
  144.    L 19 13;echo $by;L 19 68;echo $hy
  145.    L 20 13;echo $bs;L 20 68;echo $hs
  146.    L 23 15;echo $bsy"  ";L 23 70;echo $hsy"  "
  147.    tput bel;tput bel
  148.    L 6 28;echo $white_b"                      "$black_w
  149.    L 7 28;echo $white_b"    "$run$1"!!!     "$black_w"  "$black_w
  150.    L 8 28;echo $white_b"   再来一盘否[y|n]?   "$black_w"  "$black_w
  151.    L 9 28;echo $white_b"                      "$black_w"  "$black_w
  152.    L 10 30;echo "                      "
  153. key=`getchar`
  154. case $key in
  155.   y)
  156.    init_
  157.    count=`expr $count + 1`
  158.    L 23 36;echo "第 $count 局"
  159.    break;;
  160.   n)
  161.    clear;cat abc
  162.    L 7 30;echo $blue_b"                  "$black_w   
  163.    L 8 30;echo $blue_b"    "!!!再见!!!"    "$black_w"  "$black_w
  164.    L 9 30;echo $blue_b"                  "$black_w"  "$black_w
  165.    L 10 30;echo $blue_b"  "Author: c1l2d3"  "$black_w"  "$black_w
  166.    L 11 30;echo $blue_b"                  "$black_w"  "$black_w
  167.    L 12 32;echo $black_w"                  "$black_w
  168.    tput cnorm
  169.    rm yyy;exit;;
  170.   *);;
  171. esac
  172. done
  173. }

  174. award()  #判断输赢函数
  175. {
  176. cat abc|sed -n 18,"$"p|awk -F";" '{print $1,$2,$4}'|sed 's/^..//' \
  177. |awk '{print $1,$2,substr($3,2,1)}' >yyy               # 计算输赢临时文件      
  178. grep "$qs$" yyy|sort -r -n +0 +1|awk '$2+=(NR*2)' \
  179. |uniq -c|awk '{print $1}'|grep '[5-9]' >/dev/null 2>&1
  180. if [ $? -eq 0 ];then sy;sy1 "棋赢啦!   ";fi            # 横连子>=5        
  181. grep "$qs$" yyy|sort -r -n +1|awk '$1+=NR' \
  182. |uniq -c|awk '{print $1}'|grep '[5-9]' >/dev/null 2>&1
  183. if [ $? -eq 0 ];then sy;sy1 "棋赢啦!   " ;fi           # 竖连子>=5      
  184. grep "$qs$" yyy|sort -r -n +0 +1|awk '$1=$1+$2/2'|sort -r -n \
  185. |awk '$2+=(NR*2)'|uniq -c|awk '{print $1}'|grep '[5-9]' >/dev/null 2>&1
  186. if [ $? -eq 0 ];then sy;sy1 "棋赢啦!   ";fi            # 右斜连子>=5
  187. grep "$qs$" yyy|sort -r -n +0 +1|awk '$1=$1-$2/2'|sort -r -n \
  188. |awk '$2+=(NR*2)'|uniq -c|awk '{print $1}'|grep '[5-9]' >/dev/null 2>&1
  189. if [ $? -eq 0 ];then sy;sy1 "棋赢啦!   ";fi            # 左斜连子>=5
  190. }

  191. count=1    #局数
  192. while true
  193. do
  194.   L 1 4;echo $white_b" 【执白方】 "$black_w
  195.   L 4 5;echo $gray_b" a---左移 "$black_w
  196.   L 6 5;echo $gray_b" d---右移 "$black_w
  197.   L 8 5;echo $gray_b" w---上移 "$black_w
  198.   L 10 5;echo $gray_b" s---下移 "$black_w
  199.   L 12 5;echo $gray_b" p---落子 "$black_w
  200.   L 14 5;echo $gray_b" ]---投降 "$black_w
  201.   L 1 62;echo $white_b" 【执黑方】 "$black_w
  202.   L 4 63;echo $gray_b" 4---左移 "$black_w
  203.   L 6 63;echo $gray_b" 6---右移 "$black_w
  204.   L 8 63;echo $gray_b" 8---上移 "$black_w
  205.   L 10 63;echo $gray_b" 5---下移 "$black_w
  206.   L 12 63;echo $gray_b" 9---落子 "$black_w
  207.   L 14 63;echo $gray_b" 0---投降 "$black_w
  208.   L 22 1;echo -n
  209.   L 23 36;echo "第 $count 局"
  210.   cc=`getchar`
  211. case $cc in
  212.   a|4)
  213.    if [ $ss -eq 0 ] && [ "$cc" = "a" ];then left;fi
  214.    if [ $ss -eq 1 ] && [ "$cc" = "4" ];then left;fi;;
  215.   d|6)
  216.    if [ $ss -eq 0 ] && [ "$cc" = "d" ];then right;fi
  217.    if [ $ss -eq 1 ] && [ "$cc" = "6" ];then right;fi;;
  218.   s|5)
  219.    if [ $ss -eq 0 ] && [ "$cc" = "s" ];then down;fi
  220.    if [ $ss -eq 1 ] && [ "$cc" = "5" ];then down;fi;;
  221.   w|8)
  222.    if [ $ss -eq 0 ] && [ "$cc" = "w" ];then up;fi
  223.    if [ $ss -eq 1 ] && [ "$cc" = "8" ];then up;fi;;
  224.   m)
  225.     run="此局和棋!    ";sy1;;
  226.   p|9)
  227.    if [ $ss -eq 0 ] && [ "$cc" = "p" ];then
  228.     sed -n 18,"$"p abc|grep "\[$a1;$a2" 2>&1  
  229.     if [ $? -eq 0 ];then L 10 32;echo "  此处已有棋...";tput bel;sleep 1
  230.       write=$green_b白$black_w
  231.       sss=0
  232.     else
  233.        mm=`L $a1 $a2`[$color2●$black_w
  234.       echo $mm>>abc
  235.       write=$green_b黑$black_w
  236.       sss=1
  237.     fi
  238.     sort -t"[" -n +1 abc
  239.     qs=7
  240.     award;tput bel   
  241.    fi
  242.    if [ $ss -eq 1 ] && [ "$cc" = "9" ];then
  243.     sed -n 18,"$"p abc|grep "\[$a1;$a2" 2>&1  
  244.     if [ $? -eq 0 ];then L 10 32;echo "  此处已有棋...";tput bel;sleep 1
  245.       write=$green_b黑$black_w
  246.       sss=1
  247.     else
  248.        mm=`L $a1 $a2`"[$color1●$black_w"
  249.       echo $mm>>abc
  250.       write=$green_b白$black_w
  251.       sss=0
  252.     fi
  253.     sort -t"[" -n +1 abc
  254.     qs=0
  255.     award;tput bel
  256.    fi
  257.     ss=$sss;;  # 落子方不允许再走,等待对方走棋
  258.   0|])
  259.     if [ "$cc" = "]" ];then go="白";run="白";bs=`expr $bs + 1`
  260.       by=`expr $by + 0`
  261.       bsy=`expr $by - $bs`
  262.       hy=$bs;hs=$by;hsy=`expr $hy - $hs`
  263.       sss=0
  264.     else go="黑";run="黑";hs=`expr $hs + 1`;hy=`expr $hy + 0`
  265.       hsy=`expr $hy - $hs`
  266.       by=$hs;bs=$hy;bsy=`expr $by - $bs`
  267.       sss=1
  268.     fi
  269.       ss=$sss  #谁投降谁下一局先走
  270.     sy1 "棋投降啦";;
  271.   c)
  272.     md=$ccc    # 变换棋盘颜色
  273.      if [ $md -eq 1 ];then
  274.       def1=`expr substr $gray_b 3 8`;def2=`expr substr $gray_w 3 8`
  275.       color1=`expr substr $brown_b 3 6`;color2=`expr substr $brown_w 3 6`
  276.       sed 's/'$def1'/'$color1'/g' abc|sed 's/'$def2'/'$color2'/g' >abc.tmp
  277.       mv abc.tmp abc
  278.       cat abc
  279.       ccc=`expr $ccc + 1`
  280.      fi    # 桔黄色
  281.      if [ $md -eq 2 ];then
  282.       def1=`expr substr $brown_b 3 6`;def2=`expr substr $brown_w 3 6`
  283.       color1=`expr substr $lt_blue_b 3 8`;color2=`expr substr $lt_blue_w 3 8`
  284.       sed 's/'$def1'/'$color1'/g' abc|sed 's/'$def2'/'$color2'/g' >abc.tmp
  285.       mv abc.tmp abc
  286.       cat abc
  287.       ccc=`expr $ccc + 1`
  288.      fi    # 浅蓝色
  289.      if [ $md -eq 3 ];then
  290.       def1=`expr substr $lt_blue_b 3 8`;def2=`expr substr $lt_blue_w 3 8`
  291.       color1=`expr substr $mage_b 3 6`;color2=`expr substr $mage_w 3 6`
  292.       sed 's/'$def1'/'$color1'/g' abc|sed 's/'$def2'/'$color2'/g' >abc.tmp
  293.       mv abc.tmp abc
  294.       cat abc
  295.       ccc=`expr $ccc - 3`
  296.      fi    # 紫色
  297.      if [ $md -eq 0 ];then
  298.       def1=`expr substr $mage_b 3 6`;def2=`expr substr $mage_w 3 6`
  299.       color1=`expr substr $gray_b 3 8`;color2=`expr substr $gray_w 3 8`
  300.       sed 's/'$def1'/'$color1'/g' abc|sed 's/'$def2'/'$color2'/g' >abc.tmp
  301.       mv abc.tmp abc
  302.       cat abc
  303.       ccc=`expr $ccc + 1`
  304.      fi    # 灰色
  305.      L 2 38;echo $write;;
  306.   esac
  307. done

复制代码

ccc.gif (12.72 KB, 下载次数: 199)

游戏界面图

游戏界面图

FIVE.gif

9.94 KB, 下载次数: 2085

源程序包

论坛徽章:
0
2 [报告]
发表于 2004-02-06 09:48 |只看该作者

SCO、Linux下的shell五子棋小游戏。

我靠高手!!!

论坛徽章:
0
3 [报告]
发表于 2004-02-06 09:48 |只看该作者

SCO、Linux下的shell五子棋小游戏。

女子弓虽口阿!丁页!

论坛徽章:
0
4 [报告]
发表于 2004-02-06 10:17 |只看该作者

SCO、Linux下的shell五子棋小游戏。

我考佩服!

论坛徽章:
0
5 [报告]
发表于 2004-02-06 10:25 |只看该作者

SCO、Linux下的shell五子棋小游戏。

强啊!

论坛徽章:
0
6 [报告]
发表于 2004-02-06 14:50 |只看该作者

SCO、Linux下的shell五子棋小游戏。

[quote]原帖由 "飞灰橙"]强啊![/quote 发表:


惭愧惭愧! 与俄罗斯方块相比真是不能同日而语呀!


感谢班长加精.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2004-02-06 16:19 |只看该作者

SCO、Linux下的shell五子棋小游戏。

我想问一下,你的棋盘中的格子是怎么画的,这些字符在linux下怎么打出来呀?

论坛徽章:
0
8 [报告]
发表于 2004-02-06 17:05 |只看该作者

SCO、Linux下的shell五子棋小游戏。

[quote]原帖由 "mars_wgj"]我想问一下,你的棋盘中的格子是怎么画的,这些字符在linux下怎么打出来呀?[/quote 发表:


我是在sco下用区位码画的。然后移到中文版Trubo linux上运行。
很奇怪,我看到你的问题后,在linux也没有找到区位输入法???不知别人是否知道。

------------------------------------------
又及:发现一个bug :

在# 横连子>=5的下一行:
grep "$qs$" yyy|sort -r -n +1|awk '$1+=NR' \  

这句改为:
grep "$qs$" yyy|sort -r -n +1 +0|awk '$1+=NR' \  

否则当竖连子>=5时不会判赢。 在此更正

论坛徽章:
0
9 [报告]
发表于 2004-02-06 21:28 |只看该作者

SCO、Linux下的shell五子棋小游戏。

ding~~!!!

论坛徽章:
0
10 [报告]
发表于 2004-02-06 22:19 |只看该作者

SCO、Linux下的shell五子棋小游戏。

试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP