Untitled

mail@pastecode.io avatar
unknown
plain_text
5 months ago
4.7 kB
4
Indexable
class Board
  @@number_of_boards = 1

  def initialize(size)
    @board = Array.new(size) {Array.new(size) {0} }
    @size = size
    # To nie jest bardzo powszechny zapis, ale generalnie tl;dr brzmi: osadź każdy element arraya wynikiem następującego bloku: zero xD
  end
  attr_reader :size # Nie działało bo taka zmienna nie istniała. Patrz linijka 6 (dodałem)
  attr_reader :board # Tak, attr_reader to geter, atrr_writer to setter, a attr_accessor to oba. Możesz im dawać więcej argumentów
  # Czylu zamiast dwu linijek powyżej możesz zrobić: attr_reader :size, :board


  def editBoard(player, square_a, square_b) #Nadal zła nazwa.
    square_a = square_a-1 # Square? To kwadraty jakieś? Potęga druga?
    square_b = square_b-1

    if player == 1 and board[square_a][square_b] == 0
      board[square_a][square_b] = 'X'
    elsif player == 2 and board[square_a][square_b] == 0
      board[square_a][square_b] = 'O'
    elsif board[square_a][square_b] == 'X' or board[square_a][square_b] == 'O' # Czy tutaj nie wystarczyłby else bez warunku?
      # Bo jeśli nie jest 0 to musi być albo 'X' albo 'O'
      # Tu zostawiam jak jest. Bo z jednej strony by wystarczyło, ale z drugiej strony boli mnie mózg, że może się wydarzyć jakieś gówno
      # Oprócz tego wydaję mi się, że tak jest trochę bardziej czytelnie...
      #
      # To ja powiem inaczej: Czy jeżeli "boli cie mózg" i nie wiesz czy nie wydarzy się jakieś gówno, to nie lepiej jest je obsłużyć w else i dać komunikat błędu, niż olać sprawę?
      puts "This square is already taken!"
    end

  end

  def board_state
    puts "Board: "
    board.each { |x| puts x.join(" ") }
  end

  def check_win_con
    if board[0] == ['X','X','X'] or board[1] == ['X','X','X'] or board[2] == ['X','X','X']
      puts "Player 1 won! Gratz"
      0
      # A tak właściwie to na chuj to zero zwracasz? xD
    end
    if board[0] == ['O','O','O'] or board[1] == ['O','O','O'] or board[2] == ['O','O','O']
      puts "Player 2 won! Gratz"
      0
    end
  end

  def check_positions(position_a,position_b, size)
    if position_a > size or position_a < 1 or position_b > size or position_b < 1 # To jest częsty błąd stażystów, będziesz musiał się nauczyć zwracać na niego uwagę.
      # A brzmi tak: IF TRUE RETURN TRUE ELSE RETURN FALSE. Widzisz tutaj problem? Wynik Twojego porównania rozmiarów to już jest true/false to po co go wrapować if else i mapować na kolejne true false?
      # Ja bym wywalił całe ciało tej metody i zostawił tylko tyle: "position_a > size or position_a < 1 or position_b > size or position_b < 1"
      # Ofc musisz wtedy zamianić warunki true false w obsłudze tej metody, a i pewnie nadać lepszą nazwę
      return false
    else
      return true
    end
  end
end

board_size = 3
max_number_of_moves = board_size*2 # I patrz, ten głupi pomysł żeby z góry określać ilość ruchów się mści teraz. Niech plansza wie kiedy jest pełna i to zgłasza. Co jak zmienisz zasadę że raz na 5 ruchów można komuś nadpisać znaczek? Albo że jest losowa szansa na wyłączenie jednego pola jak znajdziesz sekret? Albo jak źle zapiszesz warunek i ruchy "This square is already taken" też będą się liczyć?
board = Board.new(board_size)

board.board_state
puts "X start. Where would you like to put X?"
player = 1
x = 0
while x != max_number_of_moves do
  puts "index A:" # Nitpicking ale "indeks A" i "index B" są o wiele trudniejsze do zrozumienia dla gracza niż "Wybierz wiersz od 1 do 3"
  position_a = gets.to_i
  puts "index B:"
  position_b = gets.to_i

  if board.check_positions(position_a, position_b, board_size) == false # Porównanie już zwraca true/false, nie musisz go porównywać z kolejnym true false
    puts "Wrong positions"
    max_number_of_moves = max_number_of_moves-1 # xD
  else
    board.editBoard(player,position_a,position_b)
    if player == 1
      player = 2
    else
      player = 1
    end
  end

  board.board_state
  #Check win con zamknięty bo nie działa i tak
  #board.check_win_con
  #@down to zostawiam dla komentarza, bo to jest do zrobienia dalej
  #if player == 1 # A dodajmy więcej graczy, niech będzie hash mapujący gracza na jego symbol, np
  # players = { x: "Radek", y: "Krutas", z: "Gracmanollo"}
  # I niech gra sobie radzi ze zmienną ilością graczy
  # player = 2
  #else
  #    player = 1
  #  end
  # x += 1 # W sumie zastanawiam się po co ten warunek 9 ruchów, grajmy do wygranej albo aż plansza się nie skończy.
  # No 9 ruchów jest maks... W kółko i krzyżyk nie można nadpisywać ruchów. Zmieniłem pyntle na taką żeby była zależna do size. Ale też mogę to zmienić.
  max_number_of_moves += 1
end
Leave a Comment