PDA

Visualizza la versione completa : [C++] piccola slot machine, cerco consigli...


Jacki93
06-09-2008, 16:46
Ciao... ho fatto questo codice, che simula una specie di slot machine, sto cercando consigli per migliorare il codice, che nn mi sembra un gran ch perche continua ad aprire chiudere file ecc... ci sara sicuramente un modo per farlo meglio, premtetto che programmo amatorialmente, ho solo 15 anni, quindi nn insultatemi troppo :zizi: vi posto il codice:


#include <fstream>
#include <iostream>

using namespace std;


int main()
{

//dichiaro i numeri
int n01;
int n02;
int n03;
int n04;
int n05;
int n06;
int n07;
int n08;
int n09;

//dichiaro due stringhe che mi permettono di andare avanti con il gioco
string s1;
string s2;

do {

//apro il file machine.txt che contiene il numero di gettoni
int tmachine;
ifstream tokensmachine ("machine.txt");
tokensmachine >> tmachine;
tokensmachine.close();

//gettoni dell'utente
int tmember;
ifstream tokensmember ("tokens.txt");
tokensmember >> tmember;
tokensmember.close();

//vincite
int win1 = 8;
int win2 = 4;
int win3 = 1;

//...
int numberw;
int totokens;

//randomizzo i numeri che ho dichiarato all'inizio
n01 = rand() % 3 + 1;
n02 = rand() % 3 + 1;
n03 = rand() % 3 + 1;
n04 = rand() % 3 + 1;
n05 = rand() % 3 + 1;
n06 = rand() % 3 + 1;
n07 = rand() % 3 + 1;
n08 = rand() % 3 + 1;
n09 = rand() % 3 + 1;

//stampo il numero di gettoni in palio e se l'utente vuole spendere un gettone per giocare
cout << "Montepremi: " << tmachine << " gettoni! ";
cout << "Gettoni che possiedi: " << tmember << "!" << endl;
cout << "Vuoi tentare la fortuna inserendo un gettone nella macchinetta? [s/n] ";
cin >> s1;

//se l'utente inserisce il gettone procedo con il gioco
if (s1 == "s") {

//salvo machine.txt con un gettone in pi rispetto a prima
int addtokens = 1+tmachine;
ofstream addtokensmachine ("machine.txt");
addtokensmachine << addtokens;
addtokensmachine.close();

//salvo tokens,txt con un gettone in meno
int reltokens = tmember-1;
ofstream reltokensmember ("tokens.txt");
reltokensmember << reltokens;
reltokensmember.close();

//stampo i numeri random in tre colonne e tre righe
cout << " " << n01 << " " << n02 << " " << n03 << "" << endl;
cout << " " << n04 << " " << n05 << " " << n06 << "" << endl;
cout << " " << n07 << " " << n08 << " " << n09 << "" << endl;

//se una delle tre righe uguale es: 3 3 3 il giocatore vince
if (n01 == n02 && n01 == n03) {

numberw = n01;
if (numberw == 3)
totokens = win1;
else if (numberw == 2)
totokens = win2;
else if (numberw == 1)
totokens = win3;
cout << "Complimenti! Hai vinto " << totokens << " gettoni!" << endl;

} else if (n04 == n05 && n04 == n06) {

numberw = n01;
if (numberw == 3)
totokens = win1;
else if (numberw == 2)
totokens = win2;
else if (numberw == 1)
totokens = win3;
cout << "Complimenti! Hai vinto " << totokens << " gettoni!" << endl;

} else if (n07 == n08 && n07 == n09) {

numberw = n01;
if (numberw == 3)
totokens = win1;
else if (numberw == 2)
totokens = win2;
else if (numberw == 1)
totokens = win3;
cout << "Complimenti! Hai vinto " << totokens << " gettoni!" << endl;

} else {
cout << "Sei stato sfortunato! Riprova!" << endl;
numberw = 0;
}

//se la vincita e maggiore di 0 salvo il risultato sul file
if (numberw > 0) {
ofstream addtokensmember ("tokens.txt");
addtokensmember << tmember+totokens;
addtokensmember.close();

ofstream reltokensmachine ("machine.txt");
reltokensmachine << tmachine-totokens;
reltokensmember.close();
}

}

cout << "Vuoi ritentare? [s/n] ";
cin >> s2;
cout << endl << endl;

} while(s2 == "s"); //se il giocatore vuole ritentare il ciclo rinizia da capo

return 0;
}



Spero che abbiate qualche idea da suggerirmi per migliorare... ciaooo e grazie... :unz:

Xaratroom
06-09-2008, 17:51
Indenta il codice, dividilo in funzioni e controlla il funzionamento delle singole procedure ...
(in cpp funzioni e procedure sono la stessa cosa)

http://programmazione.html.it/guide/lezione/1102/le-funzioni/

MacApp
06-09-2008, 18:15
considera il tuo codice:


//dichiaro i numeri
int n01;
int n02;
int n03;
int n04;
int n05;
int n06;
int n07;
int n08;
int n09;


e se avessi avuto a che fare con centinaia di numeri?

spunto per una possibile soluzione:


int n [9];

;-)

Xaratroom
06-09-2008, 18:20
http://programmazione.html.it/guide/lezione/1099/cosa-sono-gli-array/

Jacki93
06-09-2008, 23:02
ok, creare l'array va bene (int n[9]), ma come faccio dopo a randomizzarli tutti in modo che siano tutti diversi? potrei usare un for?

for (i=0; i<=9; i++)
{
n[i] = rand() % 3 + 1;
}

per usare delle funzioni, come faccio a decidere quali azioni mettere in una funzione?
non molto facile da decidere e da orientarsi... grazie mille per i suggerimenti... :)

Xaratroom
07-09-2008, 01:00
prima del for metti srand((unsigned int) time(NULL));
per generare un seme ogni volta diverso (e non ottenere uguali risultati da rand, ad ogni avvio dell'applicativo).

Attenzione al for


int n01;
int n02;
int n03;
int n04;
int n05;
int n06;
int n07;
int n08;
int n09;

lo hai tradotto in:


int n[9]

quindi:


for (unsigned int i = 0; i < 9; i++)
{
n[i] = rand() % 3 + 1;
}


Dovresti creare funzioni a se stanti, che non necessitino di un contesto per funzionare.
Un esempio potrebbe essere una funzione per inizializzare un vettore, con valori casuali...
Impara a passare un array ad una funzione

:ciauz:

Jacki93
07-09-2008, 10:00
ok, fino al primo pezzo ci ero arrivato.. grazie..

per passare a una funzione un array nn basta fare come al solito:

int miaFunzione (int n[9])
{
}


???

EDIT: il problema della riassegnazione dei rand nn si pone perch la randomizzazione all'interno del do-while e ripete tutto... almeno a me va....

EDIT2:
ho provato a fare una funzione che serve per agiornare i file di testo... il problema adesso il passaggio deid ati alla funzione:

Funzione:

int tokens (int t[4], string fat, int totokens) {
ifstream tokensmachine ("machine.txt");

if (fat == "assign") {
tokensmachine >> t[1];
} else if (fat == "relone") {
t[3] = t[1]-1;
tokensmachine >> t[3];
} else if (fat == "win") {
t[3] = t[1]-totokens;
tokensmachine >> t[3];
}

tokensmachine.close();

ifstream tokensmember ("tokens.txt");

if (fat == "assign") {
tokensmember >> t[2];
} else if (fat == "relone") {
t[4] = t[2]-1;
tokensmember >> t[4];
} else if (fat == "win") {
t[4] = t[2]+totokens;
tokensmember >> t[4];
}

tokensmember.close();
}


Passaggio alla funzione:


fat = "assign";
tokens(int t[4], int fat, int totokens);


sbaglio nel passaggio dell array t? AIuto please.. ciao e grazie..

LeleFT
08-09-2008, 08:31
Come indicato nel regolamento, per il codice si utilizzano i tag
e e non i tag QUOTE come hai fatto finora... utilizzando gli appositi tag CODE il codice rimane indentato e pi facilmente leggibile...


Ciao. :ciauz:

Jacki93
08-09-2008, 13:11
ah ok.... grazie.. cmq nn ho pochi problemi con la funzione :(

Xaratroom
10-09-2008, 00:51
Uno sguardo alla guida ?



#include <iostream>
#include <cstdlib>
using namespace std;

void foo (int array[], unsigned int n);

main ()
{
int arr[10];
foo (arr, 10);

for (unsigned int i = 0; i < 10; i++)
cout << arr[i] << endl;

cout << endl;
return EXIT_SUCCESS;
}

void foo (int array[], unsigned int n)
{
srand((unsigned int) time(NULL));
for (unsigned int i = 0; i < n; i++)
{
array[i] = rand() % 3 + 1;
}
}

Loading