Simon dice en el esquema -- scheme campo con community-challenge campo con simon-says camp codereview Relacionados El problema

Simon Says in Scheme


6
vote

problema

Español

OK, no es completamente como Simon dice, ya que está basado en texto. No hay nada acerca de la memorización basada en señales visuales y / o suene aquí, solo memorización de secuencias largas de números. Quería hacerlo en el idioma. Escribo el menor código, esquema (con pollo) y ver qué sucede.

  (use posix) (use (srfi 1))  (define button-count 4)  (define (clear-screen)   (system "cls"))  (define (make-delay)   (sleep 2))  (define (show-sequence sequence)   (if (not (null? sequence))     (begin       (clear-screen)       (make-delay)       (write (car sequence))       (make-delay)       (show-sequence (cdr sequence)))     (begin       (clear-screen)       (write-line "GO!"))))  (define (show-score score)   (format #t "Your score: ~A~%" score))  (define (get-player-input)   (read-line))  (define (make-sequence length)   (map random (make-list length button-count)))  (define (player-sequence-matches? target-sequence)   (cond     [(null? target-sequence) #t]     [(string=? (get-player-input) (number->string (car target-sequence)))      (player-sequence-matches? (cdr target-sequence))]     [else #f]))  (define (simon-says difficulty)   (let [(current-sequence (make-sequence difficulty))]     (show-sequence current-sequence)     (if (player-sequence-matches? current-sequence)       (+ 1 (simon-says (+ difficulty 1)))       0)))  (define (play-simon-says)   (show-score (simon-says 1)))   

Si desea ejecutarlo en algo UNIX, deberá cambiar (system "cls") a catch0 .

Original en ingles

Ok, it's not completely like Simon Says, since it's text-based. There is nothing about memorizing based on visual cues and/or sound here, just memorizing long sequences of numbers. I wanted to do it in the language I write the least code in, Scheme (w/ Chicken), and see what happens.

(use posix) (use (srfi 1))  (define button-count 4)  (define (clear-screen)   (system "cls"))  (define (make-delay)   (sleep 2))  (define (show-sequence sequence)   (if (not (null? sequence))     (begin       (clear-screen)       (make-delay)       (write (car sequence))       (make-delay)       (show-sequence (cdr sequence)))     (begin       (clear-screen)       (write-line "GO!"))))  (define (show-score score)   (format #t "Your score: ~A~%" score))  (define (get-player-input)   (read-line))  (define (make-sequence length)   (map random (make-list length button-count)))  (define (player-sequence-matches? target-sequence)   (cond     [(null? target-sequence) #t]     [(string=? (get-player-input) (number->string (car target-sequence)))      (player-sequence-matches? (cdr target-sequence))]     [else #f]))  (define (simon-says difficulty)   (let [(current-sequence (make-sequence difficulty))]     (show-sequence current-sequence)     (if (player-sequence-matches? current-sequence)       (+ 1 (simon-says (+ difficulty 1)))       0)))  (define (play-simon-says)   (show-score (simon-says 1))) 

If you want to run it on something Unix, you'll need to change (system "cls") to (system "clear").

        

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 
  1. Idealmente, me gustaría usar TERMCAP o TERMINFO o similares para borrar el terminal sin bombardear. Ay, parece que el pollo no tiene un huevo para TERMCAP o TERMINFO. (Tiene un huevo para las maldiciones, pero considero que es demasiado pesado para limpiar un terminal).

  2. probablemente utilice for-each para iterar a través de los elementos en show-sequence , en lugar del enfoque recursivo que tiene:

      (define (show-sequence seq)   (for-each (lambda (x)               (clear-screen)               (make-delay)               (display x)    ;; not write               (make-delay))             seq)   (clear-screen)   (display "GO! "))   
  3. No es un gran fanático de hacer una función get-player-input es exactamente lo mismo que read-line . Acabo de llamar addConverter0 directamente.

  4. Su definición de addConverter1 es bastante inteligente, pero no es muy idiomático. Dado que tiene SRFI 1 cargado, simplemente usaría addConverter2 :

      addConverter3  
  5. Puede simplificar addConverter4 mediante el uso de SRFI 1 addConverter5 :

      addConverter6  

    y Dado que el pollo tiene addConverter7 BURTINTIN, puede simplificar aún más:

      addConverter8  
  6. Para calcular la puntuación total, preferiría acumular la puntuación, en lugar de usar la recursión para mantener la puntuación. Me gusta así:

      addConverter9  

    De esta manera, la función es totalmente recursiva.

 
  1. Ideally I'd like to use termcap or terminfo or the like to clear the terminal without shelling out. Alas, it seems Chicken doesn't have an egg for either termcap or terminfo. (It does have an egg for curses, but I consider that to be too heavyweight for just clearing a terminal.)

  2. I'd probably use for-each for iterating through the items in show-sequence, rather than the recursive approach you have:

    (define (show-sequence seq)   (for-each (lambda (x)               (clear-screen)               (make-delay)               (display x)    ;; not write               (make-delay))             seq)   (clear-screen)   (display "GO!\n")) 
  3. Not a huge fan of making a get-player-input function that's exactly the same as read-line. I'd just call read-line directly.

  4. Your definition of make-sequence is quite clever, but it's not very idiomatic. Since you have SRFI 1 loaded, I'd just use list-tabulate:

    (define (make-sequence len)  ;; not length   (list-tabulate len (lambda (_) (random button-count)))) 
  5. You can simplify player-sequence-matches? by using SRFI 1's every:

    (define (player-sequence-matches? seq)   (every (lambda (x)            (= (string->number (read-line)) x))          seq)) 

    And since Chicken has cut builtin, you can simplify even further:

    (define (player-sequence-matches? seq)   (every (cut = (string->number (read-line)) <>) seq)) 
  6. For calculating the total score, I'd rather accumulate the score, rather than use recursion to hold the score. Like so:

    (define (simon-says difficulty)   (let loop ((difficulty difficulty)              (score 0))     (define seq (make-sequence difficulty))     (show-sequence seq)     (if (player-sequence-matches? seq)         (loop (add1 difficulty) (add1 score))         score))) 

    This way, the function is totally tail-recursive.

 
 
 
 

Relacionados problema

2  Simon dice que la implementación usando jQuery  ( Simon says implementation using jquery ) 
Me encantaría recibir algunos comentarios sobre mi implementación de "Simon dice". No he seguido el original en el que he creado una nueva secuencia cada vez,...

5  Simon dice usando Arduino Uno  ( Simon says using arduino uno ) 
Construí un juego Simon, dice un juego de Arduino Uno. Este fue mi primer proyecto de Arduino "real". Me gustaría saber cómo mejorar, mecánica de juegos y efi...

12  Simon dice / Four Tiles Game, con C ++ y SDL  ( Simon says four tiles game with c and sdl ) 
Mi opinión en la PREBASH DESAFÍO ", dice Simon" Juego, en menos de 300 líneas de C ++ (más el archivo de encabezado), usando sdl para la gestión de la ven...

2  Creó un juego de Simon utilizando HTML, CSS y JavaScript  ( Created a game of simon using html css and javascript ) 
Aquí está el Fiddle JS: https://jsfiddle.net/4jo9hvpk/ El código es completamente funcional. ¿Podría alguien señalar algún error en estilo? ¿Cualquier red...

12  Simon dice en JavaScript (con Knockout) - Snippet de código jugable  ( Simon says in javascript with knockout playable code snippet ) 
Resolví hacer todo el asunto con JavaScript de Vanilla como un desafío, pero el hombre, la vinculación y la gestión estatal de Knockout es demasiado fácil. ...

4  Simon en JavaScript  ( Simon in javascript ) 
Este es un juego de Simon usando Plain Javascript. Doy la bienvenida a cualquier comentario, sugerencias, Perspectivas o ideas para mejorar. Una opción que hi...

10  Simon-dice en AS3 - Funcionalidad de prototipos  ( Simon says in as3 prototyping functionality ) 
Mi entrada no grave para Simon dice. Basado en literal interpretación de las reglas: Crear una interfaz de usuario con cuatro botones de colores que se...

10  Juego Simon / Four Tiles Game  ( Simon game four tiles game ) 
Cuando leí la comunidad Challange, no podía esperar. Así que aquí voy con el primer juego de cuatro azulejos: pantas5 Editar: Si desea ver el juego con ...

5  Simon dice en unidad  ( Simon says in unity ) 
He hecho que el Simon dice juego en unidad Empieza por adivinar un patrón de 3 colores y cada vez que complete el patrón un nuevo, aleatorio, se genera y...

9  Animar y jugar sonidos en Simon dice 'el camino angular'  ( Animate and play sounds in simon says the angular way ) 
Soy un codificador de Newbie y estoy tratando de aprender buenos hábitos de codificación. Estoy haciendo un Simon, dice el juego desafío del campo de código g...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos