well i have spent some time tinkering on this damn thing and i think i have the stats gen ready(well ready enough) i will post the code and i would like to know what you think of it. bear in mind that this is not a finished version, i plan on adding some stuff and making it prettier but these are the basic guts of it. please tell me what you think. Code: #include <cstdlib> #include <ctime> #include <iostream> using namespace std; int pick_skills;//makes the little loop go to pick anuther skill int skills_add;//the skill you pick to put points in int weapon_magic;//the plus from an enchantment ex. +1 or +2 int sword_attack;//<attack adds> int blunt_attack; int ranged_attack; int thrown_attack; int unarmed_attack;//</attack adds> int listen=0;//<skills> int spot=0; int search=0; int blades=0; int blunt_weapons=0; int ranged=0; int thrown=0; int unarmed=0; int arcana=0;//</skills> int base_attack;//your base attack bounus int level=1;// your current level int xp;//how much xp you currently have int xp_needed=500; int armor_rating=0;//how strong the armor you are wearing is 0 == no armor string racename;//name of the race you are int dexmod;//dex modifier int strmod;//str modifier int intelmod;//intel modifier int wismod;//wis modifier int chamod;//cha modifier int conmod;//con modifier int hd;//hit dice int str;//strength int dex;//dextarity int con;//constition int intel;//intelegance int wis;//wisdom int cha;//charisma int hp;//health int ac;//armor string name;//your name char reroll;//if you will reroll your base stats int race;//to chose what race you are int skills;//how many skillpoints you have int feats=1;//how many feats you have to pick int main() { srand((unsigned)time(0));//thing that makes a random nuber work cout<<"to use my damn menu system, when ever you see a number beside an option...enter the number... not the opiton..."<<endl; cout<<"welcome to the char generator mark I"<<endl<<"would you please enter your name"<<endl; cin>>name; cout<<endl<<"thanks you"<<endl<<endl; cout<<"your stats are as followed"<<endl<<"*************************"<<endl; do{ str = (rand()%15)+3;//<stats are started> dex = (rand()%15)+3; intel = (rand()%15)+3; wis = (rand()%15)+3; cha = (rand()%15)+3; con = (rand()%15)+3;//</stats end> cout<<"str-"<<str<<endl; cout<<"dex-"<<dex<<endl; cout<<"con-"<<con<<endl; cout<<"int-"<<intel<<endl; cout<<"wis-"<<wis<<endl; cout<<"cha-"<<cha<<endl<<endl; cout<<"would you like you reroll?"<<endl; cin>>reroll; }while(reroll == 'y'); cout<<endl<<endl<<"you must now select a race"<<endl<<endl; cout<<"1) human"<<endl<<"2) elf"<<endl<<"3) dwarf"<<endl<<"4) half-orc"<<endl<<"5) gnome"<<endl<<"6) halfling"<<endl<<"witch would you like to be? "<<endl; cin>>race;//must be one of the above races if (race == 1){ racename = "human" ; } if (race == 2){ racename = "elf"; } if (race == 3){ racename = "dwarf"; } if (race == 4){ racename = "half-orc"; } if (race == 5){ racename = "gnome"; } if (race == 6){ racename = "halfling"; } if (race == 1){//human skills = 15; feats = feats + 1;//gets one more feat hd = 4; base_attack=0; } if (race == 2){//elf dex = dex + 2; wis = wis + 2; hd = 4; skills = 15; base_attack=0; } if (race == 3){//dwarf str = str + 2; dex = dex - 2; con = con + 2; hd = 6; skills = 5; base_attack=1; } if (race == 4){//half orc str = str + 3; intel = intel - 3; dex = dex -2; cha = cha - 2; hd = 8; skills = 5; base_attack=2; } if (race == 5){//gnome intel = intel + 2; str = str - 2; hd = 3; skills = 10; base_attack=-1; } if (race == 6){//halfling str = str - 2; dex = dex + 2; hd = 4; skills = 15; base_attack=-1; } do{ cout<<"you have "<<skills<<" points to place, witch skills would you like to put them in?"<<endl<<endl; cout<<"1) listen "<<endl; cout<<"2) spot "<<endl; cout<<"3) search "<<endl; cout<<"4) blades "<<endl; cout<<"5) blunt weapons "<<endl; cout<<"6) ranged weapons "<<endl; cout<<"7) thrown weapons "<<endl; cout<<"8) unarmed(cqc) "<<endl; cout<<"9) arcana "<<endl<<endl; cin>>skills_add; if (skills_add == 1){ skills = skills - 1; listen = listen + 1; } if (skills_add == 2){ skills = skills - 1; spot =spot + 1; } if (skills_add == 3){ skills = skills - 1; search = search + 1; } if (skills_add == 4){ skills = skills - 1; blades = blades + 1; } if (skills_add == 5){ skills = skills - 1; blunt_weapons = blunt_weapons +1; } if (skills_add == 6){ skills = skills - 1; ranged = ranged + 1; } if (skills_add == 7){ skills = skills - 1; thrown = thrown + 1; } if (skills_add == 8){ skills = skills - 1; unarmed = unarmed + 1; } if (skills_add == 9){ skills = skills - 1; arcana = arcana + 1; } }while (skills > 0); strmod = (str - 10) / 2; dexmod = (dex - 10) / 2; conmod = (con - 10) / 2; intelmod = (intel - 10) / 2; wismod = (wis - 10) / 2; chamod = (cha - 10) / 2; hp=hd + conmod; ac=armor_rating + dexmod + 10; base_attack=(base_attack + strmod) + weapon_magic; sword_attack=base_attack + blades; blunt_attack=base_attack + blunt_weapons; ranged_attack=base_attack + ranged; thrown_attack=base_attack + thrown; unarmed_attack=base_attack + unarmed; cout<<endl<<endl<<endl<<"you are "<<name<<" the"<<" level "<<level<<" "<<racename<<endl; cout<<"****************"<<endl; cout<<"HP = "<<hp<<endl; cout<<"AC = "<<ac<<endl; cout<<"base attack ="<<base_attack<<endl; cout<<"str ="<<str<<"= "<<strmod<<endl; cout<<"dex ="<<dex<<"= "<<dexmod<<endl; cout<<"con ="<<con<<"= "<<conmod<<endl; cout<<"int ="<<intel<<"= "<<intelmod<<endl; cout<<"wis ="<<wis<<"= "<<wismod<<endl; cout<<"cha ="<<cha<<"= "<<chamod<<endl; cout<<"***************"<<endl; cout<<"++skills++"<<endl; cout<<"1) listen= "<<listen<<endl; cout<<"2) spot= "<<spot<<endl; cout<<"3) search= "<<search<<endl; cout<<"4) blades= "<<blades<<endl; cout<<"5) blunt weapons= "<<blunt_weapons<<endl; cout<<"6) ranged weapons= "<<ranged<<endl; cout<<"7) thrown weapons= "<<thrown<<endl; cout<<"8) unarmed= "<<unarmed<<endl; cout<<"9) arcana= "<<arcana<<endl; }
Watch all those uninitialised variables; initialise them to zero unless you have a jolly good reason for letting them default to any old crap. YES as long as they're global you can expect the compiler to do that for you, but as soon as you move one of them into a function its initial value becomes undetermined and the behaviour of any code that depends on it becomes unpredictable. Good start. Use functions; what you've got so far would makes a reasonably good initialise function although could be broken down further. One example of where you could use a function is where you initialise all the skills and adjust them according to race; if you select the race first then you can generate the skills in a function using the race-specific strengths/weaknesses as parameters. Try to make main() document the overall flow of the program. e.g.: Code: int main() { init(); // initialise everything game_load(); // load game from disk? // Main game loop while (1) { explain_point(); // display stuff about where the player is if (!player_move()) break; // if player_move() returns zero the game ends } return 0; } You can use ++ and -- instead of x=x+1 or x=x-1. The skills part could use a switch to improve readability: Code: do { cout<<1,2,3... // pseudocode cin>>skills_add; switch (skills_add) { case 1: listen++; break; case 2: spot++; break; //etc default: // don't forget a default clause in the switches break; } skills--; }while (skills > 0); Question: can you have multiple skill points, e.g. 3 listen points and 2 spot points, or are listen,spot etc yes/no flags? If you can then it should be made clearer to the player. If you can't then it'd be nice to remove from the menu anything the user already has and throw an error if they duplicate a skill.
Watch all those uninitialised variables; initialise them to zero unless you have a jolly good reason for letting them default to any old crap. YES as long as they're global you can expect the compiler to do that for you, but as soon as you move one of them into a function its initial value becomes undetermined and the behaviour of any code that depends on it becomes unpredictable. Good start. Use functions; what you've got so far would makes a reasonably good initialise function although could be broken down further. One example of where you could use a function is where you initialise all the skills and adjust them according to race; if you select the race first then you can generate the skills in a function using the race-specific strengths/weaknesses as parameters. Try to make main() document the overall flow of the program. e.g.: Code: int main() { init(); // initialise everything game_load(); // load game from disk? // Main game loop while (1) { explain_point(); // display stuff about where the player is if (!player_move()) break; // if player_move() returns zero the game ends } return 0; } You can use ++ and -- instead of x=x+1 or x=x-1. The skills part could use a switch to improve readability: Code: do { cout<<1,2,3... // pseudocode cin>>skills_add; switch (skills_add) { case 1: listen++; break; case 2: spot++; break; //etc default: // don't forget a default clause in the switches break; } skills--; }while (skills > 0); Question: can you have multiple skill points, e.g. 3 listen points and 2 spot points, or are listen,spot etc yes/no flags? If you can then it should be made clearer to the player. If you can't then it'd be nice to remove from the menu anything the user already has and throw an error if they duplicate a skill.
thanks for the input i will check out the stuff you told me i should change or add, and as far as explaning more about things such as if you can have multiple skills, i plan on doing that but thi is only an ugly test. so i guess i will get to fixing that up, thanks.^^