开启左侧

用shell写的俄罗斯方块

二维码 [复制链接]
190 0
  1. #!/bin/bash



  2. #APP declaration
  3. APP_NAME="${0##*[\\/]}"
  4. APP_VERSION="1.0"


  5. #颜色定义
  6. cRed=1
  7. cGreen=2
  8. cYellow=3
  9. cBlue=4
  10. cFuchsia=5
  11. cCyan=6
  12. cWhite=7
  13. colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite)

  14. #位置和大小
  15. iLeft=3
  16. iTop=2
  17. ((iTrayLeft = iLeft + 2))
  18. ((iTrayTop = iTop + 1))
  19. ((iTrayWidth = 10))
  20. ((iTrayHeight = 15))

  21. #颜色设置
  22. cBorder=$cGreen
  23. cScore=$cFuchsia
  24. cScoreValue=$cCyan

  25. #控制信号
  26. #改游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;
  27. #当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。
  28. sigRotate=25
  29. sigLeft=26
  30. sigRight=27
  31. sigDown=28
  32. sigAllDown=29
  33. sigExit=30

  34. #七中不同的方块的定义
  35. #通过旋转,每种方块的显示的样式可能有几种
  36. box0=(0 0 0 1 1 0 1 1)
  37. box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
  38. box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
  39. box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
  40. box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
  41. box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
  42. box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)
  43. #所有其中方块的定义都放到box变量中
  44. box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
  45. #各种方块旋转后可能的样式数目
  46. countBox=(1 2 2 2 4 4 4)
  47. #各种方块再box数组中的偏移
  48. offsetBox=(0 1 3 5 7 11 15)

  49. #每提高一个速度级需要积累的分数
  50. iScoreEachLevel=50        #be greater than 7

  51. #运行时数据
  52. sig=0                #接收到的signal
  53. iScore=0        #总分
  54. iLevel=0        #速度级
  55. boxNew=()        #新下落的方块的位置定义
  56. cBoxNew=0        #新下落的方块的颜色
  57. iBoxNewType=0        #新下落的方块的种类
  58. iBoxNewRotate=0        #新下落的方块的旋转角度
  59. boxCur=()        #当前方块的位置定义
  60. cBoxCur=0        #当前方块的颜色
  61. iBoxCurType=0        #当前方块的种类
  62. iBoxCurRotate=0        #当前方块的旋转角度
  63. boxCurX=-1        #当前方块的x坐标位置
  64. boxCurY=-1        #当前方块的y坐标位置
  65. iMap=()                #背景方块图表

  66. #初始化所有背景方块为-1, 表示没有方块
  67. for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done


  68. #接收输入的进程的主函数
  69. function RunAsKeyReceiver()
  70. {
  71.     local pidDisplayer key aKey sig cESC sTTY

  72.     pidDisplayer=$1
  73.     aKey=(0 0 0)

  74.     cESC=`echo -ne "\033"`
  75.     cSpace=`echo -ne "\040"`

  76.     #保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。
  77.     #如果在read -s时程序被不幸杀掉,可能会导致终端混乱,
  78.     #需要在程序退出时恢复终端属性。
  79.     sTTY=`stty -g`

  80.     #捕捉退出信号
  81.     trap "MyExit;" INT TERM
  82.     trap "MyExitNoSub;" $sigExit

  83.     #隐藏光标
  84.     echo -ne "\033[?25l"


  85.     while :
  86.     do
  87.         #读取输入。注-s不回显,-n读到一个字符立即返回
  88.         read -s -n 1 key

  89.         aKey[0]=${aKey[1]}
  90.         aKey[1]=${aKey[2]}
  91.         aKey[2]=$key
  92.         sig=0

  93.         #判断输入了何种键
  94.         if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
  95.         then
  96.             #ESC键
  97.             MyExit
  98.         elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]
  99.         then
  100.             if [[ $key == "A" ]]; then sig=$sigRotate        #<向上键>
  101.             elif [[ $key == "B" ]]; then sig=$sigDown        #<向下键>
  102.             elif [[ $key == "D" ]]; then sig=$sigLeft        #<向左键>
  103.             elif [[ $key == "C" ]]; then sig=$sigRight        #<向右键>
  104.             fi
  105.         elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate        #W, w
  106.         elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown        #S, s
  107.         elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft        #A, a
  108.         elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight        #D, d
  109.         elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown        #空格键
  110.         elif [[ $key == "Q" || $key == "q" ]]                        #Q, q
  111.         then
  112.             MyExit
  113.         fi

  114.         if [[ $sig != 0 ]]
  115.         then
  116.             #向另一进程发送消息
  117.             kill -$sig $pidDisplayer
  118.         fi
  119.     done
  120. }

  121. #退出前的恢复
  122. function MyExitNoSub()
  123. {
  124.     local y

  125.     #恢复终端属性
  126.     stty $sTTY
  127.     ((y = iTop + iTrayHeight + 4))

  128.     #显示光标
  129.     echo -e "\033[?25h\033[${y};0H"
  130.     exit
  131. }


  132. function MyExit()
  133. {
  134.     #通知显示进程需要退出
  135.     kill -$sigExit $pidDisplayer

  136.     MyExitNoSub
  137. }


  138. #处理显示和游戏流程的主函数
  139. function RunAsDisplayer()
  140. {
  141.     local sigThis
  142.     InitDraw

  143.     #挂载各种信号的处理函数
  144.     trap "sig=$sigRotate;" $sigRotate
  145.     trap "sig=$sigLeft;" $sigLeft
  146.     trap "sig=$sigRight;" $sigRight
  147.     trap "sig=$sigDown;" $sigDown
  148.     trap "sig=$sigAllDown;" $sigAllDown
  149.     trap "ShowExit;" $sigExit

  150.     while :
  151.     do
  152.         #根据当前的速度级iLevel不同,设定相应的循环的次数
  153.         for ((i = 0; i < 21 - iLevel; i++))
  154.         do
  155.             sleep 0.02
  156.             sigThis=$sig
  157.             sig=0

  158.             #根据sig变量判断是否接受到相应的信号
  159.             if ((sigThis == sigRotate)); then BoxRotate;        #旋转
  160.             elif ((sigThis == sigLeft)); then BoxLeft;        #左移一列
  161.             elif ((sigThis == sigRight)); then BoxRight;        #右移一列
  162.             elif ((sigThis == sigDown)); then BoxDown;        #下落一行
  163.             elif ((sigThis == sigAllDown)); then BoxAllDown;        #下落到底
  164.             fi
  165.         done
  166.         #kill -$sigDown $
  167.         BoxDown        #下落一行
  168.     done
  169. }


  170. #BoxMove(y, x), 测试是否可以把移动中的方块移到(x, y)的位置, 返回0则可以, 1不可以
  171. function BoxMove()
  172. {
  173.     local j i x y xTest yTest
  174.     yTest=$1
  175.     xTest=$2
  176.     for ((j = 0; j < 8; j += 2))
  177.     do
  178.         ((i = j + 1))
  179.         ((y = ${boxCur[$j]} + yTest))
  180.         ((x = ${boxCur[$i]} + xTest))
  181.         if (( y < 0 || y >= iTrayHeight || x < 0 || x >= iTrayWidth))
  182.         then
  183.             #撞到墙壁了
  184.             return 1
  185.         fi
  186.         if ((${iMap[y * iTrayWidth + x]} != -1 ))
  187.         then
  188.             #撞到其他已经存在的方块了
  189.             return 1
  190.         fi
  191.     done
  192.     return 0;
  193. }


  194. #将当前移动中的方块放到背景方块中去,
  195. #并计算新的分数和速度级。(即一次方块落到底部)
  196. function Box2Map()
  197. {
  198.     local j i x y xp yp line

  199.     #将当前移动中的方块放到背景方块中去
  200.     for ((j = 0; j < 8; j += 2))
  201.     do
  202.         ((i = j + 1))
  203.         ((y = ${boxCur[$j]} + boxCurY))
  204.         ((x = ${boxCur[$i]} + boxCurX))
  205.         ((i = y * iTrayWidth + x))
  206.         iMap[$i]=$cBoxCur
  207.     done

  208.     #消去可被消去的行
  209.     line=0
  210.     for ((j = 0; j < iTrayWidth * iTrayHeight; j += iTrayWidth))
  211.     do
  212.         for ((i = j + iTrayWidth - 1; i >= j; i--))
  213.         do
  214.             if ((${iMap[$i]} == -1)); then break; fi
  215.         done
  216.         if ((i >= j)); then continue; fi

  217.         ((line++))
  218.         for ((i = j - 1; i >= 0; i--))
  219.         do
  220.             ((x = i + iTrayWidth))
  221.             iMap[$x]=${iMap[$i]}
  222.         done
  223.         for ((i = 0; i < iTrayWidth; i++))
  224.         do
  225.             iMap[$i]=-1
  226.         done
  227.     done

  228.     if ((line == 0)); then return; fi

  229.     #根据消去的行数line计算分数和速度级
  230.     ((x = iLeft + iTrayWidth * 2 + 7))
  231.     ((y = iTop + 11))
  232.     ((iScore += line * 2 - 1))
  233.     #显示新的分数
  234.     echo -ne "\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore}         "
  235.     if ((iScore % iScoreEachLevel < line * 2 - 1))
  236.     then
  237.         if ((iLevel < 20))
  238.         then
  239.             ((iLevel++))
  240.             ((y = iTop + 14))
  241.             #显示新的速度级
  242.             echo -ne "\033[3${cScoreValue}m\033[${y};${x}H${iLevel}        "
  243.         fi
  244.     fi
  245.     echo -ne "\033[0m"


  246.     #重新显示背景方块
  247.     for ((y = 0; y < iTrayHeight; y++))
  248.     do
  249.         ((yp = y + iTrayTop + 1))
  250.         ((xp = iTrayLeft + 1))
  251.         ((i = y * iTrayWidth))
  252.         echo -ne "\033[${yp};${xp}H"
  253.         for ((x = 0; x < iTrayWidth; x++))
  254.         do
  255.             ((j = i + x))
  256.             if ((${iMap[$j]} == -1))
  257.             then
  258.                 echo -ne "  "
  259.             else
  260.                 echo -ne "\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m"
  261.             fi
  262.         done
  263.     done
  264. }


  265. #下落一行
  266. function BoxDown()
  267. {
  268.     local y s
  269.     ((y = boxCurY + 1))        #新的y坐标
  270.     if BoxMove $y $boxCurX        #测试是否可以下落一行
  271.     then
  272.         s="`DrawCurBox 0`"        #将旧的方块抹去
  273.         ((boxCurY = y))
  274.         s="$s`DrawCurBox 1`"        #显示新的下落后方块
  275.         echo -ne $s
  276.     else
  277.         #走到这儿, 如果不能下落了
  278.         Box2Map                #将当前移动中的方块贴到背景方块中
  279.         RandomBox        #产生新的方块
  280.     fi
  281. }

  282. #左移一列
  283. function BoxLeft()
  284. {
  285.     local x s
  286.     ((x = boxCurX - 1))
  287.     if BoxMove $boxCurY $x
  288.     then
  289.         s=`DrawCurBox 0`
  290.         ((boxCurX = x))
  291.         s=$s`DrawCurBox 1`
  292.         echo -ne $s
  293.     fi
  294. }

  295. #右移一列
  296. function BoxRight()
  297. {
  298.     local x s
  299.     ((x = boxCurX + 1))
  300.     if BoxMove $boxCurY $x
  301.     then
  302.         s=`DrawCurBox 0`
  303.         ((boxCurX = x))
  304.         s=$s`DrawCurBox 1`
  305.         echo -ne $s
  306.     fi
  307. }


  308. #下落到底
  309. function BoxAllDown()
  310. {
  311.     local k j i x y iDown s
  312.     iDown=$iTrayHeight

  313.     #计算一共需要下落多少行
  314.     for ((j = 0; j < 8; j += 2))
  315.     do
  316.         ((i = j + 1))
  317.         ((y = ${boxCur[$j]} + boxCurY))
  318.         ((x = ${boxCur[$i]} + boxCurX))
  319.         for ((k = y + 1; k < iTrayHeight; k++))
  320.         do
  321.             ((i = k * iTrayWidth + x))
  322.             if (( ${iMap[$i]} != -1)); then break; fi
  323.         done
  324.         ((k -= y + 1))
  325.         if (( $iDown > $k )); then iDown=$k; fi
  326.     done

  327.     s=`DrawCurBox 0`        #将旧的方块抹去
  328.     ((boxCurY += iDown))
  329.     s=$s`DrawCurBox 1`        #显示新的下落后的方块
  330.     echo -ne $s
  331.     Box2Map                #将当前移动中的方块贴到背景方块中
  332.     RandomBox        #产生新的方块
  333. }


  334. #旋转方块
  335. function BoxRotate()
  336. {
  337.     local iCount iTestRotate boxTest j i s
  338.     iCount=${countBox[$iBoxCurType]}        #当前的方块经旋转可以产生的样式的数目

  339.     #计算旋转后的新的样式
  340.     ((iTestRotate = iBoxCurRotate + 1))
  341.     if ((iTestRotate >= iCount))
  342.     then
  343.         ((iTestRotate = 0))
  344.     fi

  345.     #更新到新的样式, 保存老的样式(但不显示)
  346.     for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
  347.     do
  348.         boxTest[$j]=${boxCur[$j]}
  349.         boxCur[$j]=${box[$i]}
  350.     done

  351.     if BoxMove $boxCurY $boxCurX        #测试旋转后是否有空间放的下
  352.     then
  353.         #抹去旧的方块
  354.         for ((j = 0; j < 8; j++))
  355.         do
  356.             boxCur[$j]=${boxTest[$j]}
  357.         done
  358.         s=`DrawCurBox 0`

  359.         #画上新的方块
  360.         for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++))
  361.         do
  362.             boxCur[$j]=${box[$i]}
  363.         done
  364.         s=$s`DrawCurBox 1`
  365.         echo -ne $s
  366.         iBoxCurRotate=$iTestRotate
  367.     else
  368.         #不能旋转,还是继续使用老的样式
  369.         for ((j = 0; j < 8; j++))
  370.         do
  371.             boxCur[$j]=${boxTest[$j]}
  372.         done
  373.     fi
  374. }


  375. #DrawCurBox(bDraw), 绘制当前移动中的方块, bDraw为1, 画上, bDraw为0, 抹去方块。
  376. function DrawCurBox()
  377. {
  378.     local i j t bDraw sBox s
  379.     bDraw=$1

  380.     s=""
  381.     if (( bDraw == 0 ))
  382.     then
  383.         sBox="\040\040"
  384.     else
  385.         sBox="[]"
  386.         s=$s"\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m"
  387.     fi

  388.     for ((j = 0; j < 8; j += 2))
  389.     do
  390.         ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY))
  391.         ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]})))
  392.         #\033[y;xH, 光标到(x, y)处
  393.         s=$s"\033[${i};${t}H${sBox}"
  394.     done
  395.     s=$s"\033[0m"
  396.     echo -n $s
  397. }


  398. #更新新的方块
  399. function RandomBox()
  400. {
  401.     local i j t

  402.     #更新当前移动的方块
  403.     iBoxCurType=${iBoxNewType}
  404.     iBoxCurRotate=${iBoxNewRotate}
  405.     cBoxCur=${cBoxNew}
  406.     for ((j = 0; j < ${#boxNew[@]}; j++))
  407.     do
  408.         boxCur[$j]=${boxNew[$j]}
  409.     done


  410.     #显示当前移动的方块
  411.     if (( ${#boxCur[@]} == 8 ))
  412.     then
  413.         #计算当前方块该从顶端哪一行"冒"出来
  414.         for ((j = 0, t = 4; j < 8; j += 2))
  415.         do
  416.             if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
  417.         done
  418.         ((boxCurY = -t))
  419.         for ((j = 1, i = -4, t = 20; j < 8; j += 2))
  420.         do
  421.             if ((${boxCur[$j]} > i)); then i=${boxCur[$j]}; fi
  422.             if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi
  423.         done
  424.         ((boxCurX = (iTrayWidth - 1 - i - t) / 2))

  425.         #显示当前移动的方块
  426.         echo -ne `DrawCurBox 1`

  427.         #如果方块一出来就没处放,Game over!
  428.         if ! BoxMove $boxCurY $boxCurX
  429.         then
  430.             kill -$sigExit ${PPID}
  431.             ShowExit
  432.         fi
  433.     fi



  434.     #清除右边预显示的方块
  435.     for ((j = 0; j < 4; j++))
  436.     do
  437.         ((i = iTop + 1 + j))
  438.         ((t = iLeft + 2 * iTrayWidth + 7))
  439.         echo -ne "\033[${i};${t}H        "
  440.     done

  441.     #随机产生新的方块
  442.     ((iBoxNewType = RANDOM % ${#offsetBox[@]}))
  443.     ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]}))
  444.     for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j < 8; j++, i++))
  445.     do
  446.         boxNew[$j]=${box[$i]};
  447.     done

  448.     ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]}))

  449.     #显示右边预显示的方块
  450.     echo -ne "\033[1m\033[7m\033[3${cBoxNew}m\033[4${cBoxNew}m"
  451.     for ((j = 0; j < 8; j += 2))
  452.     do
  453.         ((i = iTop + 1 + ${boxNew[$j]}))
  454.         ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]}))
  455.         echo -ne "\033[${i};${t}H[]"
  456.     done
  457.     echo -ne "\033[0m"
  458. }


  459. #初始绘制
  460. function InitDraw()
  461. {
  462.     clear
  463.     RandomBox        #随机产生方块,这时右边预显示窗口中有方快了
  464.     RandomBox        #再随机产生方块,右边预显示窗口中的方块被更新,原先的方块将开始下落
  465.     local i t1 t2 t3

  466.     #显示边框
  467.     echo -ne "\033[1m"
  468.     echo -ne "\033[3${cBorder}m\033[4${cBorder}m"

  469.     ((t2 = iLeft + 1))
  470.     ((t3 = iLeft + iTrayWidth * 2 + 3))
  471.     for ((i = 0; i < iTrayHeight; i++))
  472.     do
  473.         ((t1 = i + iTop + 2))
  474.         echo -ne "\033[${t1};${t2}H||"
  475.         echo -ne "\033[${t1};${t3}H||"
  476.     done

  477.     ((t2 = iTop + iTrayHeight + 2))
  478.     for ((i = 0; i < iTrayWidth + 2; i++))
  479.     do
  480.         ((t1 = i * 2 + iLeft + 1))
  481.         echo -ne "\033[${iTrayTop};${t1}H=="
  482.         echo -ne "\033[${t2};${t1}H=="
  483.     done
  484.     echo -ne "\033[0m"


  485.     #显示"Score"和"Level"字样
  486.     echo -ne "\033[1m"
  487.     ((t1 = iLeft + iTrayWidth * 2 + 7))
  488.     ((t2 = iTop + 10))
  489.     echo -ne "\033[3${cScore}m\033[${t2};${t1}HScore"
  490.     ((t2 = iTop + 11))
  491.     echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iScore}"
  492.     ((t2 = iTop + 13))
  493.     echo -ne "\033[3${cScore}m\033[${t2};${t1}HLevel"
  494.     ((t2 = iTop + 14))
  495.     echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iLevel}"
  496.     echo -ne "\033[0m"
  497. }


  498. #退出时显示GameOVer!
  499. function ShowExit()
  500. {
  501.     local y
  502.     ((y = iTrayHeight + iTrayTop + 3))
  503.     echo -e "\033[${y};0HGameOver!\033[0m"
  504.     exit
  505. }


  506. #显示用法.
  507. function Usage
  508. {
  509.     cat << EOF
  510.     Usage: $APP_NAME
  511.     Start tetris game.

  512.     -h, --help              display this help and exit
  513.     --version           output version information and exit
  514. EOF
  515. }


  516. #游戏主程序在这儿开始.
  517. if [[ "$1" == "-h" || "$1" == "--help" ]]; then
  518.     Usage
  519. elif [[ "$1" == "--version" ]]; then
  520.     echo "$APP_NAME $APP_VERSION"
  521. elif [[ "$1" == "--show" ]]; then
  522.     #当发现具有参数--show时,运行显示函数
  523.     RunAsDisplayer
  524. else
  525.     bash $0 --show&        #以参数--show将本程序再运行一遍
  526.     RunAsKeyReceiver $!        #以上一行产生的进程的进程号作为参数
  527. fi
复制代码



赞助本站





上一篇:记一次Linux系统被rootkit的排查过程(二)
下一篇:强大的grep用法详解:grep与正则表达式
学会善用【论坛搜索】功能,很多你要寻找的答案就在这里面;
资源共享区【解压密码】集合,【爱好街币】的作用与获取方式;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

发新帖 回复

104

主题

104

帖子

233

街币
更多

精彩推荐

独立团VIP教程第1-7版全套打包下载(含课件源码工具等)
独立团VIP教程第1-7版全套打包
独立团第1版易语言教程 独立团第一版1易语言入门 1-1-1外
爱好街链接地址失效有奖报错
爱好街链接地址失效有奖报错
我们的成长离不开大家的支持!! 各位爱好街的会员:
新人报到专用贴
新人报到专用贴
==新人报道格式(选填)== 【我的昵称】: 【我的性别
爱好街资源共享区文件解压密码
爱好街资源共享区文件解压密码
因本站分享的文件实在太多,目前收集整理已经接近4T,所以有些文
魔鬼作坊vip教程辅助制作培训之零基础绝密汇编语言入门课程
魔鬼作坊vip教程辅助制作培训
这套课程为汇编入门教程,学习游戏逆向反汇编需要用到的基础知
万挂作坊教程+封包+E模块(全套下载)
万挂作坊教程+封包+E模块(全套
万挂-封包 封包加密解密-01 封包加密解密-02 封包加密

免责声明:
在爱好街发布的文章与主题属会员个人意见,与本站立场无关,文章内容由作者与爱好街享有相关版权,如需转载请注明出处或取得会员与本站的许可,否则本站将追究相应的法律责任,如部分内容有侵犯任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意。另外不得将本站内容用于商业或者非法用途,否则,一切后果请用户自负。

Mail To:MasTer@AiHaiJie.Com

快速回复
快速回复 返回顶部 返回列表