Zdravím,
mám do školy projekt a potřebuji generátor náhodných čísel 1-10, ale aby se generátor dal spustit vícekrát a vyřadil již použité číslo...
Použití je pro generování rozhovoru v textové adventuře, aby nebyl pokaždé stejný...
Zatím to mám takto, že to jede rozhovory od 1 do 3.....
void potkal(Nepritel* nepr){
if (nepr->vratIq()) {
int x;
x=x+1;
switch (x)
{
case 1 : cout<<"První rozhovor";break;
case 2 : cout<<"Druhý rozhovor";break;
case 3 : cout<<"Třetí rozhovor";break;
default : cout<<"Nejsi natolik inteligenti, aby jsi alespon trefil spravnou klavesu, jdi radeji hned bojovat!"; metoda boje; break;
}
}else{
cout << "zde bude metoda BOJE" <<endl;}
}
Fórum › C / C++
Projekt do školy
To TomasP :
Řešení bude určitě víc. Takové jednoduché, co mě teď napadá, může být třeba:
Udělej si pole o 10 int prvcích.
Prvky pole inicializuj pole[i]=i+1 (pro čísla 1-10).
Udělej si cyklus o libovolném (ale vhodném) počtu opakování.
V každém běhu cyklu prohoď dva prvky na náhodně vybraných indexech.
Tím si pole zamícháš.
A v tom tvém algoritmu vyměň switch(x) za switch(pole[x % 10]).
Tak jsem se teď ještě zasekl u posledního problému, v zadání je, že musíme vytvořit několik planet :
Z planety na planetu lze cestovat pomocí hlavního menu hry nebo přímo z určité jiné planety.
Příkad obsahu planety: Přicestoval jsi na Venuši, můžeš jít do kosmického baru U proražené helmy (klávesa H), do hotelu U natrhlého skafandru (S) nebo na policejní stanici (P). Tvoje volba:
Nevím jak tohle udělat, nespíše nějakou třídu PLANETAX, ze které se bude dědit nějaké vlastnosti (spíše bych řekl metody, jediný atribut co by to mohlo mít je leda název) jako je ten CESTOVACI PORTAL, BAR, HOTEL.... a pak ke každé planetě mohu ještě přidat XY míst, kam se dá jít...
Tady však moje uvažování končí... Jak udělat to MENU hry a ten portal, nevím.... A jak pak udělt, že když jdu do baru, tak to vypíše "něco" a vygeneruje to tam nějaký předmět, nebo nepřítele? Nebo to nejde generovat a musím ručně napsat, že na té a té planetě v baru je nepřítel, ve zbrojovce dostane štít atd... ?
Vcelku důležitá otázka - má se jednat o textovou hru, nebo bude mít i nějaké grafické rozhraní?
Tak mi to pořád nejde, jak to udělat? Pokoušel jsem se to udělat přímo v MAINu a nic... ani pomocí nějakých metod mi to nechce fungovat, jak bych si přál :(...
Poraďte alespoň nějaký způsob jak to bude fungovat, ať vím kde hledat chybu, zda v mém kódu, nebo v myšlence...
Můžeš to udělat třeba tak že planeta bude třída a bude si uchovávat pole/spojový seznam míst kam můžeš jít a hlavně ukazatel na pole/začátek spojovýho seznamu planet. Z hlavního menu ti to vypíše seznam planet. A z každý planety se taky dostaneš na každou páč tam máš ten ukazatel. Je to návrhovej vzor jméno si nevzpomenu ale on mě když tak někdo doplní.
Možná se to dá řešit jednodušejc ale mě napadl jen ten návrhovej vzor. Tady je Taková funkční ukázka nic moc tam definovanýho není jen tak aby to něco dělalo. Je tam takovej nástřel jak by to mohlo bejt samozřejmě data tam asi budeš cpát nějak jinak než takhle natvrdo ale jako ukázka to snad bude stačit.
#include <iostream>
#include <cstdlib>
using namespace std;
class Misto
{
private:
string nazev; //jmeno mista
public:
Misto(char *ret) : nazev(ret) { }
~Misto() { }
void VypisNazev() { cout << "Jmeno mista: " << nazev << endl; }
};
class Planeta
{
private:
Misto *mista; //dynamicke pole ktere bude uchovavat mista kam muzete jit na planete
Planeta *seznam; //zacatek pole planet
int MAX; //pocet planet
string nazev; //jmeno planety
public:
Planeta() : nazev() { mista = NULL; seznam = NULL; MAX = 0; }
~Planeta() { seznam = NULL; mista = NULL; }
void NastJmeno(char *ret) { nazev = ret; }
void NastPlanety(Planeta *p, int poc) { seznam = p; MAX = poc; }
void JmenoPlanety() { cout << "Jmeno planety: " << nazev << endl; }
void SeznamPlanet() {
for (int i = 0; i < MAX; i++) { //vypise vse krom aktualni planety
if ((seznam+i) != this)
seznam[i].JmenoPlanety();
}
}
};
int main()
{
const int MAX = 4;
Planeta planety[MAX];
planety[0].NastJmeno("Venuse"); //ulozeni jmen planet
planety[1].NastJmeno("Zeme");
planety[2].NastJmeno("Uran");
planety[3].NastJmeno("Neptun");
for (int i = 0; i < MAX; i++) {
planety[i].NastPlanety(planety, MAX); //nastavi ukazatel na zacatek pole vsem planetam
}
cout << "Seznam planet z menu hry:\n";
for (int i = 0; i < MAX; i++) {
planety[i].JmenoPlanety();
}
cout << "\n\nSeznam planet, na ktery se dostanete z prvni planety:\n";
planety[0].SeznamPlanet();
cout << "\n\n";
system("pause");
return 0;
}
]
@Matrix17: tak jsme na to ve škole s kámošem koukali a nikdo nevěděl jak tam to cestování bude fungovat (c++ máme první semestr) a hlavně jak tam dostat tohle (27.11.2010):
Příkad obsahu planety: Přicestoval jsi na Venuši, můžeš jít do kosmického baru U proražené helmy (klávesa H), do hotelu U natrhlého skafandru (S) nebo na policejní stanici (P). Tvoje volba:
A když bych třeba zmáčkl to H tak by mi to zavolalo nějakou metodu, dvě, které mám ve třídě HRDINA a něco vypsalo...
Nechce se mi sem dávat celý zdroják, protože je to přeci jen projekt ze školy a kdyby to někdo okopíroval, tak to asi nevysvětlím, ale pokud bude mít někdo stejnou část na přemisťování z planet, tak bych si to obhájil jednoduše, že jsem nevěděl, tak jsem potřeboval pomoct a tu jsem našel tady a vysvětlil bych mu co a jak funguje atd., proto to chci taky pochopit, nejen zkopírovat...
O veškerý cestování by se starala planeta. Třída Misto by mohla bejt buď třída od který by se dědily věci jako bar, hospoda, hotel nebo že by všechny místa měly stejný atributy takže by to bylo pro všechny společný.
Fungovat by to mohlo třeba takhle. Z nějakýho souboru si načtečteš všechny planety, tj. jména, jaký místa tam dou navštívit a případně nějaký další věci co si vymyslíš. Pak tomu předáš ukazatel na začátek pole těch planet jako sem to dal do toho For cyklu.
A když tam chceš narvat i hrdinu tak máš dvě možnosti:
1) dáš tam taky takhle adresu hrdiny do všech planet, není to moc praktický ale máš jednoduchej přístup
2) akorát při volání funkce předáš adresu hrdiny jako parametr fce. Takže máš k němu přístup a klidně tam hrdinů můžeš mít víc.
Mohl bys to udělat třeba tak že přicestuješ na planetu předáš funkci cesta toho hrdinu. Budeš se tam nějak motat, tj. zajdeš do baru, do hotelu, do dolu to je fuk. A když budeš chtít odejít tak akorát přes to menu planety vrátíš ukazatel na novou planetu. V hlavní funkci si ten ukazatel odchytneš a zavoláš tu samou fci jako předtím a předáš jí zase toho hrdinu. Snad sem to moct nezamotal... :-)))
Co takhle nejaka trida vesmir, ktera by drzela napr pole trid planeta a obstaravala "cestovani" + drzela info na jaky planete prave jsi. Ve tride planeta by jsi pak drzel info kam se vsude muzes dostat + info o planete? Jenom napad...
Dobrý den,
tak jsem tu po delší době a ty předchozí řešení jsou na mou hlavu až moc.... Vymyslel jsem svoje, ale nefunguje, můžete poradit, popřípadě to trochu poupravit??? Děkuji!
#include <iostream>
using namespace std;
class Mista{
private:
string bar;
string hotel;
public:
Mista(){
bar = "Bar u sileny kravy (b)";
hotel = "Hotel ***** (h)";
cout << "Vznikly mista"<<endl;
}
void vypisPopis(){
cout << "Nazev mista: "<< bar <<endl;
cout << "Nazev mista: "<< hotel <<endl;
}
};
class Planeta{
private:
string Jmeno;
Mista* mistaNaPlanete;
public:
Planeta(){
Jmeno = "zeme";
cout << "Vznikla planeta"<<endl;
}
void vypisPopis(){
cout << "Jsi na planete: " << Jmeno <<endl;
cout << "zde muzes jit do: " << endl;
mistaNaPlanete->vypisPopis();
}
};
class nepritel{
public:
int sila;
nepritel(){
sila=10;
cout << "Vznikl nepritel"<<endl;
}
};
class clovek{
public:
int zivot;
clovek(){
zivot=100;
cout << "Vznikl clovek"<<endl;
}
void cestuj(Planeta* planeta){
planeta->vypisPopis();
zacatek:
string x;
switch (x)
{
case 'b' :
cout << potkal(mutant);
break;
case 'h' : potkal(mutant2);
break;
default : cout<<"Jina klavesa, znovu";goto zacatek;
break;
}
}
void boj(nepritel* nep){
zivot = zivot - nep->sila;
}
void potkal(nepritel*nep){
cout << "Potkal jsi nepritele, chces s nim bojovat? (a) ANO - (n) NE"<<endl;
string rozhodnuti;
cin >>rozhodnuti;
if (rozhodnuti == "a"){boj(nep);}else{cout<<"OK tak jdi dal..."<<endl;}
}
};
int main()
{
Planeta* zeme = new Planeta();
Mista* jedna = new Mista();
nepritel* mutant =new nepritel();
nepritel* mutant2 =new nepritel();
clovek* cestovatel = new clovek();
jedna->vypisPopis();
zeme->vypisPopis();
cout << "Bezchybne zkompilovano..." << endl;
return 0;
}
Ono by stačilo cestování pouze 1* ... Chci mít 3 planety, jedna mě hned zabije, na druhé budu mít možnost - prozkoumat - ANO - NE pokud ANO tak se zavola metoda nasel a pak zase by byla možnost odletět pryč... Na té hlavní planetě by byly ty místa, kde kdyz zmáčknu B tak mi to zavolá metodu POTKAL (dosadím si koho) a metodu NASEL (opet nejak dosadim co) a takto prozkoumat cely svet a konec... :(
To joudicek : Tvůj příspěvek to pěkně popisuje a zkus se na to zaměřit a najít cestu jak to udělat. Z toho kódu je vidět, že objektově moc programovat neumíš. To neber prosím nijak zle... Já vím, že objektově programovat není hračka. Takhle rád bych ti to opravil ale háček je v tom, že bych ti to vlastně celý předělal, ty bys tomu nerozumněl a já bych ti to udělal prakticky celý, což nechci. Musíš se víc mrknout na třídy a ještě jednou si pak projdi ten můj kód. Případně se zeptej jestli některá věc není úplně jasná.
Takhle sem to myslel já:
Trida clovek: mela by zivoty, utok, jmeno
metody: ziskani poctu zivotu, ziskani jmena, zmenu zivotu...
z tridy clovek si pak vytvoris nepratele i hrdinu
Trida planeta: jmeno, seznam mist (pole trid Misto)
metody: ziskani jmena, vypis mist kam se dostanes...
Trida misto popisuje misto kde se nachazis:
atributy: nazev
metody: menu co tam muzes delat
Ty metody si nadefinujes tak jak si psal. Jediny, co mas spatne je navrh...
Nebo to zkus jak ti radil joudicek. To je nejspíš i lepší a hlavně pro začátečníka snáž napsatelný.
Trida vesmir bude tvoje rozhrani kde budes mit planety a bude se starat o veškerou režiji kolem cestování.
atributy: pole planet, neco (ukazatel, index pole) co bude rikat kde si
Tak ja mam c++ zatim v prvnim semestru, jsem rad ze to vubec funguje... Jak se správně programuje objektově vlastně poradně nevím, vím jak se dělaj nějaky metody a znám pár funkcí a to je vše... Programování vidím poprvé, takže budu rád za kritiku, popřípadě nějaký dobrý odkaz na literaturu....
OK, pokusim se to tedy nějak udělat.... Snad je to poslední příspěvek a už to pošlape.... Díky moc všem za rady
Můžeš zkusit Mistrovství C++. Celý to 100% nestihneš ale stačí když si tam najdeš třídy a věci kolem. Nebo C++ za 21 dní. Případně i nějaký materiály na netu. První dva sou kurzy ten třetí odkaz tam sou další odkazy.
[url]
http://web.archive.org/web/20050214190118/www.eternal.cz/index.php?nLevel=21
[/url]
[url]
http://www.builder.cz/serial24.html
[/url]
[url]
http://pepinator.tym.cz/tutorials/cpp/tutorial_cpp.php
[/url]
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Shanim programatora na projekt do skoly za 1000kc..... — založil gainner99
Práce do školy — založil Black
Program do školy... — založil Mokky
NTB do školy — založil ITLover
Práce do školy. — založil Začátečník JK
Moderátoři diskuze