免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4296 | 回复: 18

休闲小游戏 [复制链接]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-12-15 15:47 |显示全部楼层
本帖最后由 yinyuemi 于 2011-12-16 01:28 编辑

一个小游戏:同色相消,算是提前送大家的节日小礼物吧
游戏设计非常简陋,感兴趣的可以添加mainpage,打分和时间限定等。
操作键:
上: [Ii]
下: [Kk]
左: [Jj]
右: [Ll]
确认:空格键
退出:[Qq]
  1. #!/bin/bash

  2. P1=10;P2=1
  3. P3=11;P4=31

  4. LENGTH=25
  5. HEIGHT=10;

  6. RED=41;
  7. GREEN=42;
  8. YELLOW=43;
  9. BLUE=44;
  10. MAGENTA=45;
  11. CYAN=46;
  12. WHITE=47;

  13. Color=(" " "RED" "GREEN" "YELLOW" "BLUE" "MAGENTA" "CYAN" "WHITE");

  14. function Moving_cursor ()
  15. {
  16.         stty cbreak -echo
  17.         dd if=/dev/tty bs=1 count=1 2>/dev/null
  18.         stty -cbreak echo
  19. }

  20. function Location_cursor()
  21. {
  22.         h=$1;l=$2
  23.         printf "\e[$h;$l;H"
  24. }

  25. function Choose ()
  26. {
  27.         x=0;y=0;fresh=0;
  28.         while true
  29.         do
  30.         case $(Moving_cursor) in
  31.         i|I)      printf "\e[1A";((y--));;  # Up
  32.         k|K)      printf "\e[1B";((y++));;  # Down
  33.         j|J)      printf "\e[1D";((x--));;  # Left
  34.         l|L)      printf "\e[1C";((x++));;  # Right
  35.                 " ")      break;; # Enter
  36.                 q|Q)          clear;exit;; # quit the game
  37.          esac
  38.         done
  39. }

  40. function game_view()
  41. {
  42.         local Col        
  43.         while :
  44.                 do
  45.                 random_c[$((LENGTH*$RANDOM/32767))]=${Color[$((1+$((${#Color[@]}-1))*$RANDOM/32767))]}
  46.                 [ ${#random_c[@]} = $LENGTH ] && break || continue
  47.         done
  48.                 for((i=1;i<=10;i++))
  49.                 do
  50.                    RANDOM_P $1
  51.                    [ $i = 1 ] && array_p=(${random_n[@]})||array_p=(${array_p[@]} ${random_n[@]})
  52.                    random_n=();
  53.                 done
  54.                 printf "%28s\e[32m%s\n\e[0m" " " "++++++++++++++++++++++++++++++++++++++++++++++++++++++"
  55.                 for((i=0;i<((LENGTH*HEIGHT));i++))
  56.                 do
  57.                         Col="${random_c[${array_p[$i]}]}"
  58.                         pos="$((i/10)),$((i%10))"
  59.                         if(($((((i+1))%LENGTH))==1))
  60.                                 then
  61.                                 printf "%28s\e[32m+\e[0m \e[0m\e[${!Col}m%2s\e[0m" " " "  ";
  62.                                 eval $(echo array_view${2}[$i]=${Col})
  63.                         elif(($((((i+1))%LENGTH))==0))
  64.                                 then
  65.                                 printf "\e[0m\e[${!Col}m%2s\e[0m \e[32m+\e[0m\n" "  ";
  66.                                 eval $(echo array_view${2}[$i]=${Col})                              
  67.                         else
  68.                                 printf "\e[0m\e[${!Col}m%2s\e[0m" "  ";
  69.                                 eval $(echo array_view${2}[$i]=${Col})
  70.                         fi
  71.                 done
  72.                 printf "%28s\e[32m%s\n\e[0m" " " "++++++++++++++++++++++++++++++++++++++++++++++++++++++"         
  73. }

  74. function RANDOM_P()
  75. {
  76.         random_n=();
  77.         n=$1;
  78.         local         index=0;
  79.         while :
  80.         do
  81.                 ((t=$n*$RANDOM/32767));
  82.                 if ! grep "\b$t\b" <(echo "${random_n[@]}") >/dev/null
  83.                 then
  84.                         random_n[$((index))]=$t
  85.                         ((index++))        
  86.                 fi
  87.                 [ ${#random_n[@]} = $n ] && break || continue
  88.                
  89.         done
  90. }

  91. function Color_decode(){
  92.         echo $(eval echo \${array_view${num}[$1]})
  93. }

  94. function if_seq(){
  95.         for i in $*
  96.         do
  97.                 [[ $i = "c" ]] || [[ $i = "nc" ]] && echo $i || echo $i $(Color_decode $i)
  98.         done |\
  99.         awk '
  100.         NR==1{C=$1;next}
  101.         NR==2{D=$2}
  102.         NF==2{a[$2]++;b[$2]=i++?b[$2]" "$1:$1}
  103.         END{p=0;
  104.                 if(C=="c"){if(a[D]>=2) {print b[D];p=1}}        
  105.                 else{for(i in a){if(a[i]>1) {print b[i];p=1}}}
  106.                 if(!p){print 0}
  107.         }'
  108. }

  109. function find_color(){
  110.         local dot_x=${1#*,}        dot_y=${1%,*}         
  111.     case $2 in
  112.         1)                for((i=$dot_x-1;i>=0;i--)); do if [[ $(Color_decode $((dot_y*LENGTH+i))) = "\" \"" ]]; then continue; else echo $((dot_y*LENGTH+i));break ;fi; done
  113.         ;;
  114.         2)                for((i=$dot_x+1;i<=$LENGTH;i++)); do if [[ $(Color_decode $((dot_y*LENGTH+i))) = "\" \"" ]]; then continue; else echo $((dot_y*LENGTH+i)); break ;fi; done
  115.         ;;
  116.         3)                for((j=1+$dot_y;j<=$HEIGHT;j++)); do if [[ $(Color_decode $((j*LENGTH+dot_x))) = "\" \"" ]]; then continue; else echo $((j*LENGTH+dot_x)); break ;fi; done
  117.         ;;
  118.         4)                for((j=$dot_y-1;j>=0;j--)); do if [[ $(Color_decode $((j*LENGTH+dot_x))) = "\" \"" ]]; then continue; else echo $((j*LENGTH+dot_x)); break ;fi; done
  119.         ;;
  120.         esac
  121. }


  122. function if_linking(){
  123.         local p=$1 current up down right left dot
  124.         ((current=${p%,*}*LENGTH+${p#*,}));
  125.         up=$(find_color $p 1)
  126.         down=$(find_color $p 2)
  127.         right=$(find_color $p 3)
  128.         left=$(find_color $p 4)
  129.         if [[ "$(Color_decode $current)" = "\" \"" ]]
  130.         then
  131.                 dot=$(if_seq "nc" $up $down $right $left) && [ "$dot" != 0 ] && echo -n $dot || echo -n 0;
  132.         else
  133.                 dot=$(if_seq "c" $current $up $down $right $left) && [ "$dot" != 0 ]  && echo -n $dot || echo -n 0;
  134.         fi
  135. }

  136. function play_game(){
  137.         local cursor_y=$P3 cursor_x=$P4 abs_x abs_y num  Ori
  138.         echo -e "\e[2J" #clear;
  139.         Location_cursor $P1 $P2
  140.         ((num++))
  141.         game_view $LENGTH $num
  142.         Location_cursor $P3 $P4        
  143.         
  144.         while :
  145.         do        
  146.                 Choose
  147.                 ((cursor_x=cursor_x+x,cursor_y=cursor_y+y))
  148.                 ((abs_x=((cursor_x-P4))/2,abs_y=cursor_y-P3))
  149.                 Ori="$abs_y,$abs_x";                 
  150.                 pr=$(if_linking $Ori);
  151.                 Location_cursor $cursor_y $cursor_x        
  152.                 if [[ $pr != ${pr/ /} ]]
  153.                 then
  154.                         for i in $(echo "${pr}")
  155.                         do
  156.                                 eval $(echo array_view${num}[$i]=\"\\\"  \\\"\")
  157.                                 ((cx=$((i%LENGTH))*2+P4))
  158.                                 ((cy=$((i/LENGTH))+P3))
  159.                                 Location_cursor $cy $cx && printf "\e[0m\e[40m  \e[0m";
  160.                         done
  161.                 fi
  162.                 Location_cursor $cursor_y $cursor_x        
  163.         done
  164. }

  165. play_game

复制代码
Screenshot.PNG

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 赞一个!

查看全部评分

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2011-12-15 16:14 |显示全部楼层
顶SS大作。

论坛徽章:
1
射手座
日期:2014-03-10 14:24:52
发表于 2011-12-15 17:02 |显示全部楼层
顶!

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2011-12-15 17:28 |显示全部楼层
顶一个,如此辛苦的挂上游戏,不但顶一个,我还加点分.呵呵

论坛徽章:
0
发表于 2011-12-15 17:34 |显示全部楼层

我好像没法评分了

论坛徽章:
0
发表于 2011-12-15 17:44 |显示全部楼层
支持!

论坛徽章:
0
发表于 2011-12-15 22:21 |显示全部楼层
楼主威武。

论坛徽章:
30
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3719周年集字徽章-19
日期:2019-08-27 13:31:2619周年集字徽章-CU
日期:2019-09-08 23:26:25
发表于 2011-12-15 22:41 |显示全部楼层
回复 5# ywlscpl


前段时间很多人为了乱评分的事情在站务瞎闹,管理员把评分权限给取消了。

论坛徽章:
0
发表于 2011-12-15 23:14 |显示全部楼层
厉害

论坛徽章:
0
发表于 2011-12-15 23:24 |显示全部楼层
膜拜.膜拜
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP