为什么我的if语句的else条件不起作用?

时间:2013-11-19 01:38:21

标签: ruby class if-statement tic-tac-toe

我写了一个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

4 个答案:

答案 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