Lottouppgift
Hej!
Har fått en uppgift att göra ett simpelt Lottoprogram. Kraven är följande från läraren:
Lottouppgift
Programmet ska simulera ett lottospel. Tanken är att för denna uppgift bör du kunna hantera:
I/O, variabler, uttryck och satser, arrayer, funktioner och kommentarer
- Ta reda på hur ett lottospel fungerar.
- Skriv ett program för ett lottospel
- Du som skriver programmet bestämmer hur många gånger och på vilket sätt spelaren får gissa. Kommentera detta i ditt program. När spelaren gissat färdigt ska programmet skriva ut spelarens gissningar, hur många rätt denne hade och hur många rätt som kom från tilläggstalen om du använder sådana.
- Av de slumpade talen i lottospelet får inte något tal vara detsamma och spelaren får inte heller gissa på samma tal två gånger. Programmet måste också hantera om spelaren gör en felaktig inmatning.
- Dela upp ditt program i flera funktioner.
- Programmet ska vara snyggt indenterat och kommenterat
Detta är det jag lyckats åstadkomma hittills:
#include <iostream>
#include <Windows.h>
#include <string>
#include <ctime>
using namespace std;
void Spela();
void Nej();
void InmatningAvVal();
void LottoTalSlumpning();
void UtmatningAvGissningar();
int SpelarVal[7], LottoVal[7], RättVal = 0;
int main() {
SetConsoleCP(1252);
SetConsoleOutputCP(1252); //Ser till att programmet förstår och kan skriva ut svenska tecken som Å, Ä och Ö.
cout << "Välkommen till X Lotto! Detta är ett traditionellt lottospel där du -> Fortsättning kommer"
<< endl;
int val;
cout << "Vill du vara med och spela?"
<< "\n1. Ja \n2. Nej"
<< endl;
cin >> val;
switch (val) {
case 1:
Spela();
break;
case 2:
Nej();
}
}
void Spela() { //En funktion som kommer att initieras om spelaren skriver 1 vid förfrågan huruvida den vill fortsätta att spela.
system("cls"); //Rensar kommandofönstret på alla inputs/outputs.
cout << "X Lotto"
<< "\n------------------------------------------------------------------------------------------"
<< endl;
cout << "Hur spelar man? Det du gör är att du försöker gissa dig fram till 7 olika tal som jag väljer enligt slumpen. Dessa tal kommer ligga mellan 1 och 35!"
<< "\n Så, om du känner dig redo så kan du börja välja tal. Det är viktigt att tänka på att jag enbart förstår mig på inmatningar som kommer i former av nummer. Inmatningar som är i formen av bokstäver eller meningar kommer inte att användas en gissning!"
<< "\n------------------------------------------------------------------------------------------"
<< endl;
cout << "Välj 7 tal som ligger mellan 1 till 35!"
<< endl;
InmatningAvVal(); //Initierar funktionen "InmatningAvVal"
}
void Nej() { //Funktion som avslutar programmet om personen ej väljer att spela.
system("cls");
cout << "Jahopp, då får jag tacka för mig!"
<< endl;
system("Pause");
}
void InmatningAvVal() {
for (int x = 0; x < 7; x++) {
int SpelarInput;
bool Rätt_Nummer = false;
while (Rätt_Nummer == false) {
cout << "Välj ditt "
<< x + 1
<< " nummer: ";
cin >> SpelarInput;
Rätt_Nummer = true;
if (SpelarInput >= 'a' || SpelarInput <= 'z') {
cout << "Felaktigt inmatning! Det måste vara ett nummer!"
<< endl;
Rätt_Nummer = false;
}
else if (SpelarInput >= 'a' || SpelarInput <= 'z') {
cout << "Ditt val ligger inte inom intervallen! Gör ett nytt val."
<< endl;
}
for (int y = 0; y < 7; y++) {
if (SpelarInput < 1 || SpelarInput > 35) {
cout << "Du har redan använt detta nummer! Gör ett nytt val."
<< endl;
Rätt_Nummer = false;
}
}
}
SpelarVal[x] = SpelarInput;
}
LottoTalSlumpning();
}
void LottoTalSlumpning() {
srand(time(NULL));
for (int x = 0; x < 7; x++) {
int LottoNummer = (rand() % 35) + 1; //Slumpar fram ett nummer mellan 1 -> 35
bool Rätt_Nummer = false; //Används för att kolla ifall ett nummer som redan slumpats fram är detsamma som det nya!
while (Rätt_Nummer == false) {
Rätt_Nummer = true;
for (int y = 0; y < 7; y++) {
if (LottoVal[y] == LottoNummer) {
Rätt_Nummer = false;
}
}
if (Rätt_Nummer == false) {
LottoNummer = (rand() % 35) + 1; //Slumpar fram ett nytt tal om ett av talen blivit likadana.
}
}
LottoVal[x] = LottoNummer;
}
}
void UtmatningAvGissningar() {
}
Möter på det problemet att ifall jag skriver in "a" eller något liknande går programmet bananas. Några lösningar? Skulle även uppskatta feedback på koden överlag samt hur jag ska fortsätta för att lyckas med uppgiften!
Att det "går bananas" säger inte så mycket. Förklara gärna vilket felmeddelande du får (om något).
Men, troligen beror problemet på att en bokstav inte är en siffra. Variabeln val
är av typen heltal så enbart siffror funkar då.
Lyckades hitta problemet själv. Behövde enbart se till så den clearar inputen samt ignorerar felmeddelandet. Samt att den blir tillbaka skickad till början av inputen!
Du efterfrågade även återkoppling på koden. Lägg helst in koden här så att indenteringen syns (speciellt eftersom en del av uppgiften gäller indentering). Koden behöver testas. Det finns bl a stor risk för oändliga slingor. Det finns även en del logiska fel. Har lagt in några synpunkter som kommentarer i koden, se "//FIXME:"
Visa spoiler
#include <iostream>
#include <Windows.h> //FIXME: fungerar enbart på Windows-maskiner?!
#include <string> //FIXME: används inte
#include <ctime>
using namespace std;
void Spela();
void Nej();
void InmatningAvVal();
void LottoTalSlumpning();
void UtmatningAvGissningar();
int SpelarVal[7], LottoVal[7], Rattval = 0; //FIXME: använd inte globala variabler, använd inte svenska tecken i identifierare
//FIXME: indentera koden korrekt
int main() {
SetConsoleCP(1252); //FIXME: fungerar enbart på Windows-maskiner?!
SetConsoleOutputCP(1252); //Ser till att programmet förstår och kan skriva ut svenska tecken som Å, Ä och Ö.
cout << "Välkommen till X Lotto! Detta är ett traditionellt lottospel där du -> Fortsättning kommer"
<< endl;
int val;
cout << "Vill du vara med och spela?"
<< "\n1. Ja \n2. Nej"
<< endl;
cin >> val;
switch (val) {
case 1:
Spela();
break;
case 2: //FIXME: använd default istället
Nej();
}
}
void Spela() { //En funktion som kommer att initieras om spelaren skriver 1 vid förfrågan huruvida den vill fortsätta att spela.
system("cls"); //FIXME: använd inte systemanrop
cout << "X Lotto"
<< "\n------------------------------------------------------------------------------------------"
<< endl;
cout << "Hur spelar man? Det du gör är att du försöker gissa dig fram till 7 olika tal som jag väljer enligt slumpen. Dessa tal kommer ligga mellan 1 och 35!"
<< "\n Så, om du känner dig redo så kan du börja välja tal. Det är viktigt att tänka på att jag enbart förstår mig på inmatningar som kommer i former av nummer. Inmatningar som är i formen av bokstäver eller meningar kommer inte att användas en gissning!"
<< "\n------------------------------------------------------------------------------------------"
<< endl;
cout << "Välj 7 tal som ligger mellan 1 till 35!"
<< endl;
InmatningAvVal(); //Initierar funktionen "InmatningAvVal"
//FIXME: ta bort onödiga tomma rader
}
void Nej() { //Funktion som avslutar programmet om personen ej väljer att spela.
system("cls");
cout << "Jahopp, då får jag tacka för mig!"
<< endl;
system("Pause");
}
void InmatningAvVal() {
for (int x = 0; x < 7; x++) {
int SpelarInput;
bool Ratt_Nummer = false; //FIXME: använd inte svenska tecken i identifierare, skriv helst på engelska
while (Ratt_Nummer == false) { //FIXME: while (!Ratt_Nummer) {
cout << "Välj ditt "
<< x + 1
<< " nummer: ";
cin >> SpelarInput;
Ratt_Nummer = true;
if (SpelarInput >= 'a' || SpelarInput <= 'z') { //FIXME: kolla om SpelarInput är heltal
cout << "Felaktigt inmatning! Det måste vara ett nummer!"
<< endl;
Ratt_Nummer = false;
}
else if (SpelarInput >= 'a' || SpelarInput <= 'z') { //FIXME: kolla om SpelarInput ligger i rätt värdeområde
cout << "Ditt val ligger inte inom intervallen! Gör ett nytt val."
<< endl;
//FIXME: Ratt_Nummer = false;
}
for (int y = 0; y < 7; y++) {
if (SpelarInput < 1 || SpelarInput > 35) { //FIXME: kolla om SpelarInput redan sparats _någonstans_ i SpelarVal
cout << "Du har redan använt detta nummer! Gör ett nytt val."
<< endl;
Ratt_Nummer = false;
}
}
}
SpelarVal[x] = SpelarInput;
}
LottoTalSlumpning();
}
void LottoTalSlumpning() {
srand(time(NULL));
for (int x = 0; x < 7; x++) {
int LottoNummer = (rand() % 35) + 1; //Slumpar fram ett nummer mellan 1 -> 35
bool Ratt_Nummer = false; //Används för att kolla ifall ett nummer som redan slumpats fram är detsamma som det nya!
while (Ratt_Nummer == false) { //FIXME: while (!Ratt_Nummer) {
Ratt_Nummer = true;
for (int y = 0; y < 7; y++) {
if (LottoVal[y] == LottoNummer) {
Ratt_Nummer = false;
}
}
if (Ratt_Nummer == false) { //FIXME: if (!Ratt_Nummer) {
LottoNummer = (rand() % 35) + 1; //Slumpar fram ett nytt tal om ett av talen blivit likadana.
}
}
LottoVal[x] = LottoNummer;
}
}
void UtmatningAvGissningar() {
}