Ruby 语言 实现 2048 数字拼图游戏 控制台键盘操作 / 合并规则 / 胜利条件

Ruby阿木 发布于 2025-06-09 10 次阅读


Ruby 语言实现 2048 数字拼图游戏

2048 是一款流行的数字拼图游戏,玩家通过在 4x4 的网格中滑动数字方块来合并相同数值的方块,最终目标是拼出 2048 的方块。本文将使用 Ruby 语言实现一个控制台版本的 2048 游戏,包括键盘操作、合并规则和胜利条件。

游戏设计

游戏界面

游戏界面是一个 4x4 的网格,每个格子可以放置一个数字方块。数字方块从 2 开始,每次合并时数值翻倍。游戏开始时,随机两个格子放置数字方块。

控制台操作

玩家可以通过键盘上的方向键(上、下、左、右)来控制数字方块在网格中的移动。当玩家按下方向键时,所有方块会根据方向键的方向进行移动和合并。

合并规则

当两个相同数值的方块相邻时,它们会合并成一个方块,数值翻倍。合并后的方块会移动到合并前的位置,并可能触发新的合并。

胜利条件

当玩家无法通过移动来合并新的方块时,游戏结束。如果此时网格中存在 2048 的方块,则玩家获胜。

代码实现

初始化游戏

我们需要创建一个 4x4 的网格,并初始化数字方块。

ruby
class Game
attr_accessor :grid

def initialize
@grid = Array.new(4) { Array.new(4, 0) }
add_random_tile
add_random_tile
end

private

def add_random_tile
empty_positions = @grid.flatten.each_index.select { |i| @grid.flatten[i] == 0 }
position = empty_positions.sample
@grid.flatten[position] = rand(2..4)
end
end

游戏逻辑

接下来,我们需要实现游戏逻辑,包括移动方块、合并方块和检查胜利条件。

ruby
class Game
... (其他代码)

def move_up
@grid.transpose.each_with_index do |row, i|
row.each_with_index do |value, j|
next if value == 0
row.delete_at(j)
row.insert(i, value)
end
end
merge
add_random_tile
end

def move_down
@grid.each_with_index do |row, i|
row.each_with_index do |value, j|
next if value == 0
row.delete_at(j)
row.insert(3 - i, value)
end
end
merge
add_random_tile
end

def move_left
@grid.each do |row|
row.each_with_index do |value, i|
next if value == 0
row.delete_at(i)
row.insert(0, value)
end
end
merge
add_random_tile
end

def move_right
@grid.each do |row|
row.each_with_index do |value, i|
next if value == 0
row.delete_at(i)
row.insert(3, value)
end
end
merge
add_random_tile
end

private

def merge
@grid.each_with_index do |row, i|
row.each_with_index do |value, j|
next if value == 0
if j < 3 && row[j + 1] == value
row[j + 1] = 2
row[j] = 0
end
end
end
end

def game_over?
@grid.flatten.all? { |value| value == 0 || value == 2048 }
end
end

游戏控制

我们需要实现游戏控制逻辑,包括读取玩家输入和更新游戏状态。

ruby
class Game
... (其他代码)

def play
puts "Welcome to 2048!"
puts "Use the arrow keys to move the tiles."
puts "Press 'q' to quit."

while true
print "Enter your move (w/a/s/d): "
move = gets.chomp.downcase
break if move == 'q'

case move
when 'w'
move_up
when 'a'
move_left
when 's'
move_down
when 'd'
move_right
else
puts "Invalid move. Please try again."
next
end

if game_over?
puts "Game over! You've reached 2048."
break
end

print_grid
end
end

private

def print_grid
@grid.each do |row|
puts row.join(' ')
end
end
end

运行游戏

现在,我们可以创建一个 `Game` 实例并调用 `play` 方法来运行游戏。

ruby
game = Game.new
game.play

总结

本文使用 Ruby 语言实现了 2048 数字拼图游戏,包括控制台操作、合并规则和胜利条件。通过以上代码,我们可以运行一个简单的控制台版本的游戏,并享受拼图的乐趣。这个实现还有很多可以改进的地方,例如添加更复杂的用户界面、优化游戏性能等。希望这篇文章能帮助你了解 Ruby 语言在游戏开发中的应用。