/ / Jak sobie radzić, gdy użytkownik wprowadzi współrzędną wziętą w kółko i krzyżyk? - rubin na szynach, rubin, rubin na szynach-3, klasa, kółko i krzyżyk

Jak radzić sobie z sytuacją, gdy użytkownik wprowadza współrzędną w kółko i krzyżyk? - Ruby-on-Rails, ruby, Ruby-on-Rails-3, klasa, kółko i krzyżyk

Piszę program kółko i krzyżyk. W tej chwili użytkownik może zastąpić zajęty kwadrat. Ponadto, gdy użytkownik wprowadzi współrzędną spoza planszy, pomija tę osobę. Chciałbym, aby mój program powiedział coś w stylu „wprowadzona współrzędna została już zajęta lub jest nieprawidłowa”, gdy użytkownik wprowadzi współrzędną przyjętą lub współrzędnej, której nie ma na planszy. Program musiałby wtedy dać użytkownikowi kolejną szansę na wprowadzenie jego / jej współrzędnych. Jakieś sugestie?

To jest mój kod:

class Game

def initialize
@board=Array.new
@board[1]="  1   2   3n" + "1  __|"
@board[2]="__"
@board[3]="|__"
@board[4]="n2  __|"
@board[5]="__"
@board[6]="|__"
@board[7]="n3    |"
@board[8]="  "
@board[9]="|  "
@turn="x"
@win_status = false
end

def turn
@turn
end

def show_board
@board.each do |i|
print i
end
puts ""
end

def set_turn #switches turns
if @turn == "x"
@turn = "o"
else @turn == "o"
@turn = "x"
end
end

def make_move
puts "Enter x coordinate"
x=gets.to_i
puts "Enter y coordinate"
y=gets.to_i
@board[1]="1  _"+@turn+"|"   if y==1 && x==1
@board[2]="_"+@turn    if y==2 && x==1
@board[3]="|_"+@turn   if y==3 && x==1
@board[4]="n_"+@turn+"|" if y==1 && x==2
@board[5]="_"+@turn    if y==2 && x==2
@board[6]="|_"+@turn   if y==3 && x==2
@board[7]="n "+@turn+"|" if y==1 && x==3
@board[8]=" "+@turn    if y==2 && x==3
@board[9]="|"+@turn+" n"    if y==3 && x==3
end
def win_combo
return [[@board[1][1] + @board[2][1] + @board[3][2]], [@board[4][2] + @board[5][1] + @board[6][2]], [@board[7][1] + @board[8][1] + @board[9][1]],[@board[1][1] + @board[4][2] + @board[7][1]], [@board[2][1] + @board[5][1] + @board[8][1]], [@board[3][2] + @board[6][2] + @board[9][1]], [@board[1][1] + @board[5][1] + @board[9][1]], [@board[3][2] + @board[5][1] + @board[7][1]]]
end

def check_win
#if some row or column or diagonal is "xxx" or "ooo" then set @win_status = true
self.win_combo.each do |arr|
str = arr.join
if str == "xxx" or str == "ooo"
return true
end
end
return false
end
end


g = Game.new
while g.check_win != true
g.show_board
g.set_turn
g.make_move
end
puts "won"

Odpowiedzi:

0 dla odpowiedzi № 1

Spróbuj zmienić każdą z tych linii

@board[1]="1  _"+@turn+"|"   if y==1 && x==1

do:

if y==1 && x==1 && @board[1].eql?("  1  2  3n" + "1 _|")
@board[1] = "1 _" +@turn + "|"

i użyj elsif dla @board [2-9]. Część @board [1] .eql? () Jest tym, co zainicjowałeś te wartości. Na końcu wszystkiego, co stawia tę linię:

else
make_move
end

Teraz pozwoli Ci tylko zmienić wartość@board [x], jeśli nie został już zmieniony. A jeśli żaden z warunków nie jest spełniony, aby zmienić tę wartość, ponownie uruchomi metodę make_move. Końcowy kod powinien wyglądać mniej więcej tak

if y==1 && x==1 && @board[1].eql?("  1  2  3n" + "1 _|")
@board[1] = "1 _" +@turn + "|"
elsif y==2 && x==1 && ...
...
else
make_move
end