How do I fix the error "void value expression"?

20,590

You need an elsif to let ruby know where the conditions change. Here is the correct code:

if str == "xxx"
  puts "X Wins!"
  return true 
elsif str == "ooo"
  puts "O Wins!"
  return true
end

You also need to end your if blocks.

Share:
20,590
user2759592
Author by

user2759592

Updated on July 23, 2022

Comments

  • user2759592
    user2759592 almost 2 years

    I wrote a tic-tac-toe program. The part of the program that I am having trouble with is that i am getting the error:

    tac.rb:63: void value expression
    tac.rb:65: void value expression
    

    This error is coming from my check_win method.

    if str == "xxx"
                                    return true  and puts "X Wins!"
                            str == "ooo"
                                    return true and puts "O Wins!"
    

    It gave me this error after I added the "X wins" and "O wins" statements.

    this is my whole program:

    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="x"
                    @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
    @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]="\n2  _"+@turn+"|" if y==1 && x==2
    @board[5]="_"+@turn    if y==2 && x==2
    @board[6]="|_"+@turn   if y==3 && x==2
    @board[7]="\n3   "+@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"
                                    return true  and puts "X Wins!"
                            str == "ooo"
                                    return true and puts "O Wins!"
    
                            end
                    end
                    return false
            end
    end
    
    
    g = Game.new
    while g.check_win != true
            g.show_board
            g.set_turn
            g.make_move
    end
    
  • Pysis
    Pysis almost 4 years
    For anyone else finding the question from searching, my problem was forgetting I was working inside if statements returning a value into a variable, and I had added a return keyword for the outer function erroneously.