Untitled
unknown
plain_text
a year ago
4.7 kB
10
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
endEditor is loading...
Leave a Comment