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.
Author by
user2759592
Updated on July 23, 2022Comments
-
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 almost 4 yearsFor 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.