我写了一个tic-tac-toe程序。我遇到的问题是,在我的if
语句中,允许用户输入他/她所需的坐标,我的else
条件不起作用。如果用户输入不在板上的坐标,则else
条件就位。
这是我的代码:
class Game
def initialize
@board=Array.new
@board[1]="1 __|"
@board[2]="__"
@board[3]="|__"
@board[4]="\n2 __|"
@board[5]="__"
@board[6]="|__"
@board[7]="\n3 |"
@board[8]=" "
@board[9]="| "
@turn="o"
@win_status = false
end
def turn
@turn
end
def show_board
puts " 1 2 3"
@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
if y==1 && x==1
@board[1]="1 _"+@turn+"|"
elsif y==2 && x==1
@board[2]="_"+@turn
elsif y==3 && x==1
@board[3]="|_"+@turn
elsif y==1 && x==2
@board[4]="\n2 _"+@turn+"|"
elsif y==2 && x==2
@board[5]="_"+@turn
elsif y==3 && x==2
@board[6]="|_"+@turn
elsif y==1 && x==3
@board[7]="\n3 "+@turn+"|"
elsif y==2 && x==3
@board[8]=" "+@turn
elsif y==3 && x==3
@board[9]="| "+@turn+" \n"
else
"You entered an invalid coordinate"
end
end
def win_combo
return [[@board[1][4] + @board[2][1] + @board[3][2]], [@board[4][5] + @board[5][1] + @board[6][2]], [@board[7][5] + @board[8][1] + @board[9][2]],[@board[1][4] + @board[4][5] + @board[7][5]], [@board[2][1] + @board[5][1] + @board[8][1]], [@board[3][2] + @board[6][2] + @board[9][2]], [@board[1][4] + @board[5][1] + @board[9][2]], [@board[3][2] + @board[5][1] + @board[7][5]]]
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"
puts "X Wins!"
return true
elsif str == "ooo"
puts "O Wins!"
return true
end
end
return false
end
g = Game.new
while g.check_win != true
g.show_board
g.set_turn
g.make_move
end
end
答案 0 :(得分:0)
您只是返回字符串:“您输入的坐标无效”。
我怀疑你想用以下方式显示它:
puts "You entered an invalid coordinate"
否则,它将作为g.make_move
的结果传递,然后被忽略。
答案 1 :(得分:0)
我假设您想要在x,y坐标无效的情况下打印到“控制台输入无效坐标”。您需要在该语句中添加一个方法,如:
else
puts "You entered an invalid coordinate"
end
或者:
else
abort "You entered an invalid coordinate"
end
答案 2 :(得分:0)
您认为忘了在puts
字符串前面使用print
或"You entered an invalid coordinate"
。正如它目前所写,它是从方法返回的。
在Ruby中,方法的返回值是值returned by the last statement evaluated。例如,如果x=3
:
def square_example(x)
if x ==3
x_squared = 9
end
end
def square_example2(x)
if x == 3
x_squared = 9
end
return x_squared
end
为了简化测试,您可以尝试使用显式返回,以便您可以轻松地告诉您从方法返回的内容。或者(作为Ruby自己的初学者),您可以为每个puts
结果添加if/else
语句,以便您可以轻松监控每个移动的结果,然后在删除puts
行时你知道一切正常。
答案 3 :(得分:-1)
看起来这是对下面网站的误解,但如果你对“和”与“&&”之间的区别感兴趣你应该看看下面的评论。 来自:http://www.tutorialspoint.com/ruby/ruby_operators.htm
您需要使用“和”代替“&&”,例如:
if y==1 and x==1
# do move
elsif y==2 and x==1
# do move
.
.
.
else
"invalid coordinate"
end
“&&”运算符将检查其两侧的值是否为非零值。如果它们都非零,那么它将返回true。在你的情况下,它正在进行操作
false && false
其中false!= 0,所以它返回true。
以下是对此的另一种讨论:http://archive.railsforum.com/viewtopic.php?id=27353