免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 71713 | 回复: 131

[游戏娱乐] 【原创C|Go|C++|Shell版俄罗斯方块】(新算法、新思想、无限拓展) [复制链接]

论坛徽章:
0
发表于 2011-11-02 21:22 |显示全部楼层
本帖最后由 crulat 于 2013-12-01 22:25 编辑

Tetris Game  Version 7.1.4!

[由于论坛帖子字符个数的限制,以下代码拿掉了开头注释部分、show.matrix函数及其调用,完整代码请下载附件!]

  1. #!/bin/bash
  2. # Tetris Game  // The Art Of Shell Programming

  3. #########################################################################
  4. #                                                                       #
  5. #   License: Boost Ver 1.0+                                             #
  6. #   Project: https://github.com/yongye/c                                #
  7. #   Project: https://github.com/yongye/go                               #
  8. #   Project: https://github.com/yongye/cpp                              #
  9. #   Project: https://github.com/yongye/shell                            #
  10. #   Author : YongYe <complex.invoke@gmail.com>                          #
  11. #   Version: 7.1.4 11/01/2011 BeiJing China [Updated 12/01/2013]        #
  12. #                                                                       #
  13. #########################################################################

  14. box0=(4 30)
  15. box1=(4 30 4 32)
  16. box2=(4 30 5 32)
  17. box3=(4 28 4 30 4 32)
  18. box4=(4 28 4 30 5 30)
  19. box5=(4 28 5 30 6 32)
  20. box6=(4 30 5 28 5 32)
  21. box7=(4 28 5 30 6 32 7 34)
  22. box8=(4 30 5 28 5 30 5 32)
  23. box9=(4 30 5 28 5 32 6 30)
  24. box10=(4 28 4 30 4 32 4 34)
  25. box11=(4 28 5 28 5 30 5 32)
  26. box12=(4 28 4 30 5 30 5 32)
  27. box13=(4 28 4 30 5 28 5 30)
  28. box14=(4 28 4 34 5 30 5 32)
  29. box15=(4 26 4 28 4 30 4 32 4 34)
  30. box16=(4 30 5 28 5 30 5 32 6 30)
  31. box17=(4 28 4 32 5 30 6 28 6 32)
  32. box18=(4 28 4 32 5 28 5 30 5 32)
  33. box19=(4 28 4 30 5 30 6 30 6 32)
  34. box20=(4 28 5 28 6 28 6 30 6 32)
  35. box21=(4 28 4 30 5 30 5 32 6 32)
  36. box22=(4 26 4 34 5 28 5 30 5 32)
  37. box23=(4 26 4 34 5 28 5 32 6 30)
  38. box24=(4 26 5 28 6 30 7 32 8 34)
  39. box25=(4 28 4 32 5 26 5 30 5 34)
  40. box26=(4 28 4 34 5 30 5 32 6 30 6 32 7 28 7 34)
  41. box27=(4 30 5 28 5 32 6 26 6 30 6 34 7 28 7 32 8 30)
  42. box28=(4 30 5 28 5 30 5 32 6 26 6 28 6 30 6 32 6 34 7 28 7 30 7 32 8 30)
  43. box29=(4 30 5 30 6 28 6 30 6 32 7 26 7 30 7 34 8 30 9 30 10 30 11 30 12 30)
  44. box30=(4 26 4 28 4 30 4 34 5 30 5 34 6 26 6 28 6 30 6 32 6 34 7 26 7 30 8 26 8 30 8 32 8 34)
  45. box31=(4 30 5 28 6 26 6 34 7 28 7 32 7 36 8 22 8 30 8 38 9 24 9 28 9 32 10 26 10 34 11 32 12 30)

  46. unit=[]
  47. toph=3
  48. modw=4
  49. scorelevel=0
  50. width=${5:-25}
  51. height=${6:-30}
  52. prelevel=${3:-6}
  53. speedlevel=${4:-0}
  54. BOX=(box{0..31}[@])
  55. ((width=width<17?25:width))
  56. ((height=height<10?30:height))
  57. ((lower=height+toph))
  58. ((wthm=2*width+modw))
  59. ((dist=modw+wthm+3))
  60. ((prelevel=prelevel<1?6:prelevel))
  61. ((speedlevel=speedlevel>30?0:speedlevel))
  62. gmover="\e[?25h\e[36;26HGame Over!\e[0m\n"
  63. color=(1\;{30..38}\;{40..48}m {38,48}\;5\;{0..255}\;1m)

  64. sig.trans(){ kill -${1} ${pid}; }
  65. get.check(){ (( ! box_map[index] )) && k=1; }
  66. get.piece(){ box=(${!BOX[RANDOM%runlevel]}); }
  67. run.initi(){ box_map[index]=0; box_color[index]=""; }
  68. get.erase(){ printf "${old_shadow//${unit}/  }\e[0m\n"; }
  69. get.resum(){ stty ${oldtty}; printf "\e[?25h\e[36;4H\n"; }
  70. cmp.coord(){ (( ${1} <= ${2} )) && { ((${5})); (( ${3} < ${4} )) && ((${6})); }; }
  71. run.prbox(){ old_shadow="${cur_shadow}"; printf "\e[${cur_color}${cur_shadow}\e[0m\n"; }
  72. run.level(){ lhs=${#BOX[@]}; rhs=${1:-$((lhs-1))}; ((runlevel=(rhs < 0 || rhs > lhs-1)?lhs:rhs+1)); }
  73. run.leave(){ (( ! ${#} )) && printf "${gmover}" || { (( ${#}%2 )) && sig.trans 22; get.resum; }; exit; }
  74. get.stime(){ (( ${1} == ${2} )) && { ((++${3})); ((${1}=0)); }; Time[${4}]=$((${!1}/10))$((${!1}%10)); }

  75. max.vertical.coordinate()
  76. {
  77.    local i col row val
  78.    for ((i=0; i!=${#box[@]}; i+=2)); do
  79.          ((val=box[i+1]))
  80.          if (( col[val] < box[i] )); then
  81.                ((col[val]=box[i]))
  82.                row[val]="${col[val]} ${val}"
  83.          fi
  84.    done
  85.    max=(${row[@]})
  86. }

  87. get.update()
  88. {
  89.    pos="\e[${i};${j}H"
  90.    (( ! box_map[index] )) && printf "${pos}  " || printf "${pos}\e[${box_color[index]}${unit}\e[0m"
  91. }

  92. ini.loop()
  93. {
  94.    local i j k l index
  95.    for ((i=modw,j=6,l=wthm; i<=lower; j+=2)); do
  96.          k=0; ((index=(i-modw)*width+j/2-toph)); ${1}
  97.          if (( k || j == l )); then
  98.                (( ! k )) && ${2}
  99.                j=modw; ((++i))
  100.          fi
  101.    done
  102. }

  103. map.piece()
  104. {
  105.    local j p q u
  106.    ((++line))
  107.    for ((j=i,u=6; j>toph+1; u+=2)); do
  108.          ((p=(j-modw)*width+u/2-toph)); ((q=p-width))
  109.          ((box_map[p]=box_map[q])); box_color[p]="${box_color[q]}"
  110.          (( u == l )) && { u=modw; ((--j)); }
  111.    done
  112.    for ((u=6; u<=l; u+=2)); do
  113.          box_map[u/2-toph]=0
  114.          box_color[u/2-toph]=""
  115.    done
  116. }

  117. get.preview()
  118. {
  119.    local i col cur_box
  120.    cur_box=(${!1})
  121.    for ((i=0; i!=${#cur_box[@]}; i+=2)); do
  122.          ((col=cur_box[i+1]-(${3}-dist)))
  123.          cur_preview_block+="\e[$((cur_box[i]-1));${col}H${unit}"
  124.    done
  125.    printf "${!2//${unit}/  }\e[${!4}${cur_preview_block}\e[0m\n"
  126. }

  127. pipe.piece()
  128. {
  129.    cur_preview_block=""
  130.    (( ${5} )) && {
  131.    get.piece
  132.    eval ${1}="(${box[@]})"
  133.    cur_color="${color[RANDOM%${#color[@]}]}"
  134.    eval ${6}=\"${cur_color}\"
  135.    get.preview box[@] ${3} ${4} cur_color
  136.    } || {
  137.    eval ${1}="(${!2})"
  138.    eval ${6}=\"${!7}\"
  139.    get.preview ${2} ${3} ${4} ${7}
  140.    }
  141.    eval ${3}=\"${cur_preview_block}\"
  142. }

  143. get.invoke()
  144. {
  145.    local i arya aryb
  146.    for ((i=0; i!=prelevel-1; ++i)); do
  147.          arya=(next_preview_piece${i} next_preview_piece$((i+1))[@] old_preview_block${i})
  148.          aryb=($((12*(2-i))) ${1} next_preview_color${i} next_preview_color$((i+1)))
  149.          pipe.piece ${arya[@]} ${aryb[@]}
  150.    done
  151. }

  152. show.piece()
  153. {
  154.    local end cur_preview_block
  155.    ((end=prelevel-1))
  156.    cur_color="${next_preview_color0}"
  157.    preview_box=(${next_preview_piece0[@]})
  158.    get.invoke ${#}
  159.    cur_preview_block=""
  160.    get.piece
  161.    eval next_preview_piece${end}="(${box[@]})"
  162.    eval next_preview_color${end}=\"${color[RANDOM%${#color[@]}]}\"
  163.    get.preview box[@] old_preview_block${end} $((12*(2-end))) next_preview_color${end}
  164.    eval old_preview_block${end}=\"${cur_preview_block}\"
  165.    box=(${preview_box[@]})
  166. }

  167. draw.piece()
  168. {
  169.    (( ${#} )) && {
  170.       get.piece
  171.       cur_color="${color[RANDOM%${#color[@]}]}"
  172.       coor.dinate box[@]
  173.    } || {
  174.    cur_color="${next_preview_color0}"
  175.    coor.dinate next_preview_piece0[@]
  176.    }
  177.    run.prbox
  178.    if ! move.piece; then
  179.         kill -22 ${PPID}
  180.         sig.trans 22
  181.         run.leave
  182.    fi
  183. }

  184. top.point()
  185. {
  186.    local i u v x y
  187.    ((u=cur_box[0]))
  188.    ((v=cur_box[1]))
  189.    for ((i=0; i!=${#cur_box[@]}; i+=2)); do
  190.          cmp.coord x cur_box[i] y cur_box[i+1] x=cur_box[i] y=cur_box[i+1]   
  191.          cmp.coord cur_box[i] u cur_box[i+1] v u=cur_box[i] v=cur_box[i+1]
  192.    done
  193.    if (( x-u == 3 && y-v == 6 )); then
  194.          cur_box=($((x-3)) $((y-6)) $((x-3)) ${y} ${x} $((y-6)) ${x} ${y})
  195.    fi
  196. }

  197. run.bomb()
  198. {
  199.    local j p q boolp boolq empty index radius
  200.    radius=(x-1 y-2 x-1 y x-1 y+2 x y-2 x y x y+2 x+1 y-2 x+1 y x+1 y+2)
  201.    for ((j=0; j!=${#radius[@]}; j+=2)); do
  202.          ((p=radius[j]))
  203.          ((q=radius[j+1]))
  204.          ((index=(p-modw)*width+q/2-toph))
  205.          ((boolp=(p > toph && p <= lower)))
  206.          ((boolq=(q <= wthm && q > modw+1)))
  207.          if (( boolp && boolq )); then
  208.                (( ! box_map[index] && p+q != x+y && ${1} != 8 )) && continue
  209.                empty+="\e[${p};${q}H\040\040"
  210.                run.initi
  211.          fi
  212.    done
  213.    sleep 0.03; printf "${empty}\n"
  214. }

  215. random.piece()
  216. {
  217.    local i j k l
  218.    ((++count))
  219.    ((l=height-1))
  220.    for ((i=0,j=6; i!=count; j+=2)); do
  221.          ((k=(l-i)*width+j/2-toph))
  222.          (( j == wthm )) && { j=modw; ((++i)); }
  223.          (( RANDOM%2 )) && { box_map[k]=1; box_color[k]="${color[RANDOM%${#color[@]}]}"; }
  224.    done
  225.    (( count == l )) && count=0
  226. }

  227. del.row()
  228. {
  229.    local i x y len num index line cur_box
  230.    cur_box=(${locus[@]})
  231.    len=${#cur_box[@]}
  232.    (( len == 16 )) && top.point
  233.    for ((i=0; i!=${#cur_box[@]}; i+=2)); do
  234.          ((x=cur_box[i]))
  235.          ((y=cur_box[i+1]))
  236.          (( len == 16 )) && run.bomb ${#cur_box[@]} || {
  237.             ((index=(x-modw)*width+y/2-toph))
  238.             ((box_map[index]=1))
  239.             box_color[index]="${cur_color}"
  240.          }
  241.    done
  242.    line=0
  243.    ini.loop get.check map.piece
  244.    (( ! line )) && return 1
  245.    ((num=line*200-100))
  246.    printf "\e[1;34m\e[$((toph+10));$((dist+49))H$((scorelevel+=num))\e[0m\n"
  247.    if (( scorelevel%5000 < num && speedlevel < 30 )); then
  248.          random.piece
  249.          printf "\e[1;34m\e[$((toph+10));$((dist+30))H$((++speedlevel))\e[0m\n"
  250.    fi
  251.    ini.loop get.update
  252. }        

  253. get.ctime()
  254. {
  255.    local d h i j k m s line Time color
  256.    trap "run.leave" 22
  257.    ((d=0, h=0, m=0, s=0))
  258.    ((j=width-9))
  259.    for ((k=0; k!=j; ++k)) { line+=-; }
  260.    color="\e[1;33m"
  261.    printf "\e[2;6H${color}${line}[Time \e[2;$((23+j))H${color}]${line}\e[0m\n"
  262.    while :; do
  263.          sleep 1 &
  264.          get.stime s 60 m 0
  265.          get.stime m 60 h 1
  266.          get.stime h 24 d 2
  267.          Time[3]=$((d/10))$((d%10))
  268.          printf "\e[2;$((12+j))H${color}${Time[3]}:${Time[2]}:${Time[1]}:${Time[0]}\e[0m\n"
  269.          wait; ((++s))
  270.    done
  271. }

  272. per.sig()
  273. {
  274.    local i j pid sig sigswap
  275.    pid=${1}
  276.    for i in {23..31}; do
  277.          trap "sig=${i}" ${i}
  278.    done
  279.    trap "sig.trans 22; run.leave" 22
  280.    while (( ++j )); do
  281.          (( j != 1 )) && sleep 0.02
  282.          sigswap=${sig}
  283.          sig=0
  284.          case ${sigswap} in
  285.          23)  per.transform   -1                  ;;
  286.          24)  per.transform    1                  ;;
  287.          25)  per.transform   -2                  ;;
  288.          26)  per.transform    1/2                ;;
  289.          27)  per.transform    0             -2   ;;
  290.          28)  per.transform    0              2   ;;
  291.          29)  per.transform    1              0   ;;
  292.          30)  per.transform   -1              0   ;;
  293.          31)  per.transform    $(drop.bottom) 0   ;;
  294.          esac
  295.          (( j == 31-speedlevel )) && { per.transform  1  0; j=0; }
  296.    done
  297. }

  298. get.sig()
  299. {
  300.    local pid sig key arry escape oldtty
  301.    printf "\e[?25l"
  302.    pid=${1}; arry=(0 0 0)
  303.    escape="$(printf "\e")"; oldtty="$(stty -g)"
  304.    trap "run.leave 0" INT TERM; trap "run.leave 0 0" 22
  305.    while read -s -n 1 key; do
  306.          arry[0]=${arry[1]}; arry[1]=${arry[2]}
  307.          arry[2]=${key}; sig=0
  308.          if   [[ ! "${key}" ]]; then sig=31      
  309.          elif [[ "${key}${arry[1]}" == "${escape}${escape}" ]]; then run.leave 0
  310.          elif [[ "${arry[0]}" == "${escape}" && "${arry[1]}" == "[" ]]; then
  311.                  case ${key} in
  312.                  A)    sig=23         ;;
  313.                  B)    sig=29         ;;
  314.                  D)    sig=27         ;;
  315.                  C)    sig=28         ;;
  316.                  esac
  317.          else
  318.                  case ${key} in
  319.                  W|w)  sig=23         ;;
  320.                  T|t)  sig=24         ;;
  321.                  M|m)  sig=25         ;;
  322.                  N|n)  sig=26         ;;
  323.                  S|s)  sig=29         ;;
  324.                  A|a)  sig=27         ;;
  325.                  D|d)  sig=28         ;;
  326.                  U|u)  sig=30         ;;
  327.                  P|p)  sig.trans  19  ;;
  328.                  R|r)  sig.trans  18  ;;
  329.                  Q|q)  run.leave   0  ;;
  330.                  esac
  331.          fi
  332.                  (( sig != 0 )) && sig.trans ${sig}
  333.    done
  334. }

  335. drop.bottom()
  336. {  
  337.    local i j col max row
  338.    max.vertical.coordinate
  339.    for ((i=0,j=0; i!=height; j+=2)); do
  340.          ((row=(max[j]+i == lower)))
  341.          ((col=box_map[(max[j]+i-toph)*width+max[j+1]/2-toph]))
  342.          (( col || row )) && { echo ${i}; return 0; }
  343.          (( j+2 == ${#max[@]} )) && { j=-2; ((++i)); }
  344.    done
  345. }

  346. move.piece()
  347. {
  348.    local i j x y boolx booly index
  349.    len=${#locus[@]}
  350.    for ((i=0; i!=len; i+=2)); do   
  351.          ((x=locus[i]+dx))
  352.          ((y=locus[i+1]+dy))
  353.          ((index=(x-modw)*width+y/2-toph))
  354.          (( index < 0 || index > width*height-1 )) && return 1
  355.          ((boolx=(x <= toph || x > lower)))
  356.          ((booly=(y >= wthm+2 || y <= modw+1)))
  357.          (( boolx || booly )) && return 1
  358.          if (( box_map[index] )); then
  359.                if (( len == 2 )); then
  360.                      for ((j=lower; j>x; --j)); do
  361.                            (( ! box_map[(j-modw)*width+y/2-toph] )) && return 0
  362.                      done
  363.                fi
  364.                return 1
  365.          fi
  366.    done
  367.    return 0  
  368. }

  369. ghost.cross()
  370. {
  371.    local i j index
  372.    ((i=locus[0]))
  373.    ((j=locus[1]))
  374.    ((index=(i-modw)*width+j/2-toph))
  375.    (( box_map[index] )) && printf "\e[${i};${j}H\e[${box_color[index]}${unit}\e[0m\n"
  376. }

  377. coor.dinate()
  378. {
  379.    local i
  380.    locus=(${!1})
  381.    for ((i=0; i!=${#locus[@]}; i+=2)); do   
  382.          cur_shadow+="\e[${locus[i]};${locus[i+1]}H${unit}"
  383.    done
  384. }

  385. get.optimize()
  386. {
  387.    for j in dx dy; do
  388.          (( j )) && { [[ ${j} == dx ]] && k=i || k=i+1; add.box; }
  389.    done
  390. }

  391. add.box()
  392. {
  393.    for ((i=0; i!=${#new_box[@]}; i+=2)); do
  394.          ((new_box[k]+=j))
  395.    done
  396. }

  397. per.plus()
  398. {
  399.    local i j k
  400.    (( len == 2 )) && ghost.cross
  401.    new_box=(${box[@]})
  402.    get.optimize
  403.    coor.dinate new_box[@]
  404.    box=(${new_box[@]})
  405. }

  406. get.move()
  407. {
  408.    if move.piece; then
  409.         get.erase
  410.         per.plus
  411.         run.prbox
  412.    else
  413.         (( dx == 1 )) && {
  414.         del.row  
  415.         draw.piece
  416.         show.piece
  417.         }
  418.    fi
  419. }

  420. mid.point()
  421. {
  422.    local len mid
  423.    mid=(${!1})
  424.    ((len=${#mid[@]}/2-(${#mid[@]}%4)/2))
  425.    ((${2}=mid[len]))
  426.    ((${3}=mid[len+1]))
  427. }

  428. per.multiple()
  429. {
  430.    local i mid cur_box
  431.    mid=(${!1})
  432.    cur_box=(${!1})
  433.    for ((i=0; i!=${#mid[@]}-2; i+=2)); do
  434.          ((mid[i+3]=mid[i+1]+(cur_box[i+3]-cur_box[i+1])${2}2))
  435.    done
  436.    new_box=(${mid[@]})
  437. }

  438. run.unique()
  439. {
  440.    local i col mid row
  441.    declare -A mid
  442.    for ((i=0; i!=${#new_coordinate[@]}; i+=2))
  443.    {
  444.          ((row=new_coordinate[i]))
  445.          ((col=new_coordinate[i+1]))
  446.          mid[${row}::${col}]="${row} ${col}"
  447.    }
  448.    new_coordinate=(${mid[@]})
  449. }

  450. coordinate.transformation()
  451. {
  452.    local i                                              # row=(x-m)*zoomx*cos(a)-(y-n)*zoomy*sin(a)+m
  453.    for ((i=0; i!=${#new_box[@]}; i+=2)); do             # col=(x-m)*zoomx*sin(a)+(y-n)*zoomy*cos(a)+n
  454.          ((new_coordinate[i]=m+new_box[i+1]-n))         # a=-pi/2 zoomx=+1 zoomy=+1 dx=0 dy=0
  455.          ((new_coordinate[i+1]=(new_box[i]-m)*${dx}+n)) # a=-pi/2 zoomx=-1 zoomy=+1 dx=0 dy=0
  456.    done                                                 # a=+pi/2 zoomx=+1 zoomy=-1 dx=0 dy=0
  457.    [[ ${dx} == 1/2 ]] && run.unique
  458. }

  459. mid.plus()
  460. {
  461.    local i j k dx dy
  462.    ((dx=mp-p))
  463.    ((dy=nq-q))
  464.    get.optimize
  465. }

  466. per.abstract()
  467. {
  468.    per.multiple ${1} "${2}"
  469.    mid.point new_box[@] ${3} ${4}
  470. }

  471. per.rotate()
  472. {     
  473.    local m n p q mp nq new_coordinate
  474.    mid.point box[@] mp nq
  475.    per.abstract box[@] "/" m n
  476.    coordinate.transformation; dx=0
  477.    per.abstract new_coordinate[@] "*" p q
  478.    mid.plus; locus=(${new_box[@]})
  479.    if move.piece; then
  480.        get.erase; coor.dinate new_box[@]
  481.        run.prbox; box=(${locus[@]})
  482.    else
  483.        locus=(${box[@]})
  484.    fi
  485. }

  486. per.transform()
  487. {
  488.    local dx dy len new_box cur_shadow
  489.    dx=${1}
  490.    dy=${2}
  491.    case ${#} in
  492.    2) get.move   ;;
  493.    1) per.rotate ;;
  494.    esac
  495. }

  496. show.board()
  497. {
  498.    clear
  499.    boucol="\e[38;5"
  500.    ((colour=RANDOM%145+6))
  501.    for ((i=6; i<=wthm; i+=2)); do
  502.          printf "${boucol};$((colour+i));1m\e[${toph};${i}H==${boucol};$((colour+i+25));1m\e[$((lower+1));${i}H==\e[0m\n"
  503.    done
  504.    for ((i=toph; i<=lower+1; ++i)); do
  505.          printf "${boucol};$((colour+i));1m\e[${i};${modw}H||${boucol};$((colour+i+30));1m\e[${i};$((wthm+2))H||\e[0m\n"
  506.    done
  507. }

  508. show.notify()
  509. {
  510.    printf "\e[1;31m\e[$((toph+9));${dist}HRunLevel\e[1;31m\e[$((toph+9));$((dist+15))HPreviewLevel\e[0m\n"
  511.    printf "\e[1;31m\e[$((toph+9));$((dist+30))HSpeedLevel\e[1;31m\e[$((toph+9));$((dist+49))HScoreLevel\e[0m\n"
  512.    printf "\e[1;34m\e[$((toph+10));$((dist+49))H${scorelevel}\e[1;34m\e[$((toph+10));$((dist+30))H${speedlevel}\e[0m\n"
  513.    printf "\e[1;34m\e[$((toph+10));${dist}H$((runlevel-1))\e[1;34m\e[$((toph+10));$((dist+15))H${prelevel}\e[0m\n"
  514.    printf "\e[38;5;34;1m\e[$((toph+12));${dist}HM|m      ===   double         N|n          ===   half\n"
  515.    printf "\e[$((toph+13));${dist}HQ|q|ESC  ===   exit           U|u          ===   one step up\n"
  516.    printf "\e[$((toph+14));${dist}HP|p      ===   pause          S|s|down     ===   one step down\n"
  517.    printf "\e[$((toph+15));${dist}HR|r      ===   resume         A|a|left     ===   one step left\n"
  518.    printf "\e[$((toph+16));${dist}HW|w|up   ===   rotate         D|d|right    ===   one step right\n"
  519.    printf "\e[$((toph+17));${dist}HT|t      ===   transpose      Space|enter  ===   drop all down\n"
  520.    printf "\e[38;5;106;1m\e[$((toph+19));${dist}HTetris Game  Version 7.1.4\n"
  521.    printf "\e[$((toph+20));${dist}HYongYe <complex.invoke@gmail.com>\e[$((toph+21));${dist}H11/01/2011 BeiJing China [Updated 12/01/2013]\n"
  522. }

  523.    case ${1} in
  524.    -h|--help)    echo "Usage: bash ${0} [runlevel] [previewlevel] [speedlevel]  [width] [height]"
  525.                  echo "Range: [ 0 <= runlevel <= $((${#BOX[@]}-1)) ]   [ previewlevel >= 1 ]   [ speedlevel <= 30 ]   [ width >= 17 ]   [ height >= 10 ]" ;;
  526.    -v|--version) echo "Tetris Game  Version 7.1.4 [Updated 12/01/2013]" ;;
  527.    ${PPID})      run.level ${2}; ini.loop run.initi
  528.                  show.board; show.notify
  529.                  show.piece 0; draw.piece 0
  530.                  get.ctime &
  531.                  per.sig ${!} ;;
  532.    *)            bash ${0} ${$} ${@} &
  533.                  get.sig ${!} ;;
  534.    esac
复制代码

特性:
00.支持时间显示特效!
01.支持方块旋转变换!
02.支持方块做矩阵转置!
03.支持炸弹特效(ID=26)!
04.支持方块暂停/恢复特效!
05.支持方块运行速度级别选择!
06.支持幽灵方块跨区域移动(ID=0)!
07.支持32个运行级别任意选择(0-31)!
08.支持方块大小动态伸缩变换(放大和缩小)!
09.支持方块的游戏区域宽度(可无穷大)自定义!
10.支持方块的游戏区域高度(可无穷大)自定义!
11.支持方块按给定坐标区间设定值的任意定制!
12.支持方块的多颜色显示(593种颜色随机选择)!
13.支持方块堆叠的难度系数依速度级别自动变化!
14.支持代码的高度可伸缩性:抽象和封装(get.invoke函数)!
15.支持方块的N(可无穷大)级预览选择(默认为6级预览,可预览随机生成的下6个方块)!

调用方法:
  1. bash Tetris_Game_Vector_Based.sh [runlevel] [previewlevel] [speedlevel]  [width] [height]
复制代码


C、Go、C++、Shell版共享完全相同的算法、设计思想和游戏截图
以下是Shell版7.0的游戏截图:

Fedora-19-x86_64下Gnome终端截图
Gnome1.png
Gnome2.png
Gnome3.png
Gnome4.png
Gnome5.png

CentOS-6.4-x86_64下Xshell终端截图
Xshell1.png
Xshell2.png
Xshell3.png
Xshell4.png
Xshell5.png

核心算法的矩阵方程:

Algorithm

Algorithm


郑重声明:该项目为本人原创项目,其算法、思想及所有代码均由本人独立设计、研发完成,你可以任意修改、拓展、发布、用于任何目的,但请保留原作者出处( 也即我,永夜<complex.invoke@gmail.com> )!
微分了忧伤,积分了希望,我要和你一起追逐黎曼最初的梦想……

                 ---永夜
                         11/02/2011   BeiJing China

unix论坛永久置顶贴!
www.unix.com


Tetris_Game.7.1.4.tar (690 KB, 下载次数: 80)

评分

参与人数 3可用积分 +32 收起 理由
send_linux + 12 鼓励原创!
cjaizss + 10 支持原创
expert1 + 10 不错不错啊!

查看全部评分

论坛徽章:
0
发表于 2011-11-02 21:26 |显示全部楼层
沙发,群里的兄弟来捧场了

论坛徽章:
0
发表于 2011-11-02 21:27 |显示全部楼层
强悍。

论坛徽章:
0
发表于 2011-11-02 21:28 |显示全部楼层
前排占座,膜拜

论坛徽章:
0
发表于 2011-11-02 21:33 |显示全部楼层
不顶不行啊,顶啊,顶啊,用力向上顶啊

论坛徽章:
0
发表于 2011-11-02 21:54 |显示全部楼层
试玩了一会儿,死掉了

论坛徽章:
0
发表于 2011-11-02 21:57 |显示全部楼层
不管怎么样,先顶群里兄弟个。 争取用python再写个。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
发表于 2011-11-02 22:04 |显示全部楼层
虚拟机和SSH上是这样:

未命名.jpg 未命名1.jpg

ubuntu server 11.04

论坛徽章:
0
发表于 2011-11-02 22:08 |显示全部楼层
顶下...前排都是群友

论坛徽章:
0
发表于 2011-11-02 22:10 |显示全部楼层
回复 1# crulat


    支持。支持。支持。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP