忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: 王楠w_n

【盖楼活动】女神节特辑:兄弟,你是否依然对你的代码充满爱意?(获奖名单已公布) [复制链接]

论坛徽章:
5
技术图书徽章
日期:2015-01-14 09:32:18IT运维版块每日发帖之星
日期:2015-10-09 06:20:00IT运维版块每日发帖之星
日期:2015-10-10 06:20:002017金鸡报晓
日期:2017-01-10 15:13:292017金鸡报晓
日期:2017-02-08 10:33:21
发表于 2017-03-09 14:25 |显示全部楼层
盖楼,以前都有礼物,结婚了就只有句祝福的话,和吃顿饭了。想来还是挺对不住的额

论坛徽章:
51
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2017-03-09 15:45 |显示全部楼层
回复 45# folklore

怎么优化。

论坛徽章:
11
CU大牛徽章
日期:2013-04-17 11:20:362017金鸡报晓
日期:2017-02-08 10:39:422017金鸡报晓
日期:2017-01-10 15:13:29IT运维版块每日发帖之星
日期:2016-03-15 06:20:01IT运维版块每日发帖之星
日期:2015-10-02 06:20:00CU十二周年纪念徽章
日期:2013-10-24 15:41:34CU大牛徽章
日期:2013-09-18 15:15:45CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-04-17 11:46:39CU大牛徽章
日期:2013-04-17 11:46:2815-16赛季CBA联赛之福建
日期:2017-03-13 11:33:44
发表于 2017-03-09 15:49 |显示全部楼层
乱踩一通,估计只能祝福啦

论坛徽章:
51
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2017-03-09 16:00 |显示全部楼层
回复 45# folklore

不会C、C++啊。所以你的指针啥的我就蒙B了。

论坛徽章:
89
CU大牛徽章
日期:2013-11-29 22:26:36CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2014-02-21 14:22:02CU大牛徽章
日期:2014-02-21 14:22:07CU大牛徽章
日期:2014-02-21 14:22:09CU大牛徽章
日期:2015-02-28 17:45:342015元宵节徽章
日期:2015-03-06 16:56:38羊年新春福章
日期:2015-02-28 17:42:522015七夕节徽章
日期:2015-09-14 09:24:55CU大牛徽章
日期:2014-02-21 14:22:44CU大牛徽章
日期:2015-02-28 17:48:12CU大牛徽章
日期:2015-02-28 17:47:58
发表于 2017-03-09 16:31 |显示全部楼层
这里就把 Shell 飞机游戏(2013-03-15) 拿来改一个庆祝节日的贪吃蛇吧
贴上游戏截图,一只庆祝快乐的蛇来收集爱心(v 字母像一个爱心吧,就拿它来充当了,没试出打印 ascii 爱心的办法)。

1.jpg
2.jpg

​然后是代码,头文件到 Shell 飞机游戏(2013-03-15) 中获取吧。
  1. #!/bin/bash
  2. # Snake.sh
  3. # Created by seesea <seesea2517#126.com> @ 2017-03-08
  4. #
  5. # 楠妹子发了一个活动,要用代码来庆祝3.8节:http://bbs.chinaunix.net/thread-4260145-1-1.html
  6. # 这里就把 Shell 飞机游戏(2013-03-15) 拿来改一个庆祝节日的贪吃蛇吧 :D
  7. # 一只庆祝快乐的蛇来收集爱心(v 字母像一个爱心吧,就拿它来充当了,没试出打印 ascii 爱心的办法)
  8. # 做为简单 Demo,而且快乐的蛇应该是不死的,所以不做 GameOver 的处理啦

  9. source colors.sh

  10. # ============================================================================
  11. # 常量
  12. # ============================================================================

  13. # 响应的信号
  14. declare -r SIG_UP=SIGRTMIN+1
  15. declare -r SIG_DOWN=SIGRTMIN+2
  16. declare -r SIG_LEFT=SIGRTMIN+3
  17. declare -r SIG_RIGHT=SIGRTMIN+4
  18. declare -r SIG_PAUSE=SIGRTMIN+6
  19. declare -r SIG_EXIT=SIGRTMIN+7

  20. # 响应的按键(注意:使用大写配置)
  21. declare -r KEY_UP="W"
  22. declare -r KEY_DOWN="S"
  23. declare -r KEY_LEFT="A"
  24. declare -r KEY_RIGHT="D"
  25. declare -r KEY_PAUSE="P"
  26. declare -r KEY_EXIT="Q"

  27. # 游戏区域位置大小
  28. declare -r GAME_AREA_TOP=30
  29. declare -r GAME_AREA_LEFT=40
  30. declare -r GAME_AREA_WIDTH=40
  31. declare -r GAME_AREA_HEIGHT=20

  32. # 游戏边界显示字符(分横向和纵向两种字符)
  33. declare -r BORDER_H="${BHIG} ${NOR}"
  34. declare -r BORDER_V="${BHIG} ${NOR}"

  35. # ============================================================================
  36. # 全局变量/常量
  37. # ============================================================================

  38. declare stty_save                 # 终端设置
  39. declare game_overed=0             # 游戏中止标志
  40. declare game_paused=0             # 游戏暂停

  41. declare pid_loop                  # 消息循环的进程pid

  42. declare screen_width              # 屏宽
  43. declare screen_height             # 屏高
  44. declare game_map_width            # 屏宽
  45. declare game_map_height           # 屏高

  46. declare pos_head_r                # 当前蛇头坐标:行
  47. declare pos_head_c                # 当前蛇头坐标:列

  48. declare move_dir                  # 移动方向

  49. declare snake_len                 # 蛇长
  50. declare -a snake                  # 蛇体数据数组
  51. declare -a pos_snake_r            # 每一节蛇体的坐标行值
  52. declare -a pos_snake_c            # 每一节蛇体的坐标列值
  53. declare old_tail_pos_r            # 移动后的蛇尾位置r
  54. declare old_tail_pos_c            # 移动后的蛇尾位置c

  55. declare -ar food_style=( "${RED}v${NOR}" "${GRN}v${NOR}" "${YEL}v${NOR}" "${BLU}v${NOR}" "${MAG}v${NOR}" "${CYN}v${NOR}" "${WHT}v${NOR}" "${HIR}v${NOR}" "${HIG}v${NOR}" "${HIY}v${NOR}" "${HIB}v${NOR}" "${HIM}v${NOR}" "${HIC}v${NOR}" "${HIW}v${NOR}" )
  56. declare -r  food_style_count=${#food_style[@]}
  57. declare food
  58. declare food_pos_r
  59. declare food_pos_c
  60. declare food_style_index

  61. # ============================================================================
  62. # 函数定义
  63. # ============================================================================

  64. # 随机函数
  65. # 参数一:随机数的上限+1,缺省为 10
  66. function random()
  67. {
  68.     echo $(( RANDOM % ${1:-10} ))
  69. }

  70. # 键盘输入响应函数
  71. function Input()
  72. {
  73.     while true
  74.     do
  75.         read -s -n 1 -a key
  76.         key="${key[@]: -1}"
  77.         case $key in
  78.             $KEY_UP)    sign=$SIG_UP    ;;
  79.             $KEY_DOWN)  sign=$SIG_DOWN  ;;
  80.             $KEY_LEFT)  sign=$SIG_LEFT  ;;
  81.             $KEY_RIGHT) sign=$SIG_RIGHT ;;
  82.             $KEY_PAUSE) sign=$SIG_PAUSE ;;
  83.             $KEY_EXIT)  sign=$SIG_EXIT  ;;
  84.             *)          continue        ;;
  85.         esac

  86.         kill -s $sign $pid_loop

  87.         # 若是退出按键,则根据游戏循环是否存在来判断是否确认退出
  88.         if (( sign == SIG_EXIT ))
  89.         then
  90.             sleep 0.1
  91.             if ! ps -p $pid_loop > /dev/null
  92.             then
  93.                 break
  94.             fi
  95.         fi
  96.     done
  97. }

  98. # 输入动作响应函数
  99. # 输入参数一:键盘消息
  100. function Action()
  101. {
  102.     sign=$1

  103.     # 若游戏暂停,则只响应暂停信号和退出信号
  104.     if (( game_paused && sign != SIG_PAUSE && sign != SIG_EXIT ))
  105.     then
  106.         return
  107.     fi

  108.     # 输入线程的暂停处理
  109.     if (( game_overed && sign == SIG_PAUSE ))
  110.     then
  111.         return
  112.     fi

  113.     case $sign in
  114.         $SIG_UP)    OnPressPlayerMove "U" ;;
  115.         $SIG_DOWN)  OnPressPlayerMove "D" ;;
  116.         $SIG_LEFT)  OnPressPlayerMove "L" ;;
  117.         $SIG_RIGHT) OnPressPlayerMove "R" ;;
  118.         $SIG_PAUSE) OnPressGamePause      ;;
  119.         $SIG_EXIT)  OnPressGameExit       ;;
  120.     esac
  121. }

  122. # 系统初始化
  123. function Init()
  124. {
  125.     screen_width=$(tput cols)
  126.     screen_height=$(tput lines)

  127.     game_map_width=$GAME_AREA_WIDTH
  128.     game_map_height=$GAME_AREA_HEIGHT

  129.     # 终端设置
  130.     stty_save=$(stty -g)    # 保存stty配置
  131.     stty -echo              # 关闭输入回显
  132.     tput civis              # 关闭光标
  133.     shopt -s nocasematch    # 开启大小写case比较的开关
  134.     clear

  135.     # 有时候echo会提示中断的函数调用,目前没啥解决办法,就把错误提示屏蔽了先
  136.     exec 2> /dev/null
  137. }

  138. # 按键响应:游戏暂停
  139. function OnPressGamePause()
  140. {
  141.     game_paused=$(( ! game_paused ))
  142. }

  143. # 按键响应:退出游戏
  144. function OnPressGameExit()
  145. {
  146.     game_overed=1
  147. }

  148. # 按键响应:玩家动作
  149. # $1: U D L R = up down left right
  150. function OnPressPlayerMove()
  151. {
  152.     move_dir="$1"
  153. }

  154. function GameInit()
  155. {
  156.     # 设定输入响应函数
  157.     # trap Action $SIG_UP $SIG_DOWN $SIG_LEFT $SIG_RIGHT $SIG_PAUSE $SIG_SHOOT $SIG_EXIT
  158.     trap "Action $SIG_UP"    $SIG_UP
  159.     trap "Action $SIG_DOWN"  $SIG_DOWN
  160.     trap "Action $SIG_LEFT"  $SIG_LEFT
  161.     trap "Action $SIG_RIGHT" $SIG_RIGHT
  162.     trap "Action $SIG_PAUSE" $SIG_PAUSE
  163.     trap "Action $SIG_EXIT"  $SIG_EXIT

  164.     DrawBorder

  165.     (( pos_head_c = game_map_width / 2 + $GAME_AREA_LEFT - 1 ))
  166.     (( pos_head_r = game_map_height / 2 + $GAME_AREA_TOP - 1 ))
  167.     game_overed=0
  168.     move_dir='X'

  169.     # 测试和截图用 :D snake=(H A P P Y 3 . 8 "${HIM}v${NOR}" "${WHT}v${NOR}"  "${RED}v${NOR}" "${GRN}v${NOR}" "${YEL}v${NOR}" "${YEL}v${NOR}" "${BLU}v${NOR}" "${MAG}v${NOR}" "${MAG}v${NOR}" "${CYN}v${NOR}" "${WHT}v${NOR}" "${HIR}v${NOR}" "${HIG}v${NOR}" "${HIY}v${NOR}" "${HIB}v${NOR}" "${MAG}v${NOR}" "${HIM}v${NOR}")
  170.     snake=(H A P P Y 3 . 8)
  171.     snake_len=${#snake[*]}
  172.     for (( i = 0; i < snake_len; ++i ))
  173.     do
  174.         pos_snake_r[$i]=$pos_head_r
  175.         pos_snake_c[$i]=$(( ((pos_head_c + i + 1 + game_map_width - $GAME_AREA_LEFT) % game_map_width) + $GAME_AREA_LEFT ))
  176.     done

  177.     RandomFood
  178. }

  179. # 游戏循环
  180. function GameLoop()
  181. {
  182.     GameInit

  183.     while true
  184.     do
  185.         if (( game_overed ))
  186.         then
  187.             break
  188.         fi

  189.         FrameAction
  190.         sleep 0.04  # 每秒25帧,sleep 0.04
  191.     done
  192. }

  193. function GameStart()
  194. {
  195.     GameLoop &
  196.     pid_loop=$!
  197. }

  198. function FrameAction()
  199. {
  200.     # 若游戏暂停,则不进行帧动作
  201.     if (( game_paused ))
  202.     then
  203.         return
  204.     fi

  205.     MoveSnake
  206.     if CheckAndEatFood
  207.     then
  208.         RandomFood
  209.     fi

  210.     DrawSnake
  211. }

  212. # 如果有吃到食物,返回真 0,否则返回假 1
  213. function CheckAndEatFood()
  214. {
  215.     if (( pos_head_r != food_pos_r || pos_head_c != food_pos_c ))
  216.     then
  217.         return 1
  218.     fi

  219.     snake[$snake_len]=$food
  220.     pos_snake_r[$snake_len]=$old_tail_pos_r
  221.     pos_snake_c[$snake_len]=$old_tail_pos_c
  222.     (( ++snake_len ))

  223.     return 0
  224. }

  225. function MoveSnake()
  226. {
  227.     case $move_dir in
  228.         'U') (( pos_head_r = ((pos_head_r - 1 + game_map_height - $GAME_AREA_TOP) % game_map_height) + $GAME_AREA_TOP )) ;;
  229.         'D') (( pos_head_r = ((pos_head_r + 1 + game_map_height - $GAME_AREA_TOP) % game_map_height) + $GAME_AREA_TOP )) ;;
  230.         'L') (( pos_head_c = ((pos_head_c - 1 + game_map_width - $GAME_AREA_LEFT) % game_map_width) + $GAME_AREA_LEFT )) ;;
  231.         'R') (( pos_head_c = ((pos_head_c + 1 + game_map_width - $GAME_AREA_LEFT) % game_map_width) + $GAME_AREA_LEFT )) ;;
  232.         *)    return ;;
  233.     esac

  234.     (( tail_index = snake_len - 1 ))
  235.     old_tail_pos_r=${pos_snake_r[$tail_index]}
  236.     old_tail_pos_c=${pos_snake_c[$tail_index]}

  237.     for (( i = snake_len - 1; i >= 1; --i ))
  238.     do
  239.         pos_snake_r[$i]=${pos_snake_r[$(( i - 1 ))]}
  240.         pos_snake_c[$i]=${pos_snake_c[$(( i - 1 ))]}
  241.     done

  242.     pos_snake_r[0]=$pos_head_r
  243.     pos_snake_c[0]=$pos_head_c
  244. }

  245. function DrawSnake()
  246. {
  247.     echo -ne "${ESC}[${old_tail_pos_r};${old_tail_pos_c}H "

  248.     for (( i = 0; i < snake_len; ++i ))
  249.     do
  250.         pos_r=${pos_snake_r[$i]}
  251.         pos_c=${pos_snake_c[$i]}

  252.         echo -ne "${ESC}[${pos_r};${pos_c}H${snake[$i]}"
  253.     done
  254. }

  255. function DrawSnakeXXX()
  256. {
  257.     echo -ne "${ESC}[${old_tail_pos_r};${old_tail_pos_c}H "

  258.     for (( i = 1; i < snake_len - 1; ++i ))
  259.     do
  260.         (( j = i - 1 ))
  261.         pos_r=${pos_snake_r[$j]}
  262.         pos_c=${pos_snake_c[$j]}

  263.         echo -ne "${ESC}[${pos_r};${pos_c}H${snake[$i]}"
  264.     done

  265.     echo -ne "${ESC}[${pos_head_r};${pos_head_c}H${snake[0]}"
  266. }

  267. function RandomFood()
  268. {
  269.     # 暂不考虑蛇满屏的时候无法生成新食物的情况
  270.     while true
  271.     do
  272.         (( food_pos_r = $(random game_map_height) + $GAME_AREA_TOP ))
  273.         (( food_pos_c = $(random game_map_width) + $GAME_AREA_LEFT ))

  274.         again=0
  275.         for (( i = 0; i < snake_len; ++i ))
  276.         do
  277.             if (( pos_snake_r[i] == food_pos_r && pos_snake_c[i] == food_pos_c ))
  278.             then
  279.                 again=1
  280.                 break
  281.             fi
  282.         done

  283.         if (( again == 0 ))
  284.         then
  285.             break
  286.         fi
  287.     done

  288.     food_style_index=$(random $food_style_count)
  289.     food=${food_style[$food_style_index]}
  290.     echo -ne "${ESC}[${food_pos_r};${food_pos_c}H$food"
  291. }

  292. # 退出游戏清理操作
  293. function ExitClear()
  294. {
  295.     # 恢复大小写case比较的开关
  296.     shopt -u nocasematch

  297.     # 恢复stty配置
  298.     stty $stty_save
  299.     tput cnorm

  300.     clear
  301. }

  302. # 绘制边界
  303. function DrawBorder()
  304. {
  305.     local i
  306.     local border_h
  307.     local border_v
  308.     local r
  309.     local c
  310.     local c2

  311.     border_h=""
  312.     for (( i = 0; i < GAME_AREA_WIDTH + 1; ++i ))
  313.     do
  314.         border_h="$border_h$BORDER_H"
  315.     done

  316.     # 画顶边
  317.     r=$(( GAME_AREA_TOP - 1 ))
  318.     c=$(( GAME_AREA_LEFT - 1 ))
  319.     echo -ne "${ESC}[${r};${c}H${border_h}"

  320.     # 画底边
  321.     r=$(( GAME_AREA_TOP + GAME_AREA_HEIGHT ))
  322.     echo -ne "${ESC}[${r};${c}H${border_h}"

  323.     c2=$(( GAME_AREA_LEFT - 1 + GAME_AREA_WIDTH + 1 ))
  324.     for (( r = GAME_AREA_TOP - 1; r < GAME_AREA_TOP + GAME_AREA_HEIGHT + 1; ++r ))
  325.     do
  326.         echo -ne "${ESC}[${r};${c}H${BORDER_V}${ESC}[${r};${c2}H${BORDER_V}"
  327.     done
  328. }

  329. # 主函数
  330. function Main()
  331. {
  332.     Init

  333.     GameStart
  334.     Input
  335.     ExitClear
  336. }

  337. Main
复制代码


论坛徽章:
207
2022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之全北现代
日期:2016-05-11 17:05:27操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:22:58数据库技术版块每日发帖之星
日期:2016-05-10 19:23:04数据库技术版块每日发帖之星
日期:2016-05-10 19:23:04操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58操作系统版块每日发帖之星
日期:2016-05-10 19:22:58
发表于 2017-03-10 07:01 |显示全部楼层
楼上代码水平亮了

论坛徽章:
2
2017金鸡报晓
日期:2017-01-10 15:19:56码神
日期:2017-03-28 10:30:40
发表于 2017-03-10 13:43 |显示全部楼层
盖楼                                                                     

论坛徽章:
2
2017金鸡报晓
日期:2017-01-10 15:19:56码神
日期:2017-03-28 10:30:40
发表于 2017-03-10 13:47 |显示全部楼层
58楼                                                                        

论坛徽章:
2
2017金鸡报晓
日期:2017-01-10 15:19:56码神
日期:2017-03-28 10:30:40
发表于 2017-03-10 13:52 |显示全部楼层
#!/usr/bin/env python
print "女神,三八节快乐!"

论坛徽章:
49
15-16赛季CBA联赛之福建
日期:2016-06-22 16:22:002015年亚洲杯之中国
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36双鱼座
日期:2015-01-02 22:04:33午马
日期:2014-11-25 09:58:35辰龙
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43ChinaUnix元老
日期:2015-01-30 15:14:07
发表于 2017-03-10 14:10 |显示全部楼层
请问什么是祖传染色体啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

久等啦!10张门票开启你的DTCC2017之旅

2017中国数据库技术大会将于2017年5月11-13日如约而至,本届大会以“数据驱动•价值发现”为主题,共设定2大主场和21个技术专场,云集海内外120+位技术大牛,共同探讨Oracle、MySQL、NoSQL、云端数据库、区块链、深度学习等领域的前瞻性热点话题。
即日起,填写DTCC2017会前调查问卷,即有机会赢取价值2600元的大会门票1张!仅限10张!
----------------------------------------
活动截止时间:2017年5月5日统一公布

问卷入口>>
  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP