Опитвам се да направя игра Rock Paper Scissors, за да си помогна да използвам GNU Guile. Попаднах на пречка, когато получавам информация от потребителя, изборът на играча в играта. Ако го задам на низ, тогава играта работи правилно. Ако използвам (read)
, получавам обратно #f като тип от търсенето. Опитах да форматирам read, за да го направя низ, което не работи.
(define (print a)
(display a)
(newline))
(define choices (make-hash-table 3))
(hashq-set! choices "r" "s")
(hashq-set! choices "s" "p")
(hashq-set! choices "p" "r")
(define (cpu-choice) (list-ref (list "r" "p" "s") (random 3)))
(print "You are playing rock paper scissors.")
(print "Type r for rock, p for paper, and s for scissors.")
(define draw
;; "s" ; This works as a test.
(read (open-input-string (read))) ; Can't get user in as string, so the hashq-ref will work.
)
(define cpu-draw (cpu-choice))
;; debug
(print (format #f "Player enterd ~a" draw))
(print (format #f "Player needs to with ~a" (hashq-ref choices draw))) ; Keeps coming back as #f
(print (format #f "CPU has entered ~a" cpu-draw))
;; norm
(newline)
(when (eq? draw cpu-draw)
(print "There was a tie")
(exit))
(when (eq? (hashq-ref choices draw) cpu-draw)
(print "You have won.")
(exit))
(print "You have failed. The computer won.")
Как да получа низ от потребителя? Може би нещо като (str (read))
или (read-string)
(четене като низ).
$ guile --version
guile (GNU Guile) 2.0.13
Актуализация
Бих искал само да спомена, че въпреки че одобреният отговор е правилен, не разбрах как Guile/Scheme прави низове и символи, когато пиша това. Единственият начин да накарам програмата да работи беше да променя всички низове в choices
и в списъка cpu-choice
в символи. Пример:
(hashq-set! choices 'r 's)
(list 'r 'p 's)
Благодаря ви Оскар Лопес за вашата помощ.