View Full Version : Programma in C: HELP!
Allora il programma è il seguente: Il programma deve simulare il gioco del Monopoli semplificato. Ho una lista di giocatori e ogni giocatore ha una lista di proprietà che possiede (ogni proprietà è caratterizzata dal nome della casella: es via torino, piazza dante) che è costituita dal nome della proprietà e dalla cifra in euro che dovrà essere corrisposta agli altri giocatori che capitassero in tale casella. Ho un'altra lista che costituisce il tabellone, ogni elemento della lista è una via o una piazza (es. corso_magellano). Tutti i giocatori si trovano inizialmente nella prima casella e a turno si simula il lancio di due dadi ( generare un numero casuale tra 1 e 12) e lo si fa avanzare nella casella corrispondente eventualmente pagando la tassa dovuta al proprietario ( se c'è un proprietario); infine si stampa a video l'operazione compiuta. Un giocatore che finisce i soldi viene eliminato, vince l'ultimo giocatore rimasto.
Ovviamente il programma è lungo, però vorrei che voi mi aiutaste a risolvere il problema, soprattutto la parte riguardante la simulazione vera e propria, ovvero dal lancio dei dadi in poi. Ogni suggerimento non può che aiutarmi.
Mi spiace, non posso aiutarti...
però, una curiosità...: lo vuoi fare grafico oppure a "schermo nero"?
Scusate ma non sono stato molto chiaro:
Il tabellone è rappresentato dalla seguente lista ad es.
Partenza
Parco_della_vittoria
corso_magellano
piazza_giulio_cesare
.....
ecc......
I partecipanti sono messi in una lista e ogni elemento della lista ha il campo nome giocatore e capitale, per ogni giocatore c'è una lista di proprietà(ogni proprietà è una casella) ogni proprietà ha un prezzo che deve essere pagato da chi capita in questa casella se non è sua, ovviamente deve pagare al proprietario. Sul video devo semplicemente comparire questo
Es.
Mario tira dadi:5
Mario arriva in corso_magellano e paga Euro 5.32 a Gustavo
soldi rimanenti : euro 24.91
e così via per tutti i giocatori
Niente di grafico la mia struttura dati sono semplicemente delle LISTE
trallallero
27-06-2006, 08:02
Allora il programma è il seguente: Il programma deve simulare il gioco del Monopoli semplificato. Ho una lista di giocatori e ogni giocatore ha una lista di proprietà che possiede (ogni proprietà è caratterizzata dal nome della casella: es via torino, piazza dante) che è costituita dal nome della proprietà e dalla cifra in euro che dovrà essere corrisposta agli altri giocatori che capitassero in tale casella. Ho un'altra lista che costituisce il tabellone, ogni elemento della lista è una via o una piazza (es. corso_magellano). Tutti i giocatori si trovano inizialmente nella prima casella e a turno si simula il lancio di due dadi ( generare un numero casuale tra 1 e 12) e lo si fa avanzare nella casella corrispondente eventualmente pagando la tassa dovuta al proprietario ( se c'è un proprietario); infine si stampa a video l'operazione compiuta. Un giocatore che finisce i soldi viene eliminato, vince l'ultimo giocatore rimasto.
Ovviamente il programma è lungo, però vorrei che voi mi aiutaste a risolvere il problema, soprattutto la parte riguardante la simulazione vera e propria, ovvero dal lancio dei dadi in poi. Ogni suggerimento non può che aiutarmi.
Stai praticamente chiedendo di farti il programma :eek:
Ma almeno iniziarlo no ? un'idea uno spunto ;)
hai messo il linguaggio e il problema ...
Vabbé, io t'ho fatto il lancio dadi ...
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/* *\
RITORNA LA SOMMA DI 2 NUMERI TRA 1 E 6
SI POTREBBE FARE ANCHE:
\* */
int TiraDadi()
{
return (rand() % 6 + 1) + // DADO 1
(rand() % 6 + 1); // DADO 2
}
/* *\
TESTA LA FUNZIONE TiraDadi
\* */
int main( int argc, char *argv[] )
{
int i;
/*
* srand VA CHIAMATA PER INIZIALIZZARE IL GENERATORE RANDOM
* GLI PASSO getpid() PER AVERE UAN SEQUENZA DIVERSA OGNI VOLTA
*/
srand((unsigned int)getpid());
/* TESTA 100 LANCI DI DADI. OGNI 10 VA A CAPO */
for ( i = 1; i <= 100; i++ )
printf( "%3i %c", TiraDadi(), (i % 10) ? ' ' : '\n' );
putchar('\n');
}
Non sto chidendo di farmi il programma vorrei solo qualche suggerimento. Il lancio dei dadi mi serve qualcosa molto piu semplice:
tirata = rand() % 12 + 1;che mi genera numeri casuali tra 1 e 12.
Il mio vero problema è implementare il fatto dello spostamento dei giocatori nel tabellone. Avevo pensato di mettere nel campo struct di ogni giocatore una variabile int posizione che mi tiene conto della posizione del giocatore...
trallallero
27-06-2006, 11:05
Non sto chidendo di farmi il programma vorrei solo qualche suggerimento. Il lancio dei dadi mi serve qualcosa molto piu semplice:
tirata = rand() % 12 + 1;che mi genera numeri casuali tra 1 e 12.
Il mio vero problema è implementare il fatto dello spostamento dei giocatori nel tabellone. Avevo pensato di mettere nel campo struct di ogni giocatore una variabile int posizione che mi tiene conto della posizione del giocatore...
guarda che la mia mica é complicata ...
return (rand() % 6 + 1) + // DADO 1
(rand() % 6 + 1); // DADO 2
il resto é commenti e main di test ;)
Comunque mi sembra la cosa piú veloce e semplice da fare quella del
campo "posizione".
Immagina il campo del monopoli come un array di n posizioni e il resto
viene da se ;)
Il realtá il campo é "circolare", diciamo una matrice nella quale
usi solo il perimetro, ma sarebbe assurdo e da calci nelle palle
usare una matrice per la posizione :muro:
Ti consiglio di disegnare il tutto e lavorare molto su carta ;)
Quando serve fai un fischio :)
davide87
27-06-2006, 11:12
Non sto chidendo di farmi il programma vorrei solo qualche suggerimento. Il lancio dei dadi mi serve qualcosa molto piu semplice:
tirata = rand() % 12 + 1;che mi genera numeri casuali tra 1 e 12.
Il mio vero problema è implementare il fatto dello spostamento dei giocatori nel tabellone. Avevo pensato di mettere nel campo struct di ogni giocatore una variabile int posizione che mi tiene conto della posizione del giocatore...
Randomize();
tirata=random(12)+1;
cosi.?
è meglio la tirata con i due da sei, perche ci sono le stessed probabilita che in un lancio di dadi nella realta.
Il tabellone del monopoli devo per forza farlo sottoforma di lista circolare. Il problema è come faccio a chiudere la lista?? Ovvero l'ultimo elemento punta al primo?
DOmanda 2:
while(nome_casella != '#' )
dove nome_casella è una stringa mi da problemi......
In pratica i giocatori sono così memorizzati in un file
Mario 30.23
parco_della_Vittoria 10.23
viale_dei_giardini 8.32
#
Pippo
.............
..........
In pratica ogni giocatore è separato da un altro dal simbolo #
30.23 sta a indicare il capitale di mario. sotto ci sono tutte le proprietà di mario con i relativi prezzi che ogni giocatore deve pagargli nel caso ci finisse. NOme_casella è appunto il nome della proprietà (che rappresenta appunto una casella). Quel while però non me lo fa passare.
trallallero
27-06-2006, 11:26
Randomize();
Randomize() ???
forse randomize() con Borland ?
tirata=random(12)+1;
ocio che cosí ti puó uscire 1. Usi un dado che ha 0 ? :D
trallallero
27-06-2006, 11:31
Il tabellone del monopoli devo per forza farlo sottoforma di lista circolare. Il problema è come faccio a chiudere la lista?? Ovvero l'ultimo elemento punta al primo?
per forza ???
allora usa la classica struttura con gli "iteratori"
typedef struct POS
{
int Posizione;
...
struct POS *pNext;
struct POS *pPrev;
} Pos;
poi la chiudi assegnando a pNext dell'ultima il punt della prima
e a pPrev della prima il punt dell'ultima
vado a magná
davide87
27-06-2006, 11:34
Randomize() ???
forse randomize() con Borland ?
ocio che cosí ti puó uscire 1. Usi un dado che ha 0 ? :D
ramdomize(); perchè io che ho scritto..?
ah..è vero sono due dadi.. :muro:
quindi:
tirata1=random(6)+1;
tirata2=random(6)+1;
tirata=tirara1+tirara2;
potresti anche avere una lista circolare come tabellone, poi ad ogni utente nel compo posizione metti il puntatore alla casella interessata, su ogni casella (quindi su ogni elemento della lista) segnali proprietario ed eventuali edifici.
in pratica lanci i dadi
ti muovi e aggiorni la posizione
controlli se la casella ha un proprietario e paghi, altrimenti chiedi cosa fare
In pratica ho difficolta uhna volta lanciati i dadi a trovare una corrispondenza tra il numero del dado e la posizione nel tabellone.
Ad es Mario tira dadi : 8
posizione_mario=posizione_mario + 8; /* va avanti di 8 */
dopodichè come faccio a collegare la posizione attuale di marco con il nome della casella del tabellone?
non puoi farlo in C++ e usare l'OOP? sarebbe 10000 volte + facile...
trallallero
27-06-2006, 12:06
ramdomize(); perchè io che ho scritto..?
devi stare attento alla portabilitá delle funzioni.
Se non ricordo male la Borland spiega bene nel manuale
se la funzione é ANSI e su che macchine funge.
randomize() su Sun e linux non c'é
trallallero
27-06-2006, 12:40
non puoi farlo in C++ e usare l'OOP? sarebbe 10000 volte + facile...
perché ? se ha problemi a muoversi nel tabellone
non é che il C++ glielo risolve ;)
Puó fare il metodo
void MuoviPosizione(int Pos)
ma qualcosa ci deve scrivere dentro :D
In pratica ho difficolta uhna volta lanciati i dadi a trovare una corrispondenza tra il numero del dado e la posizione nel tabellone.
Ad es Mario tira dadi : 8
posizione_mario=posizione_mario + 8; /* va avanti di 8 */
dopodichè come faccio a collegare la posizione attuale di marco con il nome della casella del tabellone?
non c'é un unico modo per farlo.
Dipende da come hai impostato la cosa.
Mario che tipo di oggetto é ? la posizione ?
sono strutture ? il tabellone ?
troppe incognite :)
potresti fare cosí
typedef struct POS
{
int Posizione;
...
struct INFO *pInfo;
struct POS *pNext;
struct POS *pPrev;
} Pos;
dove INFO é la struttura che contiene le info
su quella posizione, tipo il nome della via,
il costo, il proprietario etc ...
tanto per dirne una :)
Allora Mario è il giocatore, "posizione" è il campo della struct di ogni giocatore, il tabellone è una lista di stringhe_
PARTENZA=>VIA_DANTE=>CORSO_TORINO=>.......ECC...
Se sono all'inizio e mi esce 2 con i dadi, MArio dovrà andare nella posizione 2, che nel mio esempio è CORSO_TORINO ora io dovrei vedere se Cordo Torino è proprietà di qualche altro giocatore e in tal caso pagare
Allora Mario è il giocatore, "posizione" è il campo della struct di ogni giocatore, il tabellone è una lista di stringhe_
PARTENZA=>VIA_DANTE=>CORSO_TORINO=>.......ECC...
Se sono all'inizio e mi esce 2 con i dadi, MArio dovrà andare nella posizione 2, che nel mio esempio è CORSO_TORINO ora io dovrei vedere se Cordo Torino è proprietà di qualche altro giocatore e in tal caso pagare
ma non tornerebbe + comodo usando 1 array?
in fondo hai un numero fisso di caselle e in questo modo salvi posizione corrente e hai la posizione dopo il lancio con una semplice somma
int TiraDadi()
{
return (rand() % 6 + 1) + // DADO 1
(rand() % 6 + 1); // DADO 2
}
non dovrebbe essere ((rand() % 6)+1)+((rand() % 6)+1); ?
quello che hai fatto tu calcola il random con range 6+1, cioe 7 (credo :D )
quali header servono per usare rand() ?
trallallero
28-06-2006, 09:51
non dovrebbe essere ((rand() % 6)+1)+((rand() % 6)+1); ?
quello che hai fatto tu calcola il random con range 6+1, cioe 7 (credo :D )
é uguale
% ha la precedenza su +
é come dire a * b + 1 oppure (a * b) + 1
quali header servono per usare rand() ?
stdlib.h
Secondo voi cosa sta a significare questo:
T[(partenza[i]+dado)%num_caselle]
dove dado e partenza[i] sono due interi, e num_caselle è anche lui un intero.
T è così definito char **T;
trallallero
28-06-2006, 10:27
Secondo voi cosa sta a significare questo:
T[(partenza[i]+dado)%num_caselle]
dove dado e partenza[i] sono due interi, e num_caselle è anche lui un intero.
T è così definito char **T;
char **T = array di stringhe
(partenza[i]+dado) % num_caselle = il resto della divisione tra (partenza[i]+dado) e num_caselle
punterá ad una stringa nell'array di stringhe T
E' il metodo che ha usato un mio amico per vedere, dopo il lancio dei dadi , in che casella finisce un giocatore, ma sinceramente non riesco a capire perhè ha ragionato sul resto di quella divisione........
trallallero
28-06-2006, 10:44
E' il metodo che ha usato un mio amico per vedere, dopo il lancio dei dadi , in che casella finisce un giocatore, ma sinceramente non riesco a capire perhè ha ragionato sul resto di quella divisione........
cosí al buio é difficile anche per "noi" ... :read:
non puoi mettere un'istruzione e pensare che si riesca a capire
il ragionamento del tuo amico.
il resto serve per evitare che si sfondi l'array
quando superi il numero delle caselle devi tornare da capo in un nuovo giro e la numerazione deve ripartire da 0
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.