#!/usr/bin/env ruby # cGREENits to: http://en.wikipedia.org/wiki/Maze_generation_algorithm require 'gosu' include Gosu require "observer" module AMazeIng DIMENSION = 700 SIDE_BAR = 180 class GameWindow < Window $rows = $cols = 10 def initialize(full_screen, game_mode) @game_mode = game_mode super DIMENSION + SIDE_BAR, DIMENSION, full_screen, 1 self.caption = "Maze" new_round if @game_mode == 1 @infor = Infor.new elsif @game_mode == 2 @infor = Infor.new(Color::GREEN, Color::AQUA) elsif @game_mode == 3 @infor = Infor.new(Color::GREEN, Color::RED) end end def new_round $rows += 2 $cols += 2 @maze = Maze.new @maze.generate_maze if @game_mode == 1 @player = Player.new(1, 0, Color::GREEN) elsif @game_mode == 2 @player = Player.new(1, 0, Color::GREEN) @player_2 = Player.new(0, 1, Color::AQUA) elsif @game_mode == 3 @player = Player.new(1, 0, Color::GREEN) @player_2 = Player.new($cols-1, 0, Color::RED) end end def draw_target(cell) cell_index_x = cell.cell_index_x cell_index_y = cell.cell_index_y x = (cell_index_x * $cell_size) + $cell_size/2 - $player_size/2 y = (cell_index_y * $cell_size) + $cell_size/2 - $player_size/2 draw_quad x, y, Color::WHITE, x+$player_size, y, Color::WHITE, x+$player_size, y+$player_size, Color::WHITE, x, y+$player_size, Color::WHITE end def check_for_finish(player) if player.cell_index_x == $cells[-1].cell_index_x && player.cell_index_y == $cells[-1].cell_index_y new_round @infor.level += 1 return true else return false end end def check_for_collision(player_1, player_2) if player_2.cell_index_x == player_1.cell_index_x and player_2.cell_index_y == player_1.cell_index_y new_round @infor.level += 1 return true else return false end end def update if @game_mode == 1 check_for_finish(@player) @player.move elsif @game_mode == 2 if check_for_finish(@player) @infor.player_1_point += 1 end @player.move if check_for_finish(@player_2) @infor.player_2_point += 1 end @player_2.move elsif @game_mode == 3 if check_for_finish(@player) @infor.player_1_point += 1 end @player.move if check_for_collision(@player, @player_2) @infor.player_2_point += 1 end @player_2.move end @infor.update end def draw $cells.each do |cell| if cell.visited cell.draw($cell_size, Color::BLUE) else cell.draw($cell_size, Color::GREEN) end end @player.draw @player_2.draw if @game_mode == 2 or @game_mode == 3 @infor.draw draw_target($cells[-1]) end # check weather the direction player want to go to available or not # if available, set new status for player def check_available_move(path, player) if !$cells[player.cell_index_x + player.cell_index_y * $cols].walls[path] player.set_status(path) player.is_moving = true end end def button_down(id) if id == Gosu::KB_LEFT check_available_move(3, @player) end if id == Gosu::KB_RIGHT check_available_move(1, @player) end if id == Gosu::KB_UP check_available_move(0, @player) end if id == Gosu::KB_DOWN check_available_move(2, @player) end # control keys for player 2 if @game_mode == 2 or @game_mode == 3 if id == Gosu::KB_A check_available_move(3, @player_2) end if id == Gosu::KB_D check_available_move(1, @player_2) end if id == Gosu::KB_W check_available_move(0, @player_2) end if id == Gosu::KB_S check_available_move(2, @player_2) end end if id == Gosu::KB_ESCAPE close else super end end end end