Ruby 语言 实现推箱子游戏 关卡编辑 / 移动逻辑 / 胜利条件检测

Ruby阿木 发布于 18 小时前 2 次阅读


Ruby 推箱子游戏实现:关卡编辑、移动逻辑与胜利条件检测

推箱子游戏(Sokoban)是一款经典的益智游戏,玩家需要控制一个小箱子移动到指定的位置。本文将使用Ruby语言实现一个简单的推箱子游戏,包括关卡编辑、移动逻辑和胜利条件检测等功能。

环境搭建

在开始编写代码之前,我们需要搭建一个Ruby开发环境。以下是基本的步骤:

1. 安装Ruby:从官网(https://www.ruby-lang.org/zh_cn/downloads/)下载并安装Ruby。
2. 安装Gem:Ruby的包管理器,用于安装和管理Ruby库。可以通过以下命令安装:

ruby
gem install bundler

3. 创建项目目录:创建一个新目录,用于存放游戏代码。

shell
mkdir sokoban
cd sokoban

4. 初始化Gemfile:创建一个Gemfile文件,用于管理项目依赖。

ruby
source 'https://rubygems.org'

gem 'gosu'

5. 安装Gem:通过以下命令安装Gemfile中列出的Gem。

shell
bundle install

关卡编辑

在推箱子游戏中,关卡编辑是至关重要的。以下是一个简单的关卡编辑器,允许用户创建和保存关卡。

ruby
class LevelEditor
def initialize
@grid = []
@player_position = [0, 0]
@box_positions = []
@goal_positions = []
end

def add_wall(x, y)
@grid[y][x] = ''
end

def add_player(x, y)
@grid[y][x] = 'P'
@player_position = [x, y]
end

def add_box(x, y)
@grid[y][x] = 'B'
@box_positions << [x, y]
end

def add_goal(x, y)
@grid[y][x] = 'G'
@goal_positions << [x, y]
end

def save_level(filename)
File.open(filename, 'w') do |file|
@grid.each do |row|
file.write(row.join)
file.write("")
end
end
end

def load_level(filename)
File.readlines(filename).each_with_index do |line, y|
@grid[y] = line.chomp.chars
@grid[y].each_with_index do |cell, x|
case cell
when 'P'
@player_position = [x, y]
when 'B'
@box_positions << [x, y]
when 'G'
@goal_positions << [x, y]
end
end
end
end
end

移动逻辑

移动逻辑是推箱子游戏的核心。以下是一个简单的移动逻辑实现:

ruby
class Game
def initialize(level_file)
@level = Level.new(level_file)
@player = Player.new(@level, @level.player_position)
@boxes = @level.box_positions.map { |pos| Box.new(@level, pos) }
@goals = @level.goal_positions
end

def run
loop do
print_level
print_status
move_player
check_victory
break if @level.game_over?
end
end

private

def print_level
@level.grid.each { |row| puts row.join }
end

def print_status
puts "Player: {@player.position}"
puts "Boxes: {@boxes.map { |box| box.position }.join(', ')}"
end

def move_player
direction = gets.chomp.upcase
case direction
when 'W'
@player.move_up
when 'S'
@player.move_down
when 'A'
@player.move_left
when 'D'
@player.move_right
end
end

def check_victory
if @boxes.all? { |box| @goals.include?(box.position) }
puts "Congratulations! You've won!"
exit
end
end
end

胜利条件检测

胜利条件检测是判断游戏是否结束的关键。以下是一个简单的胜利条件检测实现:

ruby
class Level
attr_reader :grid, :player_position, :box_positions, :goal_positions

def initialize(filename)
@grid = []
@player_position = [0, 0]
@box_positions = []
@goal_positions = []
load_level(filename)
end

def load_level(filename)
File.readlines(filename).each_with_index do |line, y|
@grid[y] = line.chomp.chars
@grid[y].each_with_index do |cell, x|
case cell
when 'P'
@player_position = [x, y]
when 'B'
@box_positions << [x, y]
when 'G'
@goal_positions << [x, y]
end
end
end
end

def game_over?
@grid.flatten.include?('@')
end
end

总结

本文使用Ruby语言实现了一个简单的推箱子游戏,包括关卡编辑、移动逻辑和胜利条件检测等功能。通过以上代码,我们可以创建和保存关卡,控制玩家移动,并检测游戏是否结束。这只是一个简单的实现,我们可以在此基础上添加更多功能和优化。希望本文对您有所帮助!