Kółko i krzyżyk - przepisany z C++ na Ruby'ego. Dlaczego są błędy?

Witam

Proszę o sprawdzenie poniższego kodu.

Gracz wybiera pole wpisując cyfrę od 1 do 9. Niestety po wpisaniu cyfry w linijce 122 pojawia się błąd. Pewnie jest ich więcej, ale zostaną odkryte dopiero po poprawieniu tego błędu. (W kodzie C++ było coś takiego “int komputer(char t[], char &gracz)” - ja napisałam w Ruby’m to: w linii 110 “def komputer t, gracz” - dobrze? )

[code]t=[10]
@gracz
@wybor

print “\nGra w Kolko i Krzyzyk dla gracza i komputera\n============================================\n\n”;
(1…9).each do |i|
t[i]=’ ’
end
gracz=‘O’

def plansza t
(1…5).each do |i|
print " " ,t[i], " "
if i==1||i==3||i==5
print “| |”
elsif i != 9
print “\n—±–±--\n”
else
print “\n\n”
end
end
end

def wygrana t, g, cisza
@i
test=false

(1..7).each do |i|
	test ||=t[i]==g && t[i+1]==g && t[i+2]==g
	i=i+2
end

(1..3).each do |i|
	test ||=t[i] == g && t[i+3] == g && t[i+6] == g
end

test ||=t[1] == g && t[5] == g && t[9] == g
test ||= t[3] == g && t[5] == g && t[7] == g

if test==true
	if !cisza
		plansza t
		print "\nGracz" , g , "WYGRYWA\n"
	end
end
test=false

end

def remis t, cisza
(1…9).each do |i|
if t[i]==’ ’
cisza=false
end
end

if cisza==true
	plansza(t)
	print "REMIS\n"
end

end

def minimax t, gracz
@m
@mmx

if(wygrana(t,gracz,true))
	(gracz == 'X') ? 1 : -1
end

if (remis(t,true))

end

gracz=(gracz=='X') ? 'O' : 'X'

mmx= (gracz == 'O') ? 10 : -10

(1..9).each do |i|
	if t[i] == ' ' 
		t[i]=gracz
		m=minimax(t,gracz)
		t[i]=' ' 
		if (gracz=='O' && m<mmx) || (gracz=='X' && m>mmx)
			mmx=m
		end
	end
end

end

def komputer t
@ruch
@i
@m
mmx=-10

(1..9).each do |i|
	if t[i]==' '
		t[i]='X'
		m=minimax(t, 'X')
		t[i]=' '
		if m>mmx
			mmx=m
			ruch=i
		end
	end
end

end

def komputer t, gracz
@r
plansza t

if gracz=='O'
	print "\n\nGracz wybiera ruch:"
	r=$stdin.gets
	elsif
		r=komputer(t)
		print "\n\nKomputer wybiera ruch" , r
end
print "---------------------------\n\n"
if r>=1 && r<=9 && t[r]==' '
	t[r]=gracz
end
gracz=(gracz == 'O') ? 'X' : 'O'

end

while(!wygrana(t,‘X’,false) && !wygrana(t,‘O’,false) && !remis(t,false))
komputer t, gracz
end
print "Jeszcze raz ? (T = TAK) : "
wybor=$stdin.gets
print “\n\n\n”[/code]

A która to linijka 122? Bo wybacz, ale nie chce mi się odliczać we wklejonym bloku kodu.

Oraz:

t=[10]

O co tu chodzi? Inicjalizujesz tablicę jednoelementową, z liczbą 10 jako owym jednym elementem?

[quote=Tomash]A która to linijka 122? Bo wybacz, ale nie chce mi się odliczać we wklejonym bloku kodu.

Oraz:

t=[10]

O co tu chodzi? Inicjalizujesz tablicę jednoelementową, z liczbą 10 jako owym jednym elementem?[/quote]
Nie nie, chodziło o tablicę o długości 10. Chyba za bardzo nie wiem jak to napisać.
Można coś takiego: “t = Array.new(10)” ?

Linijka 122:

[code]def komputer t, gracz
@r
plansza t

if gracz=='O'
    print "\n\nGracz wybiera ruch:"
    r=$stdin.gets
    elsif
        r=komputer(t)
        print "\n\nKomputer wybiera ruch" , r
end
print "---------------------------\n\n"
if r>=1 && r<=9 && t[r]==' '        <------122 linijka (błąd: in '>=': undefined method '>' for false:FalseClass <NoMethodError> )
    t[r]=gracz
end
gracz=(gracz == 'O') ? 'X' : 'O'

end[/code]

No tak, każdy się kiedyś uczył. Ogólnie za mało Ruby :wink: Niezły spis podstawowych “tricków”: http://pastie.textmate.org/143799

Mniej więcej wiem w czym był błąd. W tym: r=$stdin.gets
Powinno być: r=$stdin.getc

Ale teraz znaczek “O” (gracza) oraz “X” (znaczek komputera) nie wypisują się.
A może w linijce:

gracz=(gracz == ‘O’) ? ‘X’ : ‘O’

Może coś nie tak jest z tym znakiem zapytania?

Dzieki za link :slight_smile: