Permalänk
Medlem

c++ frågor

hej
jag läser en kurs i c++ och lärarna når man på discord, men man får aldrig någonsin kontakt med dom så jag frågar här istället

jag gör en inlämningsuppgift, ett spel, med 5 st while loopar för att ta mig runt i olika steg i spelet där man kan sätta in pengar, satsa pengar, ta ut pengar osv. jag använder inga funktioner då det inte var något krav för första uppgiften. dessa ser ut som följande:

while i=standby
i= play
i=deposit
i=withdraw
i=poor (här hamnar man när man satsar mer än vad man har på kontot)

------------

mina frågor:
jag frågar hur mycket spelaren vill sätta in. men jag vill endast tillåta hela hundratal, hur uppnår jag det?

efter klockan 02 vill jag att spelet ska brytas. hur löser jag det? jag använder ju "i" som en variabel som jag ändrar för att hoppa till olika while loopar, men om klockan är efter 02, kan jag då göra en till while loop som säger att när klockan är mellan 02-06 blir i=standby typ? det känns lite konstigt liksom, för man kan väl inte ha två while loopar samtidigt, eller?

-------------

det här är inga krav för uppgiften, som iofs har väldigt oklara instruktioner. man ska anta dolda krav och antaganden men det är så otroligt dåligt beskrivet vad som krävs. svaren man får av läraren är "det är inte så noga. bara det funkar :)" på det mesta... mitt program fungerar som det ska men tänker att jag lägger in några sånnahär dolda krav eller whatever, för att vara på säkra sidan

Permalänk
Medlem

En enkel lösning för att endast tillåta hundratal är att helt enkelt låta spelaren mata in antalet hundratal istället för hela summan, och sen multiplicera vad spelaren matat in med 100. Men om du vill låta spelaren mata in hela summan och sen kontrollera om det är ett helt hundratal så kan du använda modulo-operator %.

När det gäller dina loopar så förstår jag inte riktigt hur looparna hjälper dig med flödet i programmet, du skulle behöva visa lite kod för att visa hur du egentligen gör. Det låter som att du försöker implementera en tillståndsmaskin, och för det behöver du bara en variabel som håller koll på tillståndet och en loop:

enum class State { Standby, Play, Deposit, Withdraw, Poor, Quit } int main() { State state = State::Standby; while (state != State::Quit) { switch (state) { case State::Standby: // Kod för standby break; case State::Play: // Kod för play break; // etc } } }

Sen ändrar du bara värdet på state när du vill gå till ett annat tillstånd i nästa iteration av loopen.

Permalänk
Medlem
Skrivet av perost:

En enkel lösning för att endast tillåta hundratal är att helt enkelt låta spelaren mata in antalet hundratal istället för hela summan, och sen multiplicera vad spelaren matat in med 100. Men om du vill låta spelaren mata in hela summan och sen kontrollera om det är ett helt hundratal så kan du använda modulo-operator %.

När det gäller dina loopar så förstår jag inte riktigt hur looparna hjälper dig med flödet i programmet, du skulle behöva visa lite kod för att visa hur du egentligen gör. Det låter som att du försöker implementera en tillståndsmaskin, och för det behöver du bara en variabel som håller koll på tillståndet och en loop:

enum class State { Standby, Play, Deposit, Withdraw, Poor, Quit } int main() { State state = State::Standby; while (state != State::Quit) { switch (state) { case State::Standby: // Kod för standby break; case State::Play: // Kod för play break; // etc } } }

Sen ändrar du bara värdet på state när du vill gå till ett annat tillstånd i nästa iteration av loopen.

smart att bara multiplicera med 100. det lär nog klassas som en godkänd lösning ändå, betygskriterierna verkar inte vara speciellt höga om man säger så. ska ta en titt på den där länken.

flödet är nog rätt junk by all means,

tänk dig att efter att man satt in pengar och flyttats till i=play där man får satsa på ett nummer, får man frågan om man vill spela igen, sätta in mer eller ta ut. därefter ändras i så att man hamnar i rätt while loop igen och sen börjar det om i all evighet. väljer man att ta ut pengarna sätts spelet i standby läget där nästa spelare på tur kan starta spelet.

vill helst inte klistra in kod för att råka ut för att de kanske granskar om koden finns på internet

jag kan egentligen bara if, for, och while typ jag läste python för ett år sedan och det är typ det jag kommer ihåg, så har bara använt mig av dom gamla kunskaperna egentligen, för att göra det lätt för mig. arbetar samtidigt så tänkte mest roffa åt mig lite enkla hp så att säga

Permalänk
Medlem
Skrivet av HickeHiskelig:

mina frågor:
jag frågar hur mycket spelaren vill sätta in. men jag vill endast tillåta hela hundratal, hur uppnår jag det?

efter klockan 02 vill jag att spelet ska brytas. hur löser jag det? jag använder ju "i" som en variabel som jag ändrar för att hoppa till olika while loopar, men om klockan är efter 02, kan jag då göra en till while loop som säger att när klockan är mellan 02-06 blir i=standby typ? det känns lite konstigt liksom, för man kan väl inte ha två while loopar samtidigt, eller?

-------------

det här är inga krav för uppgiften, som iofs har väldigt oklara instruktioner. man ska anta dolda krav och antaganden men det är så otroligt dåligt beskrivet vad som krävs. svaren man får av läraren är "det är inte så noga. bara det funkar :)" på det mesta... mitt program fungerar som det ska men tänker att jag lägger in några sånnahär dolda krav eller whatever, för att vara på säkra sidan

Det låter lite som att det är ganska tidigt i utbildningen, men switch case med funktioner är nog hur jag hade löst det:
pseudo kod

while gameRunning{ // här kan du sätta guard clauses som förhindrar nested if satser if (time > 2 && time < 6) { cout << "Casino closed between 02 and 06" input(); // väntar på input från användaren continue; // continue hoppar över resten av loopen och går till nästa iteration } switch (i){ case play: play(); break; case deposit: deposit(); break; case withdraw: withdraw(); break; case poor: poor(); break; } }

När du vill att spelaren bara ska sätta in så kan du använda + och - istället, eller köra med casinomarker värda 100, eller kolla att användaren matar in korrekt.

Permalänk
Medlem
Skrivet av swesen:

Det låter lite som att det är ganska tidigt i utbildningen, men switch case med funktioner är nog hur jag hade löst det:
pseudo kod

while gameRunning{ // här kan du sätta guard clauses som förhindrar nested if satser if (time > 2 && time < 6) { cout << "Casino closed between 02 and 06" input(); // väntar på input från användaren continue; // continue hoppar över resten av loopen och går till nästa iteration } switch (i){ case play: play(); break; case deposit: deposit(); break; case withdraw: withdraw(); break; case poor: poor(); break; } }

När du vill att spelaren bara ska sätta in så kan du använda + och - istället, eller köra med casinomarker värda 100, eller kolla att användaren matar in korrekt.

yes, det är första veckorna av kursen, läser ju den på 33% fart över sommaren
så jag kan kopiera den här biten och slänga in den rakt in nederst i programmet?

while gameRunning{
// här kan du sätta guard clauses som förhindrar nested if satser
if (time > 2 && time < 6) {
cout << "Casino closed between 02 and 06"
input(); // väntar på input från användaren
continue; // continue hoppar över resten av loopen och går till nästa iteration
}

fast jag vill dock inte ha någon input här tror jag, utan jag vill nog tvinga användaren ta ut pengarna vilket ju bara är att skriva i cout, och sedan skickas man till standby läget efter kl 06 där man kan börja ett nytt spel dvs sätta i=standby när if är färdigt

Permalänk
Medlem
Skrivet av HickeHiskelig:

yes, det är första veckorna av kursen, läser ju den på 33% fart över sommaren
så jag kan kopiera den här biten och slänga in den rakt in nederst i programmet?

while gameRunning{
// här kan du sätta guard clauses som förhindrar nested if satser
if (time > 2 && time < 6) {
cout << "Casino closed between 02 and 06"
input(); // väntar på input från användaren
continue; // continue hoppar över resten av loopen och går till nästa iteration
}

fast jag vill dock inte ha någon input här tror jag, utan jag vill nog tvinga användaren ta ut pengarna vilket ju bara är att skriva i cout, och sedan skickas man till standby läget efter kl 06 där man kan börja ett nytt spel dvs sätta i=standby när if är färdigt

Du har inte förklarat tillräckligt mycket för att vi ska veta vad "efter 02" betyder eller vad du vill göra då, så drog till med ett exempel bara. Input() är bara en placeholder, tanken var kanske någon typ av "press enter to continue".

Förlåt inser att jag borde förklara koden mer.
Min pseudo kod var tänkt att visa ett sätt att lösa övergripande spelflödet så att det ska vara enkelt att följa vad som kommer exekvera.

while gameRunning

Är en loop som omsluter hela spel delen. "gameRunning" är bara en bool, sätt den till "false" för att avsluta spelet.

En guard clause är ett sätt att förhindra nestade if satser.

Idéen är att man skapar if satser som förhindrar att koden under körs när den if satsen stämmer. Att förhindra att en loop fortsätter osv.
Om man är i en funktion så funkar "return" som direkt avslutar funktionen, eller skapa någon typ av error. Du får nog lära dig senare hur man hanterar error.
I loopar kan man avsluta loopar med "break" då avslutas loopen. I koden ovan så är det flera break med men de avslutar

switch (i){}

som också är en typ av loop. "continue" skippar resten av koden i loopen och startar ifrån början av loopen igen.

En switch kan du tänka är som ett smidigare sätt än att skriva

if(i == play){} else if(i == deposit){} else if(i == withdraw){} // Eller while (i == play){} while (i == deposit){} while (i == withdraw){}

Du jämför variabeln i parantesen med varje case.

Permalänk
Medlem

Innan du tar visdom av alla kommentarer ovan, så bör du använda lösningar som ni lärt er under kursen.
En kompis bad mig göra hans inlämningsuppgift för kanske 10 år sedan. och jag gjorde den givetvis då med dom kunskaperna jag hade. I detta fallet var det lösningar som dom inte lärt sig ännu.

Min kompis blev utfrågad av läraren, men efter många om och men fick han endå godkänt.

Skämms lite för det idag, men jag tjänade 1000 kronor snabbt

Permalänk
Medlem
Skrivet av AllMessedUp:

Innan du tar visdom av alla kommentarer ovan, så bör du använda lösningar som ni lärt er under kursen.
En kompis bad mig göra hans inlämningsuppgift för kanske 10 år sedan. och jag gjorde den givetvis då med dom kunskaperna jag hade. I detta fallet var det lösningar som dom inte lärt sig ännu.

Min kompis blev utfrågad av läraren, men efter många om och men fick han endå godkänt.

Skämms lite för det idag, men jag tjänade 1000 kronor snabbt

yepp, vi har typ bara lärt oss dom 3 jag använt, de som är så basic det bara går nästa inlämning ska använda funktioner och lite mer komplicerade grejer. men det lär såklart vara ok att använda mer komplicerade grejer, alla har ju olika grundkunskaper kan jag tänka mig

Permalänk
Medlem
Skrivet av swesen:

Du har inte förklarat tillräckligt mycket för att vi ska veta vad "efter 02" betyder eller vad du vill göra då, så drog till med ett exempel bara. Input() är bara en placeholder, tanken var kanske någon typ av "press enter to continue".

Förlåt inser att jag borde förklara koden mer.
Min pseudo kod var tänkt att visa ett sätt att lösa övergripande spelflödet så att det ska vara enkelt att följa vad som kommer exekvera.

while gameRunning

Är en loop som omsluter hela spel delen. "gameRunning" är bara en bool, sätt den till "false" för att avsluta spelet.

En guard clause är ett sätt att förhindra nestade if satser.
https://pbs.twimg.com/media/EsBDLp8XcAIWugP.png:large
Idéen är att man skapar if satser som förhindrar att koden under körs när den if satsen stämmer. Att förhindra att en loop fortsätter osv.
Om man är i en funktion så funkar "return" som direkt avslutar funktionen, eller skapa någon typ av error. Du får nog lära dig senare hur man hanterar error.
I loopar kan man avsluta loopar med "break" då avslutas loopen. I koden ovan så är det flera break med men de avslutar

switch (i){}

som också är en typ av loop. "continue" skippar resten av koden i loopen och startar ifrån början av loopen igen.

En switch kan du tänka är som ett smidigare sätt än att skriva

if(i == play){} else if(i == deposit){} else if(i == withdraw){} // Eller while (i == play){} while (i == deposit){} while (i == withdraw){}

Du jämför variabeln i parantesen med varje case.

det där känns som överkurs, använder ingen return och inga funktioner så orkar inte ändra det. samt behöver ingen felhantering. jag skulle bara behöva en så enkel while loop som möjligt. jag har kommit fram till att detta fungerar:

time_t now;
struct tm nowLocal;

now=time(NULL); //get os time
nowLocal=*localtime(&now);
while (nowLocal.tm_hour>6){
cout<<"Game is closed until 06:00. your balance of"<<balance<< " SEK has been withdrawn. your total profits are "
<<total_profits<< "\n";
sleep(10);
}

hur ser jag till att min cout endast skrivs ut en gång? jag tänker att jag vill ha cout ovan utskrivet en gång, och sedan kanske "vi har stängt till kl 06" text en gång i minuten fram till kl 06 liksom. kan ju ha en exakt lika while loop inuti while loopen men det kanske inte är en skitsnygg lösning.

Permalänk
Medlem
Skrivet av HickeHiskelig:

det där känns som överkurs, använder ingen return och inga funktioner så orkar inte ändra det. samt behöver ingen felhantering. jag skulle bara behöva en så enkel while loop som möjligt på att typ pausa spelet 02-06, låta spelaren ta ut sina pengar och skriva ut en text att det är stängt, och sedan när tiden är över bara återgå till min första while loop för i=STANDBY. alternativt ett if steg i min i=PLAY där man kastas till en while i=CLOSED om klockan är 02-06

Det finns jättemånga sätt att lösa problemet på om vi ska begränsa oss till vad ni lärt er så behöver vi veta vad det är. Vi har heller inte sett din egen kod. Använd [ code][/code] taggar när du lägger upp kod

Du kan ju alltid nesta while loopar, men att nesta saker gör det alltid otydligare än svaren ovan så det brukar undvikas sen när ni lärt er mer.

while gameRunning { while (time >= 2 && time <= 6){ // nånting när det är stängt // inte speciellt bra design då time måste ändras inuti } while (i == play){ // spela } while (i == deposit){ // sätt in pengar } // osv... }

Problemet är att om t.ex. time uppdateras i slutet av "while gameRunning" så kommer du fastna i "while (time >= 2 && time <= 6)"

while gameRunning { if (time >= 2 && time <= 6){ // nånting när det är stängt } else if (i == play){ // spela } else if (i == deposit){ // sätt in pengar } // osv... }

Är då en bättre lösning.

Det man måste tänka på med while loopar är att de måste lösa sig själva, om de inte väntar på en interrupt eller något ifrån en annan tråd.

Permalänk
Medlem
Skrivet av swesen:

Det finns jättemånga sätt att lösa problemet på om vi ska begränsa oss till vad ni lärt er så behöver vi veta vad det är. Vi har heller inte sett din egen kod. Använd [ code][/code] taggar när du lägger upp kod

Du kan ju alltid nesta while loopar, men att nesta saker gör det alltid otydligare än svaren ovan så det brukar undvikas sen när ni lärt er mer.

while gameRunning { while (time >= 2 && time <= 6){ // nånting när det är stängt // inte speciellt bra design då time måste ändras inuti } while (i == play){ // spela } while (i == deposit){ // sätt in pengar } // osv... }

Problemet är att om t.ex. time uppdateras i slutet av "while gameRunning" så kommer du fastna i "while (time >= 2 && time <= 6)"

while gameRunning { if (time >= 2 && time <= 6){ // nånting när det är stängt } else if (i == play){ // spela } else if (i == deposit){ // sätt in pengar } // osv... }

Är då en bättre lösning.

Det man måste tänka på med while loopar är att de måste lösa sig själva, om de inte väntar på en interrupt eller något ifrån en annan tråd.

jag vill inte skriva ut min egen kod för att råka ut för en "plagiatgranskning"

men jag löste problemet ovan med att bryta mellan 24-08 i en ytterliggare while loop.

ingen av while looparna är nestlade

while (i=standby){
gör det här;
}

while (i=PLAY){
gör det här;
}

while (i=WITHDRAW){
gör det här;
}

while (i=POOR){
gör det här;
}
while (time nånting nånting){
gör det här;
}
while (i=DEPOSIT){
gör det här;
}

alla while loopar assignar i med något och skickar på så vis vidare spelaren. tex deposit skickar spelaren direkt till i=PLAY igen, efter att man lagt in mer pengar. logiken är skit, jag vet, men läraren godkänner det

nu har jag ett annat problem. min i=deposit loop vägrar skicka spelaren till i=play igen. jag avslutar min DEPOSIT loop med att bara assigna i=PLAY men det vill visst inte fungera. ska jag omsluta hela programmet i en annan while loop med någon skitvariabel bara så att det fortsätter i all oändlighet?

jag vill att programmet aldrig ska stanna, tänk dig att man ska kunna starta det på en sån där casinomaskin så ska det bara sköta sig själv sen

Permalänk
Medlem
Skrivet av HickeHiskelig:

jag vill inte skriva ut min egen kod för att råka ut för en "plagiatgranskning"

men jag löste problemet ovan med att bryta mellan 24-08 i en ytterliggare while loop.

ingen av while looparna är nestlade

while (i=standby){
gör det här;
}

while (i=PLAY){
gör det här;
}

while (i=WITHDRAW){
gör det här;
}

while (i=POOR){
gör det här;
}
while (time nånting nånting){
gör det här;
}
while (i=DEPOSIT){
gör det här;
}

alla while loopar assignar i med något och skickar på så vis vidare spelaren. tex deposit skickar spelaren direkt till i=PLAY igen, efter att man lagt in mer pengar. logiken är skit, jag vet, men läraren godkänner det

nu har jag ett annat problem. min i=deposit loop vägrar skicka spelaren till i=play igen. jag avslutar min DEPOSIT loop med att bara assigna i=PLAY men det vill visst inte fungera. ska jag omsluta hela programmet i en annan while loop med någon skitvariabel bara så att det fortsätter i all oändlighet?

jag vill att programmet aldrig ska stanna, tänk dig att man ska kunna starta det på en sån där casinomaskin så ska det bara sköta sig själv sen

Det måste ju vara den absolut sämsta kursen någonsin om de skulle köra plagiatkontroll på kod Programmering är väl typ 70% hur man "googlar" efter en lösning på sitt problem, där det kluriga då är hur man ska formulera sökningen och vad man ska söka efter - och sen såklart hur det ska användas

Ang. ditt problem så är det precis som du säger, du behöver en omslutande "game-loop" som körs så länge spelet är igång. Varje varv i loopen kommer du sedan kontrollera vilket "State" du är i, d.v.s. vad din variabel i är tilldelad.

Utifrån i kommer du sedan utföra olika saker. Jag skulle dock avråda dig från att använda while-loopar för att hålla dig kvar inom ett visst "State". Använd istället if-satser eller en switch/case-stats som strukturerar din kod. I slutet av din game-loop kan du sedan hantera tiden, d.v.s. som en klocka. I början av denna loop kollar du sedan tiden och tilldelar ett nytt state vid behov.

I "riktiga" spel är det precis såhär det fungerar. Du har en game-loop som körs så länge spelet är igång. Så fort du hamnar utanför denna loop så avslutar du spelet helt enkelt. Antal varv i din game-loop är alltså din FPS Om du helt plötsligt skulle börja ligga i andra loopar, t.ex. while(i== standby) så kommer din game-loop att vara låst tills dess att du kommer ut ur standby.

while(gameRunning){ if(time < 8){ i = LOCKED; } if(i == LOCKED) { time = ... // dra av tid för det här varvet. continue; // Skippar resten av loopen och börjar om på ett nytt varv } // All kod som kommer efter denna if-sats är alltså okej eftersom du aldrig når detta om du är inom tidspannet 24-08 (24 = 0) ... // all annan kod time = ... // dra av tid för det här varvet. }

Så längt du inte ändrar ditt state (variabeln i) kommer du köra samma kod om och om igen i din loop.

Permalänk
Medlem
Skrivet av HickeHiskelig:

jag vill inte skriva ut min egen kod för att råka ut för en "plagiatgranskning"

men jag löste problemet ovan med att bryta mellan 24-08 i en ytterliggare while loop.

ingen av while looparna är nestlade

while (i=standby){
gör det här;
}

while (i=PLAY){
gör det här;
}

while (i=WITHDRAW){
gör det här;
}

while (i=POOR){
gör det här;
}
while (time nånting nånting){
gör det här;
}
while (i=DEPOSIT){
gör det här;
}

alla while loopar assignar i med något och skickar på så vis vidare spelaren. tex deposit skickar spelaren direkt till i=PLAY igen, efter att man lagt in mer pengar. logiken är skit, jag vet, men läraren godkänner det

nu har jag ett annat problem. min i=deposit loop vägrar skicka spelaren till i=play igen. jag avslutar min DEPOSIT loop med att bara assigna i=PLAY men det vill visst inte fungera. ska jag omsluta hela programmet i en annan while loop med någon skitvariabel bara så att det fortsätter i all oändlighet?

jag vill att programmet aldrig ska stanna, tänk dig att man ska kunna starta det på en sån där casinomaskin så ska det bara sköta sig själv sen

Utan en omgivande loop (eller jump to vilket man aldrig ska använda) så kan du inte gå till kod som är tidigare. Exekvering av program sker sekventiellt, vilket betyder att det körs uppifrån och ner, loopar eller rekursiva funktioner är hur man åstadkommer repetering av kod.

Sen en annan sak jag sett är att du skriver

while(i=PLAY)

men jag hoppas ni fått lära er att

foo = bar; // assign value of "bar" to "foo" foo == bar; // compare if "foo" is equal to "bar" (results in true or false)

Också dåligt att använda loopar ifall de inte loopar t.ex. om

while (i == deposit){ // deposit code i = play; }

använd då en if sats istället.