战舰游戏——如何让玩家放置他们的船?

Battleship game - how to let players place their boats?

我正在 Ruby 中创建战舰游戏。目前,玩家有 2 艘船(3 号和 4 号),我在代码中随意放置了这些船。

每个玩家都有自己的棋盘(array1/array2):我在空位时放 0,在有船时放 1。

我的问题是,我怎样才能让玩家自己把他们的船放在他们的棋盘上? 我的想法是让他们输入每艘船的第一个点,然后让他们在侧面(北、东、南和西)设置方向。 显然,一艘船不能放在界外,也不能与另一艘船放在同一个 space 上。

我如何用我的代码确保这一点?我不知道从哪里开始...

谢谢!

# Board for player 1
board1 = []
for i in 0..4
  board1[i] = []
  (0..4).each do
    board1[i].append('O')
  end
end

# Board for player 2
board2 = []
for i in 0..4
  board2[i] = []
  (0..4).each do
    board2[i].append('O')
  end
end

# Display the boards
def display_board(board)
  for row in board
    puts row.map { |k| "#{k}" }.join('  ')
  end
end

# Generation of the player boards
array1 = [  [0, 1, 1, 1, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0] ]
array2 = [  [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 0, 1], [0, 0, 1, 0, 1], [0, 0, 1, 0, 1] ]

# A player wins when he/she reaches 7 points (2 ships each to place on their grid : a small ship (3x1 side) and a large one (4x1 size))
solution = 7

# We set the number of points at 0 at the start of the game
wins_p1 = 0
wins_p2 = 0

#Starting of the game and printing the board 
while true do
  puts 'Welcome!'
  puts 'Enter start or stop'
  starting = gets.chomp
  puts "\n"

  case starting.downcase
  when 'start'
    puts 'Enter the name of P1'
    name_p1 = gets.chomp
    puts "\n"
    puts 'Enter the name of P2'
    name_p2 = gets.chomp
    puts "\n"

    while wins_p1 < solution || wins_p2 < solution
      puts "--- #{name_p1.upcase}'S TURN ---"
      puts 'Enter line number (between 1 and 5):'
      row_p1 = gets.chomp.to_i-1
      puts 'Enter column number (between 1 and 5):'
      column_p1 = gets.chomp.to_i-1

      case array1[row_p1][column_p1]
      when 1
        board1[row_p1][column_p1] = 'X'
        wins_p1 += 1
      when 0
        board1[row_p1][column_p1] = '-'
      when 'X', '-'
        next
      end

      puts "\n"
      puts '--------------'
      display_board(board1)
      puts '--------------'
      puts '----------------------'
      puts "#{name_p1} has #{wins_p1} point#{"s" if wins_p1 > 1}."
      puts '----------------------'
      puts "\n"

    break if wins_p1 == solution

      puts "--- #{name_p2.upcase}'S TURN ---"
      puts 'Enter line number (between 1 and 5):' 
      row_p2 = gets.chomp.to_i-1
      puts 'Enter column number (between 1 and 5):' 
      column_p2 = gets.chomp.to_i-1

      case array2[row_p2][column_p2]
      when 1
        board2[row_p2][column_p2] = 'X'
        wins_p2 += 1
      when 0
        board2[row_p2][column_p2] = '-'
      when 'X', '-'
        next
      end

      puts "\n"
      puts '--------------'
      display_board(board2)
      puts '--------------'
      puts '----------------------'
      puts "#{name_p2} a #{wins_p2} point#{"s" if wins_p2 > 1}."
      puts '----------------------'
      puts "\n"
      break if wins_p2 == solution
    end

    puts "#{name_p1}, you are the winner!" if wins_p1 == solution
    puts "#{name_p2}, you are the winner!" if wins_p2 == solution
    puts "\n"
    break

  when 'stop'
    puts 'See you soon!'
    break
  else
    puts 'Enter start or stop only!'
    puts "\n"
  end
end

按照你的想法去做。

  • 获取船开始时的用户输入 (x,y)
  • 确保 space 空闲 (0)
  • 创建一个函数来检查大小为 N(3 或 4)的船是否适合每个方向。例如在伪代码中(这可以用方向参数概括):
def wouldFitEast(board, anArray, posX, posY):
    steps = 0
    while (steps < N)
        posX = posX + 1
        if !validArrayIndex(posX, posY) or anArray[posX][posY] == 1
            return false;
        steps = steps + 1
    return true;
  • 如果船至少有一个适合的方向,则询问用户想要哪个方向,否则,他们需要选择不同的位置