Codice:
#include <iostream>
#include <vector>
#include <string>
#include <sys\timeb.h>
using namespace std;
typedef pair<string, int> abilita_livello;
struct personaggio {
string nome;
string specializzazione;
vector<abilita_livello> capacita;
int pv;
int bonus;
int intelligenza;
int forza;
int vitalita;
personaggio(string &n) {
nome = n;
specializzazione = "guerriero";
bonus = 0;
}
void stampa_caratteristiche(void);
};
void personaggio::stampa_caratteristiche(void)
{
cout << "\tnome personaggio...: " << nome
<< "\n\tspecializzazione...: " << specializzazione
<< "\n\tpunti vita.........: " << pv
<< "\n\tbonus ai danni.....: " << bonus << endl;
cout << "\tScrivere e leggere: ";
if (intelligenza < 3)
cout << "poco capace" << endl;
else if (intelligenza < 5)
cout << "abbastanza bene" << endl;
else
cout << "molto bene" << endl;
cout << "\tforza..............: " << forza
<< "\n\tvitalita'..........: " << vitalita
<< "\n\tintelligenza.......: " << intelligenza << endl;
if (capacita.size()) {
cout << "\n\tAbilita':";
for (size_t i = 0; i < capacita.size(); ++i)
cout << "\n\t\t" << capacita[i].first << " (" << capacita[i].second << ")";
cout << endl;
}
}
struct {
char *nome;
bool scelta;
char *commento;
} abilita[] = { {"combattere", false, "obbligatoria per ogni guerriero che si rispetti"},
{"osservare e intuire", false, "necessaria per scorgere oggetti interessanti"},
{"parare con lo scudo", false, "indovina..."},
{"colpo forte", false, "colpo che infligge piu' danni del normale"},
{"resistere al dolore", false, "per limitare i danni quando colpito"},
{"medicina", false, "permette di curarsi di 1D6, se il tiro riesce"},
{"arte delle parolacce", false, "^_^"},
{"gioco d'azzardo", false, "^_^"},
{"furto / spionaggio", false, "secondo te?"},
{"palla di fuoco", false, "per lanciarne una devi pagare 1 punto vita"}
};
int dado(int limite)
{
static bool inizializzato = false;
if (!inizializzato) {
struct timeb tmp;
ftime(&tmp);
srand(tmp.millitm);
inizializzato = true;
}
return ((rand() % limite) + 1);
}
#include <windows.h>
HANDLE Console;
void cls(HANDLE hConsole)
{
COORD coordScreen = {0, 0};
DWORD charsWritten, ConSize;
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hConsole, &csbi);
ConSize = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter(hConsole, static_cast<TCHAR>(' '), ConSize,
coordScreen, &charsWritten);
GetConsoleScreenBufferInfo(hConsole, &csbi );
FillConsoleOutputAttribute(hConsole, csbi.wAttributes, ConSize,
coordScreen, &charsWritten);
SetConsoleCursorPosition(hConsole, coordScreen);
}
#include <conio.h>
void premi_un_tasto(void)
{
cout << "\n\t<premi un tasto per continuare>" << flush;
_getch();
cls(Console);
}
void CreaEroe() // funzione di creazione del personaggio
{
cout << "\n\t=========================\n"
<< "\tCREAZIONE DEL PERSONAGGIO\n"
<< "\t=========================\n\n"
<< "\tPrima di cominciare devi crearti il personaggio.\n"
<< "\tLe caratteristiche del personaggio sono tre:\n\n"
<< "\t\t FORZA\n"
<< "\t\t VITALITA'\n"
<< "\t\t INTELLIGENZA\n"
<< "\n\tDai un nome al tuo eroe: " << flush;
string nome;
cin >> nome;
personaggio eroe(nome);
// tiro x determinare la forza
cls(Console);
eroe.forza = dado(6);
cout << "\n\tTiro dado per determinare la FORZA: " << eroe.forza << endl;
switch (eroe.forza) {
case 6:
cout << "\tBonus +2 al danno inflitto con armi da corpo a corpo.\n";
eroe.bonus = 2; break;
case 5:
cout << "\tBonus +1 al danno inflitto con armi da corpo a corpo.\n";
eroe.bonus = 1; break;
case 4: case 3:
cout << "\tNessun bonus alla forza.\n"; break;
case 2: case 1:
cout << "\tChe schifo!\n"; break;
}
premi_un_tasto();
// tiro x determinare la vitalità
eroe.vitalita = dado(6);
cout << "\n\tTiro dado per determinare la VITALITA': " << eroe.vitalita << endl;
eroe.pv = eroe.vitalita + 10;
cout << "\n\t10 + " << eroe.vitalita << " = " << eroe.pv << endl;
cout << "\n\tI punti vita sono i danni che il tuo personaggio puo'\n"
<< "\tsubire prima di morire. Se subisci danni puoi recupe-\n"
<< "\trare punti vita utilizzando delle pozioni di cura.\n" << endl;
// tiro x determinare l'intelligenza
premi_un_tasto();
eroe.intelligenza = dado(6);
cout << "\n\tTiro per determinare l'INTELLIGENZA: " << eroe.intelligenza << endl
<< "\n\tL'intelligenza ti permette di usare alcune delle abilita'\n"
<< "\tche vedrai tra poco. Piu' il valore e' alto, piu' abili-\n"
<< "\tta' potrai scegliere.\n" << endl;
// riepilogo caratteristiche
premi_un_tasto();
cout << "\n\t====================================="
<< "\n\tRIEPILOGO PERSONAGGIO - - - PARTE 1/2"
<< "\n\t=====================================\n" << endl;
eroe.stampa_caratteristiche();
cout << "\n\t=====================================" << endl;
premi_un_tasto();
// abilità
cout << "\n\tSCELTA ABILITA'\n" << endl;
int limite = (eroe.intelligenza < 5) ? 9 : 10;
for (int i = 0; i < limite; ++i)
cout << "\t " << (i+1) << ": " << abilita[i].nome
<< " (" << abilita[i].commento << ")" << endl;
cout << endl;
// scelta abilità
int rimaste = eroe.intelligenza;
do {
cout << "\tPuoi scegliere "
<< ((rimaste == eroe.intelligenza) ? "al massimo " : "ancora ")
<< rimaste << " abilita'" << endl;
int num;
do {
cout << "\tInserisci un numero da 1 a " << limite << ": " << flush;
cin >> num;
} while (!(num > 0 && num <= limite));
num--; // l'indice comincia da 0
if (!abilita[num].scelta) { // se non gia' selezionata
abilita[num].scelta = true;
cout << "\tScelta abilita\' \'" << abilita[num].nome << "\'"<< endl;
eroe.capacita.push_back(make_pair(abilita[num].nome, 0));
rimaste--;
}
} while (rimaste > 0);
// assegna punti ad abilità
cls(Console);
cout << "\n\tHai scelto le seguenti abilita':" << endl;
for (size_t i = 0; i < eroe.capacita.size(); ++i)
cout << "\t\t" << eroe.capacita[i].first << endl;
cout << "\n\tAdesso devi scegliere quanti punti dare ad ogni abilita' che"
<< "\n\thai scelto. I punti totali sono dati dalla somma dei valori "
<< "\n\tdelle tue caratteristiche."
<< "\n\tAd ogni abilita' puoi dare al minimo un punto e al massimo"
<< "\n\tcinque. Questi punti servono ad indicare quanto il tuo per-"
<< "\n\tsonaggio e' capace di usare una certa abilita'."
<< "\n\tTutte le abilita' che non hai selezionato hanno zero punti."
<< endl;
premi_un_tasto();
int totale = eroe.intelligenza + eroe.forza + eroe.vitalita;
for (size_t i = 0; i < eroe.capacita.size(); ++i) {
int punti_restanti = (totale > 5) ? 5 : totale;
cout << "\n\t-> " << eroe.capacita[i].first
<< "\n\thai " << totale << " punti da distribuire.\n"
<< "\tQuanti ne dai a " << eroe.capacita[i].first << "?" << endl
<< "\tInserisci qui un numero da 1 a "
<< punti_restanti << ": " << flush;
int quanti;
do {
cin >> quanti;
} while (!(quanti > 0 && quanti <= punti_restanti));
eroe.capacita[i].second = quanti;
totale -= quanti;
if (totale == 0)
break;
}
cout << "\n\tCREAZIONE PERSONAGGIO COMPLETATA!!!\n" << endl;
premi_un_tasto();
// riepilogo finale personaggio
cout << "\n\t====================================="
<< "\n\tRIEPILOGO PERSONAGGIO - - - PARTE 2/2"
<< "\n\t=====================================\n" << endl;
eroe.stampa_caratteristiche();
cout << "\n\t=====================================" << endl;
}
int main(void)
{
Console = GetStdHandle(STD_OUTPUT_HANDLE);
CreaEroe();
}