Как проверить, включены ли числа в массиве во вложенный массив? - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над игрой в крестики-нолики и хочу проверить, соответствует ли выбор игрока вложенному массиву, содержащему выигрышные комбинации.

В настоящий момент, например, [7,8,9] или [9,7,8] или [1,2,3] или [1,3,2] заканчивают игру и объявляют победителя, как они должны.

Однако, например, [1,7,8,6,9] или [1,7,3,5,6] или [1,4,2,3,9] игнорируются, и победитель выигрывает ' не может быть объявлено, как задумано, хотя массивы включают выигрышные комбинации «7,8,9» и «3,5,7» и «1,2,3».

Спасибо за любой совет или помощь заранее.

Все выигрышные комбинации в сетке 3x3.

WINNING_COMBOS = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]

У меня есть два массива игроков: @@ player_one и @@ player_two, которые выбирают числа из массива @possible_choice.

@possible_choice = [1,2,3,4,5,6,7,8,9]
.
.
.
def player_one_turn()
  puts "Player One, make your choice:"
  p @possible_choice
  puts @grid
  @@player_one << @possible_choice.delete(gets.chomp.to_i)
  p @@player_one
end

У меня также есть has_won? Метод

def has_won?
  WINNING_COMBOS.include?(@@player_one.sort) ||
  WINNING_COMBOS.include?(@@player_two.sort)
end

Незаконченная игра во всей ее полноте. Пожалуйста, не возражайте против сетки, я все еще работаю над ней.


class Grid
    WINNING_COMBOS = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]
    attr_accessor :possible_choice
    attr_accessor :grid

    def initialize
        @possible_choice = [1,2,3,4,5,6,7,8,9]
        @grid = "
                |----|----|----|   
                |  1 |  2 |  3 |
                |----|----|----|
                |  4 |  5 |  6 |
                |----|----|----|
                |  7 |  8 |  9 |
                |----|----|----|
                "
    end
end

class Game < Grid
    @@player_one = Array.new
    @@player_two = Array.new

    def game
        puts
        puts "*** This is a tic-tac-toe game for two human players. ***"
        puts
        loop do
            player_one_turn()
            puts
                if has_won?
                    puts "The game has ended. Player One has won!"
                    puts
                    return
                end
            break if @@player_one.length == 5
            player_two_turn()
            puts
                if has_won?
                    puts "The game has ended. Player Two has won!"
                    puts
                    return
                end
        end
    end

    def player_one_turn()
        puts "Player One, make your choice:"
        p @possible_choice
        puts @grid
        @@player_one << @possible_choice.delete(gets.chomp.to_i)
        p @@player_one
    end

    def player_two_turn()
        puts "Player Two, make your choice:"
        p @possible_choice
        puts @grid
        @@player_two << @possible_choice.delete(gets.chomp.to_i)
        p @@player_two
    end

    def has_won?
        WINNING_COMBOS.include?(@@player_one.sort) ||
        WINNING_COMBOS.include?(@@player_two.sort)
    end
end

new_game = Game.new
new_game.game

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Самое простое, что я могу придумать:

def has_won?(player)
  WINNING_COMBOS.any? { |combo| (player & combo).size == combo.size }
end

Однако, если вы будете использовать Set вместо Array, вы можете сделатьсо следующим:

def has_won?(player)
  WINNING_COMBOS.any? { |combo| combo <= player } # check for subset
end

Чтобы преобразовать WINNING_COMBOS в наборы, просто сделайте следующее:

require 'set'

WINNING_COMBOS = [
  [1, 2, 3], [4, 5, 6], [7, 8, 9],
  [1, 4, 7], [2, 5, 8], [3, 6, 9],
  [1, 5, 9], [3, 5, 7]
].map(&:to_set)

# for players use
@@player_one = Set.new
0 голосов
/ 24 мая 2019
WINNING_COMBOS = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]

def win?(player)
  WINNING_COMBOS.each do |x,z,y|
    return true if player.include?(x) && player.include?(z) && player.include?(y) 
  end
  false
end

def has_won?
  win?(@@player_one) || win?(@@player_two)
end

Должен выполнить работу, нет необходимости сортировать массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...