Jestem kompletnie początkującym w Ruby, tylko zaznaczam
Wczoraj otworzyłem sobie książkę do Ruby i przepisałem kod prostej gry sieciowej z wątkami w kamień, papier i nożyce, która korzysta z kluczy wątków. Utworzyłem plik .rb, wrzuciłem w konsolę i pokazuje błąd w linii 58 syntax error, unexpected end-of-input…
Poniżej załączam pełny kod
module Games
class RPS
include Comparable
WINS = [%w{ rock scissors },
%w{ scissors paper},
%w{ paper rock}]
attr_accessor :move
def initialize(move)
@move = move.to_s
end
def <=>(other)
if move == other.move
0
elsif WINS.include?([move, other, move])
1
elsif WINS.include?([other, move, move])
else
raise ArgumentError, "Coś się nie zgadza."
end
end
def play(other)
if self > other
self
elsif other > self
other
else
false
end
end
end
require 'socket'
require_relative 'rps'
s = TCPServer.new(3939)
threads = []
2.times do |n|
conn = s.accept
threads << Thread.new(conn) do |c|
Thread.current[:number] = n + 1
Thread.current[:player] = c
c.puts "Witaj, graczu #{n+1}!"
c.print "Jaki jest Twój ruch? (kamień, papier, nożyce) "
Thread.current[:move] = c.gets.chomp
c.puts "Dzięki....poczekaj."
end
end
a,b = threads
a.join
b.join
rps1, rps2 = Games::RPS.new(a[:move]), Games::RPS.new(b[:move])
winner = rps1.play(rps2)
if winner
result = winner.move
else
result = "REMIS!"
end
thread.each do |t|
t[:player].puts "Zwycięzcą jest #{result}!"
end
Myślę, że wszystko przepisałem prawidłowo, ponieważ różne fragmenty były rozrzucone i trzeba było poskładać, a jeszcze nawet nie rozpocząłem właściwej nauki więc proszę o wyrozumiałość
Nie zamknąłeś modułu Games. BTW zwracaj uwagę na takie “pierdoły” jak wcięcia, jeśli robisz je poprawnie, wykrycie tego rodzaju błędu zajmuje ok. 1.5 sekundy.
Dokładnie w którym miejscu nie zamknąłem tego Games? Tak jak mówię, przepisałem sobie tylko ten kod z końca książki, żeby sprawdzić jak to działa i nie łapię się jeszcze w tym.
@gotar@radarek czemu zwróciliście uwagę na książkę, coś źle? Autor jest świetnym specjalistą Rubiego, opinie na amazonie same pozytywne, więc nie wiem? Kod przepisałem tak jak było to napisane, pominąłem w pewnych miejscach wcięcia ale to raczej nie ma większego wpływu na działanie.
Ale ja nie wiedziałem kto jest autorem zanim mi nie odpisałeś :P. Chciałem natomiast sam sprawdzić w książce ten kod gdyż założyłem, że mogłeś go po prostu źle przepisać.
Kod, do którego link wkleił @marr, jest jak najbardziej poprawny składniowo:
$ wget --quiet 'https://raw.githubusercontent.com/rahult/books/master/well_grounded_rubyist/threads/rps.rb' - | ruby -c
Syntax OK
Mowie byś zostawił tą książkę bo jak zaczynasz to z takimi kodami duzo sie nie nauczysz, watki, komunikacja na nich … zacznij od podstaw i idz powoli, Zrozum caly stdlib (Array, Enum, … ) i wtedy wez sie za inne rzeczy