Ruby 语言 实现五子棋对弈程序 控制台落子 / 胜负判断 / 悔棋功能

Ruby阿木 发布于 1 天前 5 次阅读


Ruby 五子棋对弈程序实现

五子棋是一种古老的策略棋类游戏,起源于中国。我们将使用Ruby语言实现一个简单的五子棋对弈程序,包括控制台落子、胜负判断和悔棋功能。通过这个程序,我们可以学习到Ruby的基本语法、面向对象编程以及一些常用的算法。

程序设计

1. 游戏界面

我们需要设计一个简单的控制台界面,用于显示棋盘和玩家落子。

ruby
class GameBoard
attr_accessor :board

def initialize
@board = Array.new(15) { Array.new(15, ' ') }
end

def display
puts ' ' + ('A'..'O').to_a.join(' ')
@board.each_with_index do |row, i|
puts (i + 1).to_s + ' ' + row.join(' ')
end
end

def place_piece(player, x, y)
@board[x][y] = player
end
end

2. 游戏逻辑

接下来,我们需要实现游戏逻辑,包括落子、胜负判断和悔棋功能。

ruby
class Game
attr_accessor :board, :player1, :player2, :current_player

def initialize
@board = GameBoard.new
@player1 = 'X'
@player2 = 'O'
@current_player = @player1
end

def play
loop do
@board.display
puts "Player {current_player}, enter your move (row column):"
row, col = gets.chomp.split.map(&:to_i)
if valid_move?(row, col)
@board.place_piece(current_player, row, col)
if check_winner?(row, col)
@board.display
puts "Player {current_player} wins!"
break
end
@current_player = @current_player == @player1 ? @player2 : @player1
else
puts "Invalid move. Try again."
end
end
end

private

def valid_move?(row, col)
row.between?(0, 14) && col.between?(0, 14) && @board.board[row][col] == ' '
end

def check_winner?(row, col)
directions = [[1, 0], [0, 1], [1, 1], [1, -1]]
directions.any? do |dx, dy|
count = 1
(1..4).each do |i|
if (row + i dx).between?(0, 14) && (col + i dy).between?(0, 14) && @board.board[row + i dx][col + i dy] == current_player
count += 1
else
break
end
end
count == 5
end
end
end

3. 悔棋功能

为了实现悔棋功能,我们需要保存每一步的落子信息。

ruby
class Game
... (其他代码保持不变)

def initialize
@board = GameBoard.new
@player1 = 'X'
@player2 = 'O'
@current_player = @player1
@history = []
end

def play
loop do
@board.display
puts "Player {current_player}, enter your move (row column):"
row, col = gets.chomp.split.map(&:to_i)
if valid_move?(row, col)
@board.place_piece(current_player, row, col)
@history.push([current_player, row, col])
if check_winner?(row, col)
@board.display
puts "Player {current_player} wins!"
break
end
@current_player = @current_player == @player1 ? @player2 : @player1
else
puts "Invalid move. Try again."
end
end
end

def undo_move
if @history.any?
last_move = @history.pop
@board.board[last_move[1]][last_move[2]] = ' '
@current_player = last_move[0]
else
puts "No moves to undo."
end
end
end

4. 主程序

我们需要编写主程序,用于启动游戏。

ruby
def main
game = Game.new
game.play
puts "Do you want to undo the last move? (yes/no)"
if gets.chomp.downcase == 'yes'
game.undo_move
end
end

main

总结

本文使用Ruby语言实现了一个简单的五子棋对弈程序,包括控制台落子、胜负判断和悔棋功能。通过这个程序,我们可以学习到Ruby的基本语法、面向对象编程以及一些常用的算法。在实际开发中,我们可以根据需求进一步完善程序,例如添加图形界面、网络对战等功能。