Untitled
unknown
plain_text
a month ago
4.7 kB
3
Indexable
Never
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