Advertisement
LiTTleDRAgo

[RGSS/3] Minesweeper

May 16th, 2017
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 22.27 KB | None | 0 0
  1. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  2. #  • Minesweeper •                                          Date    :29-05-2014
  3. #  Original Author  :DrDhoom  
  4. #  XP / VXAce ver by LiTTleDRAgo
  5. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  6. #
  7. # How to call
  8. #   Xp  : $scene = Scene_Minesweeper.new
  9. #   Vxa : SceneManager.call(Scene_Minesweeper)
  10. #
  11. # Graphics used :
  12. #   - Graphics/System/minesweeper_back.png
  13. #   - Graphics/System/minesweeper_button.png
  14. #   - Graphics/System/minesweeper_flag.png
  15. #   - Graphics/System/minesweeper_mines.png
  16. #   - Graphics/System/minesweeper_selection.png
  17. #
  18. #:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
  19. module Minesweeper
  20.  
  21.   Difficulty = [
  22.     # Difficulty, Width, Height, Total Mine.
  23.     ['Monkey'   ,    20,     15,   4],
  24.     ['Easy'     ,     9,      9,  10],
  25.     ['Medium'   ,    15,     15,  40],
  26.     ['Hard'     ,    20,     15,  99],
  27.     ]
  28.    
  29.   Return_Scene = Scene_Map  
  30.  
  31.   # Variable which contain the result of the game.
  32.   Result_Variable = 10
  33.   # Result = -1 : lose
  34.   #           0 : escape
  35.   #           1 : win
  36.  
  37. end
  38.  
  39. ($imported ||= {})[:drdhoom_minesweeper] = 1.00
  40.  
  41. $imported[:drg_core_engine] || raise("This script needs Drago Core Engine")
  42. $imported[:drg_custom_input] || raise("This script needs Drago Custom Input")
  43. #==============================================================================
  44. # ** Window_Command
  45. #------------------------------------------------------------------------------
  46. #  This window deals with Scene_Minesweeper choices.
  47. #==============================================================================
  48. class Window_Minesweeper_Difficulty < Window_Command
  49.   #--------------------------------------------------------------------------
  50.   # * Create Command List
  51.   #--------------------------------------------------------------------------
  52.   def make_command_list
  53.     Minesweeper::Difficulty.compact.each do |diff|
  54.       add_command(diff[0], :"#{diff[0]}")
  55.     end
  56.   end
  57. end
  58.  
  59. #==============================================================================
  60. # ** Scene_Minesweeper
  61. #------------------------------------------------------------------------------
  62. #  This class performs the Minesweeper screen processing.
  63. #==============================================================================
  64. class Scene_Minesweeper
  65.   #--------------------------------------------------------------------------
  66.   # * Main
  67.   #--------------------------------------------------------------------------
  68.   def main
  69.     start
  70.     update while LiTTleDRAgo.scene == self
  71.     terminate
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # * Start Processing
  75.   #--------------------------------------------------------------------------
  76.   def start
  77.     create_main_viewport
  78.     init_value
  79.     Graphics.transition
  80.     create_window
  81.   end
  82.   #--------------------------------------------------------------------------
  83.   # * Create Viewport
  84.   #--------------------------------------------------------------------------
  85.   def create_main_viewport
  86.     @viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
  87.     @viewport.z = 200
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # * Frame Update
  91.   #--------------------------------------------------------------------------
  92.   def update
  93.     update_basic
  94.     if @start
  95.       update_info
  96.       update_player_input
  97.     elsif @result
  98.       update_result_input
  99.     end
  100.   end
  101.   #--------------------------------------------------------------------------
  102.   # * Update Frame (Basic)
  103.   #--------------------------------------------------------------------------
  104.   def update_basic
  105.     Graphics.update
  106.     Input.update
  107.     update_all_windows
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # * Update All Windows
  111.   #--------------------------------------------------------------------------
  112.   def update_all_windows
  113.     all = instance_variables.map {|s| instance_variable_get("#{s}")}.flatten
  114.     all.delete_if {|s| s.not.is_a?(Window) }
  115.     all.delete_if {|s| s.respond_to?(:disposed?) && s.disposed?}
  116.     all.update
  117.   end
  118.   #--------------------------------------------------------------------------
  119.   # * Termination Processing
  120.   #--------------------------------------------------------------------------
  121.   def terminate
  122.     all_variable_dispose
  123.     Graphics.freeze
  124.     Graphics.resize_screen(*@old_res) if @old_res
  125.     @button_sprite.flatten.dispose
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # * New method: init_value    
  129.   #--------------------------------------------------------------------------
  130.   def init_value
  131.     @start = false
  132.     @fail_safe = true
  133.     @index = [0,0]    
  134.     @hour = 0
  135.     @minute = 0
  136.     @second = 0
  137.     @frame = 0
  138.     @total_flag = 0  
  139.     @old_res = [Graphics.width, Graphics.height]
  140.   end
  141.   #--------------------------------------------------------------------------
  142.   # * New method: create_window    
  143.   #--------------------------------------------------------------------------
  144.   def create_window
  145.     return start_game unless LiTTleDRAgo::VXA
  146.     @window = Window_Minesweeper_Difficulty.new(Graphics.width/2,
  147.              Graphics.height/2)
  148.     @window.x -= @window.width/2
  149.     @window.y -= @window.height/2
  150.     @window.set_handler(:ok,      method(:start_game))
  151.   end  
  152.   #--------------------------------------------------------------------------
  153.   # * New method: start_game    
  154.   #--------------------------------------------------------------------------
  155.   def start_game        
  156.     unless (vxa = LiTTleDRAgo::VXA)
  157.       command = Minesweeper::Difficulty.collect {|diff| diff[0]}
  158.       command = Window_Command.new(200,command)
  159.       command.x = Graphics.width  / 2 - command.width / 2
  160.       command.y = Graphics.height / 2 - command.height / 2
  161.       Input.update
  162.       until Input.trigger?(Input::C)
  163.         update
  164.         command.update
  165.       end
  166.       Sound.play_ok
  167.     end
  168.     index = @window ? @window.index : command.index
  169.     @tile_col    = Minesweeper::Difficulty[index][1]
  170.     @tile_row    = Minesweeper::Difficulty[index][2]
  171.     @total_mines = Minesweeper::Difficulty[index][3]
  172.     Graphics.resize_screen(@tile_col*32,@tile_row*32)
  173.     if @window
  174.       @window.deactivate
  175.       @window.visible = false
  176.     else
  177.       command.dispose
  178.     end
  179.     create_spriteset
  180.     @start = true
  181.   end
  182.   #--------------------------------------------------------------------------
  183.   # * New method: create_spriteset    
  184.   #--------------------------------------------------------------------------
  185.   def create_spriteset
  186.     @viewport1 = Viewport.new(0,0,@tile_col*32,@tile_row*32)
  187.     @viewport2 = Viewport.new(0,0,@tile_col*32,@tile_row*32)
  188.     @viewport3 = Viewport.new(0,0,@tile_col*32,@tile_row*32)
  189.     @viewport1.z = 50
  190.     @viewport2.z = 30
  191.     @viewport3.z = 10
  192.     @back_sprite = Plane.new
  193.     @back_sprite.bitmap = begin
  194.       LiTTleDRAgo.cache.system("minesweeper_back")
  195.     rescue
  196.       if LiTTleDRAgo::VXA
  197.         LiTTleDRAgo.cache.tileset("Dungeon_A4").crop(0,320,32,32)
  198.       else
  199.         LiTTleDRAgo.cache.tileset("012-PortTown02").crop(32,32,32,32)
  200.       end
  201.     end
  202.     @number_sprite = Sprite.new
  203.     @number_sprite.bitmap = Bitmap.new(@tile_col*32,@tile_row*32)
  204.     @shadow_sprite = Sprite.new
  205.     @shadow_sprite.bitmap = Bitmap.new(@tile_col*32,@tile_row*32)
  206.     @selection_sprite = Sprite.new
  207.     @selection_sprite.bitmap = begin
  208.       LiTTleDRAgo.cache.system("minesweeper_selection")
  209.     rescue
  210.       b = Bitmap.new(32,32)
  211.       b.full_fill(Color.red)
  212.       b.fill_rect(Rect.new(2,2,28,28),Color.erase)
  213.       b
  214.     end
  215.     @selection_sprite.z = 99
  216.     for i in 0...@tile_row
  217.       for a in 0...@tile_col
  218.         ((@open||=[])[i]||=[])[a] = false
  219.         ((@mines||=[])[i]||=[])[a] = false
  220.         ((@flag||=[])[i]||=[])[a] = false
  221.         ((@button_sprite||=[])[i]||=[])[a] = Sprite.new
  222.         @button_sprite[i][a].bitmap = begin
  223.           LiTTleDRAgo.cache.system("minesweeper_button")
  224.         rescue
  225.           if LiTTleDRAgo::VXA
  226.             LiTTleDRAgo.cache.tileset("Dungeon_A4").crop(224,352,32,32)
  227.           else
  228.             LiTTleDRAgo.cache.tileset("012-PortTown02").crop(128,32,32,32)
  229.           end
  230.         end
  231.         @button_sprite[i][a].x = a*32
  232.         @button_sprite[i][a].y = i*32
  233.       end
  234.     end
  235.     @flag_sprite = Sprite.new
  236.     @flag_sprite.z = 60
  237.     @flag_sprite.bitmap = Bitmap.new(@tile_col*32,@tile_row*32)
  238.     @info_sprite = Sprite.new
  239.     @info_sprite.z = 70
  240.     @info_sprite.bitmap = Bitmap.new(@tile_col*32,@tile_row*32)
  241.     if @info_sprite.bitmap.font.respond_to?(:outline)
  242.       @info_sprite.bitmap.font.outline = false
  243.     end
  244.     @info_sprite.bitmap.font.size = 18
  245.   end
  246.   #--------------------------------------------------------------------------
  247.   # * New method: update_info    
  248.   #--------------------------------------------------------------------------
  249.   def update_info
  250.     @frame  += 1
  251.     @frame  == 60 && (@frame  = 0) && @second += 1
  252.     @second == 60 && (@second = 0) && @minute += 1
  253.     @minute == 60 && (@minute = 0) && @hour += 1
  254.     refresh_info_sprite
  255.   end
  256.   #--------------------------------------------------------------------------
  257.   # * New method: update_player_input    
  258.   #--------------------------------------------------------------------------
  259.   def update_player_input
  260.     if Input.repeat?(Input::DOWN)
  261.       return if @index[1] == @tile_row-1
  262.       Sound.play_cursor
  263.       @index[1] += 1
  264.       update_selection_sprite
  265.     elsif Input.repeat?(Input::UP)
  266.       return if @index[1] == 0
  267.       Sound.play_cursor
  268.       @index[1] -= 1
  269.       update_selection_sprite
  270.     elsif Input.repeat?(Input::LEFT)
  271.       return if @index[0] == 0
  272.       Sound.play_cursor
  273.       @index[0] -= 1
  274.       update_selection_sprite
  275.     elsif Input.repeat?(Input::RIGHT)
  276.       return if @index[0] == @tile_col-1
  277.       Sound.play_cursor
  278.       @index[0] += 1
  279.       update_selection_sprite
  280.     elsif Keyboard.trigger?(:Enter)
  281.       return Sound.play_cancel if @flag[@index[1]][@index[0]]
  282.       unless @open[@index[1]][@index[0]]
  283.         Sound.play_ok
  284.         if @fail_safe
  285.           calculate_mines_placement
  286.           refresh_number_sprite
  287.           open_tile(true)
  288.           @fail_safe = false
  289.         else
  290.           open_tile
  291.         end      
  292.         refresh_button_sprite
  293.         refresh_shadow_sprite
  294.         check_win_condition
  295.       end
  296.     elsif Keyboard.trigger?(:Backspace)
  297.       unless @open[@index[1]][@index[0]]
  298.         Sound.play_ok
  299.         place_flag
  300.         refresh_flag
  301.       end
  302.     elsif Keyboard.trigger?(:Esc)
  303.       Sound.play_cancel
  304.       if Minesweeper::Result_Variable
  305.         $game_variables[Minesweeper::Result_Variable] = 0
  306.       end
  307.       LiTTleDRAgo.scene = Minesweeper::Return_Scene.new
  308.     end
  309.   end
  310.   #--------------------------------------------------------------------------
  311.   # * New method: update_result_input    
  312.   #--------------------------------------------------------------------------
  313.   def update_result_input
  314.     if Keyboard.trigger?(:Enter)
  315.       Sound.play_ok
  316.       if (v = Minesweeper::Result_Variable)
  317.         $game_variables[v] = @result == :win ? 1 : -1
  318.       end
  319.       LiTTleDRAgo.scene = Minesweeper::Return_Scene.new
  320.     end
  321.   end
  322.   #--------------------------------------------------------------------------
  323.   # * New method: update_selection_sprite    
  324.   #--------------------------------------------------------------------------
  325.   def update_selection_sprite
  326.     @selection_sprite.x = @index[0]*32
  327.     @selection_sprite.y = @index[1]*32
  328.   end
  329.   #--------------------------------------------------------------------------
  330.   # * New method: calculate_mines_placement    
  331.   #--------------------------------------------------------------------------
  332.   def calculate_mines_placement
  333.     mines = @total_mines
  334.     while mines > 0
  335.       rw = rand(@tile_col)
  336.       rh = rand(@tile_row)
  337.       if !@mines[rh][rw]
  338.         if (rh < @index[1]-1 or rh > @index[1]+1) and
  339.           (rw < @index[0]-1 or rw > @index[0]+1)
  340.           @mines[rh][rw] = true
  341.           mines -= 1
  342.         end
  343.       end
  344.     end    
  345.   end
  346.   #--------------------------------------------------------------------------
  347.   # * New method: refresh_number_sprite    
  348.   #--------------------------------------------------------------------------
  349.   def refresh_number_sprite
  350.     @number_sprite.bitmap.font.size = 32
  351.     if @number_sprite.bitmap.font.respond_to?(:outline)
  352.       @number_sprite.bitmap.font.outline = false
  353.     end
  354.     @number = []
  355.     for i in 0...@tile_row
  356.       @number[i] = [] if @number[i].nil?
  357.       for a in 0...@tile_col
  358.         if @mines[i][a]
  359.           c = -1
  360.         else          
  361.           c = 0
  362.           o1 = i-1 < 0 ? 0 : i-1
  363.           o2 = i+1 > @tile_row-1 ? @tile_row-1 : i+1
  364.           p1 = a-1 < 0 ? 0 : a-1
  365.           p2 = a+1 > @tile_col-1 ? @tile_col-1 : a+1
  366.           for y in o1..o2
  367.             for x in p1..p2
  368.               if @mines[y] != nil and @mines[y][x] and [y,x] != [i,a]
  369.                 c += 1
  370.               end
  371.             end
  372.           end  
  373.         end
  374.         @number[i][a] = c
  375.         if c == -1
  376.           bitmap = begin
  377.             LiTTleDRAgo.cache.system("minesweeper_mines")
  378.           rescue
  379.             if LiTTleDRAgo::VXA
  380.               LiTTleDRAgo.cache.character("!Other1").crop(288,0,32,32)
  381.             else
  382.               LiTTleDRAgo.cache.character("183-Rock02",0).crop(0,0,32,32)
  383.             end
  384.           end
  385.           @number_sprite.bitmap.blt(a*32, i*32, bitmap, bitmap.rect)
  386.           bitmap.dispose
  387.         elsif c > 0
  388.           @number_sprite.bitmap.font.color = number_color(c)
  389.           @number_sprite.bitmap.draw_text(a*32, i*32,32,32,c.to_s,1)
  390.         end
  391.       end
  392.     end    
  393.   end
  394.   #--------------------------------------------------------------------------
  395.   # * New method: number_color    
  396.   #--------------------------------------------------------------------------
  397.   def number_color(index)
  398.     case index
  399.     when 1 then return Color.new(65,80,190)
  400.     when 2 then return Color.new(30,110,0)
  401.     when 3 then return Color.new(170,5,5)
  402.     when 4 then return Color.new(0,0,125)
  403.     when 5 then return Color.new(125,0,0)
  404.     when 6 then return Color.new(0,125,125)
  405.     when 7 then return Color.new(125,125,0)
  406.     when 8 then return Color.new(125,0,125)
  407.     end
  408.   end
  409.   #--------------------------------------------------------------------------
  410.   # * New method: refresh_button_sprite    
  411.   #--------------------------------------------------------------------------
  412.   def refresh_button_sprite
  413.     for y in 0...@tile_row
  414.       for x in 0...@tile_col
  415.         @open[y][x] && @button_sprite[y][x].visible = false
  416.       end
  417.     end
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # * New method: refresh_shadow_sprite    
  421.   #--------------------------------------------------------------------------
  422.   def refresh_shadow_sprite
  423.     (s = @shadow_sprite.bitmap).clear
  424.     for y in 0...@tile_row
  425.       for x in 0...@tile_col
  426.         if !@open[y][x] and @open[y][x+1]
  427.           s.fill_rect((x+1)*32,y*32,3,32,Color.new(0,0,0,80))
  428.         end
  429.         if !@open[y][x] and @open[y+1] != nil and @open[y+1][x]
  430.           s.fill_rect(x*32,(y+1)*32,32,3,Color.new(0,0,0,80))
  431.         end
  432.       end
  433.     end
  434.     @shadow_sprite.bitmap.blur
  435.   end
  436.   #--------------------------------------------------------------------------
  437.   # * New method: refresh_flag    
  438.   #--------------------------------------------------------------------------
  439.   def refresh_flag
  440.     @flag_sprite.bitmap.clear
  441.     for y in 0...@tile_row
  442.       for x in 0...@tile_col
  443.         if @flag[y][x]
  444.           bitmap = begin
  445.             LiTTleDRAgo.cache.system("minesweeper_flag")
  446.           rescue
  447.             b = Bitmap.new(32,32)
  448.             b.draw_edging_text(0,0,32,32,"*",1)
  449.             b
  450.           end
  451.           @flag_sprite.bitmap.blt(x*32,y*32,bitmap,bitmap.rect)
  452.           bitmap.dispose
  453.         end
  454.       end
  455.     end
  456.   end
  457.   #--------------------------------------------------------------------------
  458.   # * New method: refresh_info_sprite    
  459.   #--------------------------------------------------------------------------
  460.   def refresh_info_sprite    
  461.     @info_sprite.bitmap.clear
  462.     @info_sprite.bitmap.font.color = Color.new(255,0,0)
  463.     @info_sprite.bitmap.draw_text(0,12,Graphics.width-18,18,"Mines : "+
  464.             (@total_mines-@total_flag).to_s,2)
  465.     @info_sprite.bitmap.font.color = Color.new(0,0,0)
  466.     @info_sprite.bitmap.draw_text(0,30,Graphics.width-18,18,@hour.to_s +
  467.              ":" + @minute.to_s + ":" + @second.to_s.to_s,2)
  468.   end
  469.   #--------------------------------------------------------------------------
  470.   # * New method: open_tile
  471.   #--------------------------------------------------------------------------
  472.   def open_tile(clear = false)
  473.     index = @index
  474.     @open[index[1]][index[0]] = true
  475.     if @number[index[1]][index[0]] == -1
  476.       game_over
  477.     elsif @number[index[1]][index[0]] == 0
  478.       clear_tile([index[0],index[1]])
  479.     elsif @number[index[1]][index[0]] > 0 and !clear
  480.       flag = @number[index[1]][index[0]]
  481.       o1 = index[1]-1 > 0 ? index[1]-1 : 0
  482.       o2 = index[1]+1 < @tile_row-1 ? index[1]+1 : @tile_row-1
  483.       p1 = index[0]-1 > 0 ? index[0]-1 : 0
  484.       p2 = index[0]+1 < @tile_col-1 ? index[0]+1 : @tile_col-1
  485.       for y in o1..o2
  486.         for x in p1..p2
  487.           if @flag[y] != nil and @flag[y][x] != nil and @flag[y][x]
  488.             flag -= 1
  489.           end
  490.         end
  491.       end
  492.       return if flag != 0
  493.       for y in o1..o2
  494.         for x in p1..p2
  495.           if @open[y] != nil and @open[y][x] != nil and
  496.             [y][x] != index and !@open[y][x]  
  497.             if !@flag[y][x]
  498.               @open[y][x] = true
  499.               if @number[y][x] == -1
  500.                 game_over
  501.               elsif @number[y][x] == 0
  502.                 clear_tile([x,y])
  503.               end
  504.             end
  505.           end
  506.         end
  507.       end    
  508.     end    
  509.   end
  510.   #--------------------------------------------------------------------------
  511.   # * New method: place_flag
  512.   #--------------------------------------------------------------------------
  513.   def place_flag
  514.     @flag[@index[1]][@index[0]] = !@flag[@index[1]][@index[0]]# ? false : true
  515.     @total_flag = 0
  516.     for y in 0...@tile_row
  517.       for x in 0...@tile_col
  518.         if @flag[y][x]
  519.           @total_flag += 1
  520.         end
  521.       end
  522.     end
  523.   end
  524.   #--------------------------------------------------------------------------
  525.   # * New method: clear_tile
  526.   #--------------------------------------------------------------------------
  527.   def clear_tile(start)
  528.     zero = [[start[0],start[1]]]
  529.     while zero.size > 0
  530.       o1 = zero[0][1]-1 > 0 ? zero[0][1]-1 : 0
  531.       o2 = zero[0][1]+1 < @tile_row-1 ? zero[0][1]+1 : @tile_row-1
  532.       p1 = zero[0][0]-1 > 0 ? zero[0][0]-1 : 0
  533.       p2 = zero[0][0]+1 < @tile_col-1 ? zero[0][0]+1 : @tile_col-1
  534.       for y in o1..o2
  535.         for x in p1..p2
  536.           if @open[y] != nil and @open[y][x] != nil and
  537.             [[y][x]] != zero[0] and !@open[y][x] and @number[y][x] != -1
  538.             @open[y][x] = true
  539.             @number[y][x] == 0 && zero.push([x,y])
  540.           end
  541.         end
  542.       end
  543.       zero.delete_at(0)
  544.     end
  545.   end
  546.   #--------------------------------------------------------------------------
  547.   # * New method: game_over
  548.   #--------------------------------------------------------------------------
  549.   def game_over
  550.     @result = :lose
  551.     open_all_mines
  552.     Sound.play_buzzer
  553.     @sprite_end = Sprite.new
  554.     @sprite_end.z = 999
  555.     @sprite_end.y = Graphics.height/4+Graphics.height/4/2
  556.     @sprite_end.bitmap = Bitmap.new(Graphics.width,Graphics.height/4)
  557.     @sprite_end.bitmap.fill_rect(0,0,Graphics.width,
  558.           Graphics.height/4,Color.new(0,0,0,128))
  559.     @sprite_end.bitmap.font.size = Graphics.height/4/3
  560.     @sprite_end.bitmap.font.bold = true
  561.     @sprite_end.bitmap.draw_text(0,-12,
  562.           Graphics.width,Graphics.height/4,"You Lose!",1)
  563.     @sprite_end.bitmap.font.bold = false
  564.     @sprite_end.bitmap.draw_text(0,Graphics.height/4/3-12,
  565.           Graphics.width,Graphics.height/4,"Press Enter to exit",1)
  566.   end
  567.   #--------------------------------------------------------------------------
  568.   # * New method: victory
  569.   #--------------------------------------------------------------------------
  570.   def victory
  571.     @result = :win
  572.     open_all_mines
  573.     @sprite_end = Sprite.new
  574.     @sprite_end.z = 999
  575.     @sprite_end.y = Graphics.height/4+Graphics.height/4/2
  576.     @sprite_end.bitmap = Bitmap.new(Graphics.width,Graphics.height/4)
  577.     @sprite_end.bitmap.fill_rect(0,0,
  578.            Graphics.width,Graphics.height/4,Color.new(0,0,0,128))
  579.     @sprite_end.bitmap.font.size = Graphics.height/4/3
  580.     @sprite_end.bitmap.font.color = Color.new(255,255,60)
  581.     @sprite_end.bitmap.font.bold = true
  582.     @sprite_end.bitmap.draw_text(0,-12,
  583.            Graphics.width,Graphics.height/4,"You Win!",1)
  584.     @sprite_end.bitmap.font.bold = false
  585.     @sprite_end.bitmap.draw_text(0,Graphics.height/4/3-12,
  586.            Graphics.width,Graphics.height/4,"Press Enter to exit",1)
  587.   end
  588.   #--------------------------------------------------------------------------
  589.   # * New method: check_win_condition
  590.   #--------------------------------------------------------------------------
  591.   def check_win_condition
  592.     return if @result
  593.     a = 0
  594.     b = 0
  595.     c = LiTTleDRAgo::XP ? 4 : 0
  596.     for y in 0...@tile_row
  597.       for x in 0...@tile_col
  598.         if (@open[y] != nil and @open[y][x]) or
  599.           (@flag[y] != nil and @flag[y][x])
  600.           a += 1
  601.           @flag[y][x] && b += 1
  602.         end
  603.       end
  604.     end
  605.     if (a - @tile_col * @tile_row).abs <= c and b <= @total_mines
  606.       victory
  607.     end
  608.   end
  609.   #--------------------------------------------------------------------------
  610.   # * New method: open_all_mines
  611.   #--------------------------------------------------------------------------
  612.   def open_all_mines
  613.     for y in 0...@tile_row
  614.       for x in 0...@tile_col
  615.         @mines[y][x] && @open[y][x] = true
  616.       end
  617.     end
  618.     refresh_button_sprite
  619.     @start = false
  620.   end  
  621. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement