Project1

标题: 贪吃蛇小游戏 [打印本页]

作者: flyfairy    时间: 2011-8-31 10:50
标题: 贪吃蛇小游戏
本帖最后由 flyfairy 于 2011-8-31 11:54 编辑

贪吃蛇小游戏
使用方法:直接在事件或脚本中使用$scene =Scene_Snake.new
  1. #==============================================================================
  2. # ■ Scene_Snake
  3. #------------------------------------------------------------------------------
  4. #  贪吃蛇小游戏
  5. #==============================================================================

  6. class Scene_Snake
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始化对像
  9.   #--------------------------------------------------------------------------
  10.   def initialize
  11.      $SIZE = 30 # 图块大小
  12.      $WIDTH = 30 * 16 #界面宽度
  13.      $HEIGHT = 30 * 16 #界面高度
  14.      @score = 0 # 初始分数
  15.      @level = 1 # 初始化难度等级
  16.      @max_length =  35 # 初始化贪吃蛇最大长度
  17.      @array_snake = [[3,6],[4,6],[5,6],[6,6],[7,6],[8,6],[9,6]] # 初始化贪吃蛇
  18.      @speed = 7 # 初始化速度,数值越大,移动速度越慢
  19.      @direction = "left"  # 初始化方向
  20.      @run = false # 初始化贪吃蛇是否为运动状态
  21.      @time_count = 0 # 计时器
  22.      @food_exist = false # 标记食物是否存在
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 主处理
  26.   #--------------------------------------------------------------------------
  27.   def main
  28.     # 贪吃蛇背景
  29.     @sprite = Sprite.new
  30.     @sprite.bitmap = Bitmap.new(640,480)
  31.     @sprite.bitmap.fill_rect(0, 0, 640, 480, Color.new(0,0,0))
  32.     # 初始化屏幕
  33.     @sprite_clear = Sprite.new
  34.     @sprite_clear.bitmap = Bitmap.new($WIDTH,$HEIGHT)
  35.     @sprite_clear.bitmap.fill_rect(0, 0, $WIDTH, $HEIGHT, Color.new(0,255,255))
  36.     @sprite_clear.bitmap.fill_rect(2, 2, $WIDTH - 4, $HEIGHT - 4, Color.new(0,0,0))
  37.     # 显示得分
  38.     @sprite_score = Sprite.new
  39.     @sprite_score.bitmap = Bitmap.new(640 - $WIDTH,$HEIGHT)
  40.     @sprite_score.x = 480
  41.     @sprite_score.y = 0
  42.     refresh_score
  43.     # 初始化蛇的图形
  44.     @sprite_snake = []
  45.     for i in 0...@array_snake.length
  46.       @sprite_snake[i] = Sprite.new
  47.       @sprite_snake[i].bitmap = Bitmap.new($SIZE,$SIZE)
  48.       @sprite_snake[i].x = @array_snake[i][0] * $SIZE
  49.       @sprite_snake[i].y = @array_snake[i][1] * $SIZE
  50.       @sprite_snake[i].bitmap.clear
  51.       @sprite_snake[i].bitmap.fill_rect(0, 0, $SIZE, $SIZE, Color.new(0,0,0))
  52.       @sprite_snake[i].bitmap.fill_rect(2, 2, $SIZE - 4, $SIZE - 4, Color.new(150,150,150))
  53.       @sprite_snake[i].bitmap.fill_rect(5, 5, $SIZE - 10, $SIZE - 10, Color.new(255,255,255))
  54.     end
  55.     # 描绘食物
  56.     @sprite_food = Sprite.new
  57.     @sprite_food.bitmap = Bitmap.new($SIZE,$SIZE)
  58.     # 执行过渡
  59.     Graphics.transition
  60.     # 主循环
  61.     loop do
  62.       # 刷新游戏画面
  63.       Graphics.update
  64.       # 刷新输入信息
  65.       Input.update
  66.       # 刷新画面情报
  67.       update
  68.       # 如果画面被切换的话就中断循环
  69.       if $scene != self
  70.         break
  71.       end
  72.     end
  73.     # 准备过渡
  74.     Graphics.freeze
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● 刷新画面
  78.   #--------------------------------------------------------------------------
  79.   def update
  80.     # 如果食物不存在则描绘食物
  81.     if @food_exist == false
  82.       draw_food # 描绘食物
  83.       @food_exist = true
  84.     end
  85.     # 开始运动
  86.     start_move
  87.     # 如果贪吃蛇正在运动
  88.     if @run
  89.       if @time_count%@speed == 0
  90.         move # 移动
  91.         # 吃到食物
  92.         if check_eat
  93.           # 刷新得分
  94.           @score += 1
  95.           # 刷新等级
  96.           if @score >= @level * 20
  97.             @level += 1
  98.             @speed -= 1
  99.             if @level > 6
  100.               p "恭喜你,你已成功通关!"
  101.               exit
  102.             end
  103.           end
  104.           refresh_score
  105.           # 增加贪吃蛇长度
  106.           if @array_snake.length < @max_length
  107.             @array_snake.push([@array_snake[@array_snake.length-1][0],
  108.             @array_snake[@array_snake.length-1][1]])
  109.             @sprite_snake[@array_snake.length-1] = Sprite.new
  110.             @sprite_snake[@array_snake.length-1].bitmap = Bitmap.new($SIZE,$SIZE)
  111.           end
  112.           @food_exist = false
  113.         end
  114.         # 如果撞到墙壁或自身则游戏结束
  115.         if check_collision
  116.           game_over
  117.         end
  118.       end
  119.     end
  120.     @time_count += 1
  121.   end
  122.   # 开始运动
  123.   def start_move
  124.     # 按下方向键后开始运动
  125.     if Input.trigger?(Input::UP)
  126.       unless @direction == "down"
  127.         @run = true
  128.         @direction = "up"
  129.       end
  130.     end
  131.     if Input.trigger?(Input::DOWN)
  132.       unless @direction == "up"
  133.         @run = true
  134.         @direction = "down"
  135.       end
  136.     end
  137.     if Input.trigger?(Input::LEFT)
  138.       unless @direction == "right"
  139.         @run = true
  140.         @direction = "left"
  141.       end
  142.     end
  143.     if Input.trigger?(Input::RIGHT)
  144.       unless @direction == "left"
  145.         @run = true
  146.         @direction = "right"
  147.       end
  148.     end
  149.   end
  150.   # 贪吃蛇移动
  151.   def move
  152.     case @direction
  153.     when "up"
  154.       for i in 1...@array_snake.length
  155.         @array_snake[@array_snake.length-i][0] = @array_snake[@array_snake.length-i-1][0]
  156.         @array_snake[@array_snake.length-i][1] = @array_snake[@array_snake.length-i-1][1]
  157.       end
  158.       @array_snake[0][1] -= 1
  159.     when "down"
  160.       for i in 1...@array_snake.length
  161.         @array_snake[@array_snake.length-i][0] = @array_snake[@array_snake.length-i-1][0]
  162.         @array_snake[@array_snake.length-i][1] = @array_snake[@array_snake.length-i-1][1]
  163.       end
  164.       @array_snake[0][1] += 1
  165.     when "left"
  166.       for i in 1...@array_snake.length
  167.         @array_snake[@array_snake.length-i][0] = @array_snake[@array_snake.length-i-1][0]
  168.         @array_snake[@array_snake.length-i][1] = @array_snake[@array_snake.length-i-1][1]
  169.       end
  170.       @array_snake[0][0] -= 1
  171.     when "right"
  172.       for i in 1...@array_snake.length
  173.         @array_snake[@array_snake.length-i][0] = @array_snake[@array_snake.length-i-1][0]
  174.         @array_snake[@array_snake.length-i][1] = @array_snake[@array_snake.length-i-1][1]
  175.       end
  176.       @array_snake[0][0] += 1
  177.     end
  178.     draw_snake # 描绘贪吃蛇
  179.   end
  180.   # 清屏
  181.   def clear_screen
  182.     @sprite_clear = Sprite.new
  183.     @sprite_clear.bitmap = Bitmap.new($WIDTH,$HEIGHT)
  184.     @sprite_clear.bitmap.clear
  185.     @sprite_clear.bitmap.fill_rect(0, 0, $WIDTH, $HEIGHT, Color.new(0,255,255))
  186.     @sprite_clear.bitmap.fill_rect(2, 2, $WIDTH - 4, $HEIGHT - 4, Color.new(0,0,0))
  187.   end
  188.   # 刷新得分
  189.   def refresh_score
  190.     @sprite_score.bitmap.clear
  191.     @sprite_score.bitmap.font.size = 18
  192.     @sprite_score.bitmap.draw_text(10, 0, 160, 32, "您的得分为:" + @score.to_s)
  193.     @sprite_score.bitmap.draw_text(10, 32, 160, 32, "蛇身长度为:" + @array_snake.length.to_s)
  194.     @sprite_score.bitmap.draw_text(10, 64, 160, 32, "当前等级为:" + @level.to_s)
  195.     @sprite_score.bitmap.draw_text(10, 440, 160, 32, "程序设计:flyfairy")
  196.   end
  197.   # 描绘图块
  198.   def draw_spriteset(x,y)
  199.     @sprite_spriteset = Sprite.new
  200.     @sprite_spriteset.bitmap = Bitmap.new($SIZE,$SIZE)
  201.     @sprite_spriteset.x = x
  202.     @sprite_spriteset.y = y
  203.     @sprite_spriteset.bitmap.clear
  204.     @sprite_spriteset.bitmap.fill_rect(0, 0, $SIZE, $SIZE, Color.new(0,0,0))
  205.     @sprite_spriteset.bitmap.fill_rect(2, 2, $SIZE - 4, $SIZE - 4, Color.new(150,150,150))
  206.     @sprite_spriteset.bitmap.fill_rect(5, 5, $SIZE - 10, $SIZE - 10, Color.new(255,255,255))
  207.   end
  208.   # 生成食物坐标
  209.   def creat_food
  210.     loop do
  211.       food_x = rand(16)
  212.       food_y = rand(16)
  213.       creat_succes = true # 标记是否成功生成的开关
  214.       for i in 0...@array_snake.length
  215.         if food_x == @array_snake[i][0] and food_y == @array_snake[i][1]
  216.           creat_succes = false
  217.         end
  218.       end
  219.       # 如果成功生成食物则中断循环
  220.       if creat_succes
  221.         return food_x * $SIZE,food_y * $SIZE
  222.         break
  223.       end
  224.     end
  225.   end
  226.   # 描绘食物
  227.   def draw_food
  228.     @food_x,@food_y = creat_food
  229.     @sprite_food.bitmap.clear
  230.     @sprite_food.x = @food_x
  231.     @sprite_food.y = @food_y
  232.     @sprite_food.bitmap.fill_rect(0, 0, $SIZE, $SIZE, Color.new(0,0,0))
  233.     @sprite_food.bitmap.fill_rect(2, 2, $SIZE - 4, $SIZE - 4, Color.new(50,50,200))
  234.     @sprite_food.bitmap.fill_rect(5, 5, $SIZE - 10, $SIZE - 10, Color.new(250,50,50))
  235.   end
  236.   # 描绘蛇的图形
  237.   def draw_snake
  238.     for i in 0...@array_snake.length
  239.       @sprite_snake[i].x = @array_snake[i][0] * $SIZE
  240.       @sprite_snake[i].y = @array_snake[i][1] * $SIZE
  241.       @sprite_snake[i].bitmap.clear
  242.       @sprite_snake[i].bitmap.fill_rect(0, 0, $SIZE, $SIZE, Color.new(0,0,0))
  243.       @sprite_snake[i].bitmap.fill_rect(2, 2, $SIZE - 4, $SIZE - 4, Color.new(150,150,150))
  244.       @sprite_snake[i].bitmap.fill_rect(5, 5, $SIZE - 10, $SIZE - 10, Color.new(255,255,255))
  245.     end
  246.   end
  247.   # 检测贪吃蛇是否撞到墙壁或自身
  248.   def check_collision
  249.     if @array_snake[0][0] < 0 or @array_snake[0][0] > 15 or
  250.       @array_snake[0][1] < 0 or @array_snake[0][1] > 15
  251.       return true
  252.     end
  253.     for i in 1...@array_snake.length
  254.       if @array_snake[0][0] == @array_snake[i][0] and
  255.         @array_snake[0][1] == @array_snake[i][1]
  256.         return true
  257.       end
  258.     end
  259.     return false
  260.   end
  261.   # 检测是否吃到食物
  262.   def check_eat
  263.     if @array_snake[0][0] == @food_x/$SIZE and @array_snake[0][1] == @food_y/$SIZE
  264.       return true
  265.     end
  266.   end
  267.   # 游戏结束的处理
  268.   def game_over
  269.     print "很遗憾,游戏结束!你的游戏得分为:#{@score}"
  270.     exit
  271.   end
  272. end
复制代码

作者: 絀神入化    时间: 2011-8-31 11:07
不行啊,VX报错
作者: flyfairy    时间: 2011-8-31 11:55
已经改过来了
作者: 老军师    时间: 2011-8-31 14:34
vx 大小不对啊...
作者: Baby丶小CC    时间: 2013-4-6 12:23
额,我看是适合XP的
作者: joe5491    时间: 2013-4-6 15:30
看到這個東西害我想到我以前用跟隨腳本加事件做的「貪食人」
p.s.就是一堆人跟著主角,然後主角會一直往前跑,吃到東西身後多一個人跟隨,當不能行走時死亡。

其實「貪食人」感覺超詭異的....
作者: chd114    时间: 2013-4-6 20:35
joe5491 发表于 2013-4-6 15:30
看到這個東西害我想到我以前用跟隨腳本加事件做的「貪食人」
p.s.就是一堆人跟著主角,然後主角會一直往前 ...

这尼玛就是乱伦···




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1