Programma C-gioco dei fiammiferi

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Programma C-gioco dei fiammiferi

Messaggio 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?

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Programma C-gioco dei fiammiferi

Messaggio 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.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Programma C-gioco dei fiammiferi

Messaggio 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'.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Programma C-gioco dei fiammiferi

Messaggio 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...

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Programma C-gioco dei fiammiferi

Messaggio 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

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Programma C-gioco dei fiammiferi

Messaggio 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

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Programma C-gioco dei fiammiferi

Messaggio 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.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Programma C-gioco dei fiammiferi

Messaggio 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:

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Programma C-gioco dei fiammiferi

Messaggio 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.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Programma C-gioco dei fiammiferi

Messaggio 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?

Avatar utente
brg
Linux 3.x
Linux 3.x
Messaggi: 580
Iscritto il: sab 12 mar 2011, 14:20
Slackware: 15.0
Kernel: 5.15.117
Desktop: KDE5
Località: Montecatini
Contatta:

Re: Programma C-gioco dei fiammiferi

Messaggio 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.

SlackNewbie
Linux 1.x
Linux 1.x
Messaggi: 154
Iscritto il: dom 30 dic 2012, 15:01

Re: Programma C-gioco dei fiammiferi

Messaggio da SlackNewbie »

Ciao brg e grazie per l'attenzione
Non sto riuscendo a capire il codice che hai postato,potresti darmi una delucidazione?

Rispondi