Pagina 1 di 1

Programma C-gioco dei fiammiferi

Inviato: mer 27 mag 2020, 17:58
da SlackNewbie
Salve a tutti!!!
Non riesco a risolvere il seguente problema:
scrivi un programma che gestisce il gioco dei fiammiferi:da un insieme di N fiammiferi,a turno due giocatori ne tolgono un numero qualunque che vada da 1 a K (dove N e K sono definiti a priori,per esempio N=21 e K=5).Perde chi toglie l'ultimo fiammifero.
Quello che non riesco a fare è individuare il giocatore che perde.
Ufff è da parecchio che ci sto dietro a questo problema..... :cry:
Ma è sbagliato usare un break (o un return)come istruzione al verificarsi della condizione posta in un If?

Re: Programma C-gioco dei fiammiferi

Inviato: mer 27 mag 2020, 21:48
da brg
Come fai a non riuscire ad individuare il giocatore che perde, dopo che hai già definito la condizione?
Perde chi toglie l'ultimo fiammifero.
Allega il codice del programma, va', così ci diamo un'occhiata.

Re: Programma C-gioco dei fiammiferi

Inviato: sab 30 mag 2020, 10:54
da SlackNewbie
Salve!!!
Ciao brg e grazie per l'attenzione e scusami se rispondo solo ora.
Posto il codice,anche se non mi convince per nulla.....

Codice: Seleziona tutto

#include<stdio.h>
int main(){
                  int N,K;
                  printf("\nInserire numero totale dei fiammiferi:");
                  scanf("%d",&N);
                  do{
                        printf("\nTurno giocatore 1!!!");
                        printf("\nFiammiferi da togliere:");
                        scanf("%d",&K);
                        N=N-K;
                        if(N<K)
                                   printf("\nGiocatore 1 hai perso!!!");
                        printf("\nTurno giocatore 2 !!!");
                        printf("\nFiammiferi da togliere:");
                        scanf("%d",&K);
                        N=N-K;
                        if(N<K)
                                   printf("\nGiocatore 2 hai perso!!!);
                        }
                   printf("\n\n");
                }
Il testo dell'esercizio dice che N e K sono scelti a priori quindi penso che il numero di fiammiferi che ciascun giocatore toglie sia sempre lom stesso per entrambi i giocatori,tuttavia io l'ho pensato in modo diverso e cioè chiedo ad i giocatori,a turno, di decidere quanti fiammiferi togliere.
Il primo problema che ho è quello di stabilire il giocatore che perde;per come ho scritto il codice,supposto che perda il giocatore 1,il secondo if viene comunque eseguito e quindi mi ritrovo scritto 'giocatore 2 hai perso' mentre appunto dovrebbe esserci scritto solo 'giocatore1'.

Re: Programma C-gioco dei fiammiferi

Inviato: sab 30 mag 2020, 10:59
da SlackNewbie
Potrei risolvere il suddetto problema inserendoci dei break nel ramo dell'if cosi da uscire dal programma??
Ad esempio,esce scritto ' giocaotre 1 hai perso' e poi subito dopo c'è break e quindi esco.
Dubbio:break si usa solo al''interno dei cicli??
E se usassi un return??
Secondo problema ce l'ho nel controllo degli input......anche s epenssandoci bene se alla prima mossa ,ad esempio il giocatore 1,richiede unK maggfiore di N allora questo giocastore perdem subito. :?:
Non ne vengo a capo...

Re: Programma C-gioco dei fiammiferi

Inviato: sab 30 mag 2020, 22:31
da brg
Intanto per cominciare, non hai definito correttamente il problema. Così il gioco non funziona, perché al giocatore 1 basta togliere N-1 fiammiferi per vincere automaticamente ogni volta. In realtà c'è un numero N totale di fiammiferi ed un numero K massimo di fiammiferi che ciascun giocatore può togliere al proprio turno, cioè ciascun giocatore deve scegliere un numero tra 1 e K di fiammiferi da togliere.

Per iniziare puoi anche usare un numero K fisso. Ad esempio dato un numero N di fiammiferi, i giocatori rimuovono K fiammiferi a turno finché uno non rimuove anche l'ultimo e perde. Probabilmente questa versione semplificata è quella che ti viene richiesta. Siccome ti vedo in difficoltà ti butto giù uno pseudo-codice.

Codice: Seleziona tutto

dati N, K, i

ripeti finché 1 è vero
|
|	i = 1
|
|	ripeti finché i <= 2
|	|
|	|	scrivi "il giocatore "i" preleva "K" fiammiferi"	
|	|	N = N - K
|	|	
|	|	se N < 0 allora
|	|	|	scrivi "il giocatore "i" ha perso"
|	|	|	vai a FINE
|	|	|
|	|	
|	|	i = i + 1
|	|
|

FINE

Re: Programma C-gioco dei fiammiferi

Inviato: gio 4 giu 2020, 9:35
da SlackNewbie
Salve!!!
Ciao brg e grazie per la risposta.
Si in effetti ho interpratato male il testo del problema....
Rifacendoci al caso in cui K sia fisso, il ciclo i<=2 non si arresta alla seconda iterazione?
Potresti spiegarmi meglio lo pseudocodice?
Riporto ciò che mi è venuto in mente:

Codice: Seleziona tutto

INIZIO
          chiedi(N,K)
          leggi(N,K)
          MENTRE(N>0)ESEGUI
                               SE(N<K && N>0)
                               ALLORA
                                           scivi(giocatore 1 hai perso)
                               FINE SE
                               N=N-K
                               SE(N<K && N>0)
                               ALLORA
                                           scrivi(giocatore 2 hai perso)
                                N=N-K
             RIPETI
FINE

Re: Programma C-gioco dei fiammiferi

Inviato: gio 4 giu 2020, 10:30
da brg
SlackNewbie ha scritto:
gio 4 giu 2020, 9:35
Rifacendoci al caso in cui K sia fisso, il ciclo i<=2 non si arresta alla seconda iterazione?
Sì, ma poi riparte per via del ciclo esterno infinito. Comunque si tratta giusto di un esempio per dimostrare che non c'è bisogno di separare il caso del giocatore 1, da quello del giocatore 2 o di qualunque altro giocatore nel caso in cui si voglia cambiare il numero di giocatori.

Lo pseudocodice che hai proposto non è proprio pessimo, ma sicuramente non può funzionare, perché sottrai K a N dopo aver fatto il controllo su N e non prima, come dovresti e come ho fatto nel mio pseudocodice.

Re: Programma C-gioco dei fiammiferi

Inviato: sab 6 giu 2020, 12:35
da SlackNewbie
Salve!!!
Ciao brg e grazie per la risposta :)
Faccio prima il controllo su N e poi sottraggo N=N-K perchè mi sono accorto che così facendo riesco ad individuare correttamente il giocatore che perde.
Ho fatto alcune prove,aqd esempio proprio con N=21 Ee K=5,ed in effetti funziona....ma non ti so dire il perchè.
Magari capita una combinazione di N ed K in cui il programma non funzioni correttamente.
Credo che non sia questo il modo giusto per progettare un algoritmo :oops:

Re: Programma C-gioco dei fiammiferi

Inviato: sab 6 giu 2020, 13:30
da brg
Infatti, dovresti partire da un diagramma di flusso, poi pseudocodice, poi codice.

Ad esempio, questo codice funziona con un qualunque numero di giocatori, basta cambiare la costante NUMERO_DI_GIOCATORI per avere un programma con 2, 3, 4 ecc. giocatori:

Codice: Seleziona tutto

#include <stdio.h>

#define NUMERO_DI_GIOCATORI 2
#define NUMERO_DI_FIAMMIFERI 21
#define NUMERO_DI_FIAMMIFERI_PRELEVATI 5

int main ()
{
int N = NUMERO_DI_FIAMMIFERI;
int K = NUMERO_DI_FIAMMIFERI_PRELEVATI;
int i = NUMERO_DI_GIOCATORI;

while (N > 0) {
  i = (++i > NUMERO_DI_GIOCATORI) ? 1 : i;
  printf ("il giocatore %d preleva %d fiammiferi\n", i, K);
  N = N - K;
}

printf ("il giocatore %d ha perso\n", i);

}
Nota: avere del codice duplicato è una cattiva pratica di programmazione. Nel tuo caso usi del codice duplicato per gestire il caso del giocatore 1 e quello del giocatore 2; questo in un buon programma non dovrebbe succedere, ma si dovrebbe usare la stessa funzione per entrambi, cosa che permette tra l'altro di estendere facilmente il programma. Nel mio programma cambiare il numero di giocatori equivale a cambiare un valore di una variabile, perché ho rispettato questo principio.

Re: Programma C-gioco dei fiammiferi

Inviato: lun 8 giu 2020, 20:06
da SlackNewbie
Salve!!!
Ciao brg e grazie per l'iauto.
Non riesco a capire la linea di codice

Codice: Seleziona tutto

  i = (++i > NUMERO_DI_GIOCATORI) ? 1 : i;
Potresti gentilmente spiegarmela?

Re: Programma C-gioco dei fiammiferi

Inviato: mar 9 giu 2020, 15:48
da brg
Puoi trovare la risposta in una qualunque guida o manuale del linguaggio C.
Qui c'è una lista degli operatori standard del C: https://digilander.libero.it/uzappi/C/C-operatori.html.

Re: Programma C-gioco dei fiammiferi

Inviato: mer 10 giu 2020, 13:06
da SlackNewbie
Ciao brg e grazie per l'attenzione
Non sto riuscendo a capire il codice che hai postato,potresti darmi una delucidazione?