Programmeringsuppgift c++ nybörjare

Permalänk
Medlem

Programmeringsuppgift c++ nybörjare

Tja!

Ska programmera ett spel där användaren spelar
mot datorn i att lista ut ett tal som datorn tänker på. När spelet börjar ska användaren
gissa fram ett tal mellan 1 – 50 som datorn har slumpat fram. 1 gissning ger 10 poäng 2 gissningar ger 5 poäng 3-10 gissningar ger 1 poäng. Du kan gissa hur många ggr som helt men får bara poäng upp till 10 gissningar. Får du poäng ska man kunna spela kvitt eller dubbelt.
Kvitt eller dubbelt använder 5 av dina gamla gissningar, om du gissat mindre än 5 ggr slumpas resterande tal så att det blir 5 st.

Har sett liknande spel på forumet men inte riktigt då spelet har ett poängsystem och måste använda sig av array och minst 3 funktioner.

Jag har fixat så datorn slumpar fram ett slumptal och användaren får feedback på om det är lågt,högt eller rätt. men fastnar på poängsystemet.

Help please!

#include "stdafx.h" #include <iostream> #include <ctime> #include <Windows.h> using namespace std; int main() { setlocale(LC_ALL, "swedish"); int tries = 0; int guess; int number; int points = 0; srand(time(0)); number = rand() % 50 + 1; cout << number; cout << "Välkommen till gissa talet! Var god gissa på ett tal mellan 1 och 50." << endl; cout << endl << endl; cin >> guess; tries++; while (guess != number) { if (guess > number) { cout << "Tyvärr! Ditt nummer är för högt!"; cout << "Försök igen!"; cout << endl << endl; cin >> guess; cout << endl << endl; tries++; } if (guess < number) { cout << "Tyvärr! Ditt nummer är för lågt! "; cout << "Försök igen!"; cout << endl << endl; cin >> guess; cout << endl << endl; tries++; } else if (guess == number) { cout << "Grattis! Du har gissat rätt! på " << tries << " gånger"; cout << endl << endl; cout << "Det korrekta nummret var " << number; } } while (tries == 1) { points = +10; cout << "Du har fått " << points << " poäng! " << endl; cout << endl; if (tries == 2) { points = +5; cout << "Du har fått " << points << " poäng! " << endl; cout << endl; } if (tries > 3) { points = +1; cout << "Du har fått " << points << " poäng! " << endl; cout << endl; } else if (tries < 11) { points = +1; cout << "du har fått " << points << " poäng! " << endl; cout << endl; } } system("pause"); return 0; }

Permalänk
Hedersmedlem

Sneglat lite snabbt. Du har ett lustigt villkor för din andra while-loop. Jag undrar också om det verkligen behövs en loop där?

Permalänk
Medlem
Skrivet av Shimonu:

Sneglat lite snabbt. Du har ett lustigt villkor för din andra while-loop. Jag undrar också om det verkligen behövs en loop där?

Tack! ändrat de nu och det funkade bra!
Har dock inte en aning om hur man gör för att spara alla gissade tal i en array.. Lite vilsen i den delen om någon skulle kunna hjälpa till?

Permalänk
Medlem
Skrivet av fosho12:

Tack! ändrat de nu och det funkade bra!
Har dock inte en aning om hur man gör för att spara alla gissade tal i en array.. Lite vilsen i den delen om någon skulle kunna hjälpa till?

Jag kan inte se något om att du behöver spara alla gissade tal. Uppgiften säger att du ska spara 5 gamla gissningar för kvitt eller dubbelt, men eftersom det inte står något om vilka gissningar så antar jag att man kan ta sig en del friheter där. Att spara de 5 första gissningarna är ju då enklast, bara ha en array med 5 platser och så en variabel som håller koll på hur många gissningar du sparat. När arrayen är full är det bara att strunta i efterföljande gissningar, och blir den inte full är det bara att fylla på resten med slumptal. Att spara de 5 senaste gissningarna är inte så mycket svårare, då är det bara att gå tillbaka till början av arrayen när man når slutet.

Om du ändå vill spara alla gissningar så är det lämpligast att använda en std::vector eftersom du inte vet hur många gissningar du behöver lagra, men jag antar att ni inte kommit så långt än. Egentligen bör man använda en std::array istället för en C-array också (d.v.s. std::array<int, 5> istället för int[5]), men återigen troligtvis överkurs.

Ett annat tips är förresten att du kan korta ner din kod avsevärt genom att flytta ut gemensam kod utanför if-satserna. Din första if-sats skulle t.ex. kunna skrivas om ungefär så här:

if (guess == number) { cout << "Grattis! Du har gissat rätt! på " << tries << " gånger"; cout << endl << endl; cout << "Det korrekta nummret var " << number; } else { if (guess > number) { cout << "Tyvärr! Ditt nummer är för högt!"; } else { cout << "Tyvärr! Ditt nummer är för lågt! "; } cout << "Försök igen!"; cout << endl << endl; cin >> guess; cout << endl << endl; tries++; }

Att inte upprepa kod flera gånger ger inte bara mindre kod, det hjälper även till att undvika misstag. I din andra if-sats så har du t.ex. skrivit Du med stort D, förutom sista gånger när det är ett litet d. Just det misstaget kanske inte är så kritiskt, men du fattar säkert poängen.

Permalänk
Medlem
Skrivet av perost:

Jag kan inte se något om att du behöver spara alla gissade tal. Uppgiften säger att du ska spara 5 gamla gissningar för kvitt eller dubbelt, men eftersom det inte står något om vilka gissningar så antar jag att man kan ta sig en del friheter där. Att spara de 5 första gissningarna är ju då enklast, bara ha en array med 5 platser och så en variabel som håller koll på hur många gissningar du sparat. När arrayen är full är det bara att strunta i efterföljande gissningar, och blir den inte full är det bara att fylla på resten med slumptal. Att spara de 5 senaste gissningarna är inte så mycket svårare, då är det bara att gå tillbaka till början av arrayen när man når slutet.

Om du ändå vill spara alla gissningar så är det lämpligast att använda en std::vector eftersom du inte vet hur många gissningar du behöver lagra, men jag antar att ni inte kommit så långt än. Egentligen bör man använda en std::array istället för en C-array också (d.v.s. std::array<int, 5> istället för int[5]), men återigen troligtvis överkurs.

Ett annat tips är förresten att du kan korta ner din kod avsevärt genom att flytta ut gemensam kod utanför if-satserna. Din första if-sats skulle t.ex. kunna skrivas om ungefär så här:

if (guess == number) { cout << "Grattis! Du har gissat rätt! på " << tries << " gånger"; cout << endl << endl; cout << "Det korrekta nummret var " << number; } else { if (guess > number) { cout << "Tyvärr! Ditt nummer är för högt!"; } else { cout << "Tyvärr! Ditt nummer är för lågt! "; } cout << "Försök igen!"; cout << endl << endl; cin >> guess; cout << endl << endl; tries++; }

Att inte upprepa kod flera gånger ger inte bara mindre kod, det hjälper även till att undvika misstag. I din andra if-sats så har du t.ex. skrivit Du med stort D, förutom sista gånger när det är ett litet d. Just det misstaget kanske inte är så kritiskt, men du fattar säkert poängen.

Tack! All kritik är välkommen! Är som sagt ganska ny inom detta så all hjälp är välkommen.
Sorry hade inte med detta:
Alla tal som användaren har gissat fram måste lagras i en array.
De 5 Talen som används i spelet ”Kvitt eller dubbelt” ska lagras i en separat array som
sedan visas för användaren.
Funkar det att ha en array med 10 platser, då du bara får poäng upp till 10 gissningar?

Permalänk
Inaktiv
Skrivet av fosho12:

Funkar det att ha en array med 10 platser, då du bara får poäng upp till 10 gissningar?

En Array har en förbestämd storlek. 10 Platser kan som sagt hålla 10 värden.

int Talen[10];
Talen[0] = 1;
Talen[1] = 2;
Talen[2] = 3;
Talen[3] = 4;
Talen[4] = 5;
Talen[5] = 6;
Talen[6] = 7;
Talen[7] = 8;
Talen[8] = 9;
Talen[9] = 10;

Vill du ha en oändlig storlek så rekommenderar jag att du använder en länkad lista.

Skrivet av fosho12:

Alla tal som användaren har gissat fram måste lagras i en array.

cin >> guess;
Lagrar användarens input i variabel guess.

Talen[0] = guess;
Sätter första värdet i array Talen till det som användaren matade in.

Talen[tries] = guess;
Du kan välja plats utifrån antalet försök. Efter varje gissning så ökar du värdet tries.

Försök 1 blir 0.
Försök 2 blir 1.
Försök 3 blir 2.
Försök 4 blir index 3 i array Talen.

Talen[10] = 11; // Error Index out of bounds.
Det blir fel när platsen tar slut. Jag rekommenderar att du gör så att spelaren förlorar efter 10 försök.