|
| kalaha Fra : jedi_bjerre | Vist : 1178 gange 150 point Dato : 08-04-08 09:22 |
|
Hey er igang med et simpelt kalaha spil og er støt ind i et problem, jeg kan ikke umiddelbart finde fejlen. Når jeg kører spillet fordeler det ikke kuglerne korrekt, den tømmer rummet og gør præcis som den skal indtil linje 50.
OBS! DETTE SPØRGSMÅL ER 150 POINT VÆRD!
Her er programmeringen, komplet med kommentarer
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
#include<vector>
using namespace std;
const char oe = -101; //indikerer at oe = ø
const char OE = -99; //indikerer at OE = Ø
const char ae = -111; //indikerer at ae = æ
const char aa = -122; //indikerer at aa = å
void visPlade (int rum[], int bager[]);
int sp1 (int fortsat, int rest, int starthul, int sp, int rum[], int bager[], int a);
int sp2 (int fortsat, int rest, int starthul, int sp, int rum[], int bager[], int a);
int valghul (int starthul);
int main()
{
int k,starthul,rest,nr,sp,sh,fortsat,a,resultat;
int rum[]={6,6,6,6,6,6,6,6,6,6,6,6}; //array for spiller 1's side af pladen
int bager[]={0,0}; //array for bægrene til spiller 1 & 2
string s1,s2,vinner;
cout <<"* * * * * * * *\n* * * * * * * * * * *\n* * * * * * * * * * *\n** * * * * * * * * *\n* * * * * * ****** * *\n** ******* * ******* * * *******\n* * * * * * * * * * *"<<endl;
cout <<"* * * * * * * * * * *\n* * * * ****** * * * * * *"<<endl;
cout <<"Det oldgamle egyptiske spil, programmeret af Thomas Nymark Bjerre"<<endl;
//ovenstående to linjer er introen, hvor der står "kalaha"
system("PAUSE");
system("cls");
cout <<"Hvem vil spille?\nSpiller 1:"<<endl;
getline (cin, s1);
cout <<"Spiller 2:"<<endl;
getline (cin, s2);
cout <<s1<<" "<<s2<<endl; //tjekker om indtastningen er korrekt
do //holder spillet igang
{
for (int sp=0;sp<=1;sp++) //for-løkke som skifter mellem de to spillere
{
cout <<"V"<<ae<<"lg det starthul som du vil starte med, nummereret efter hvor t"<<ae<<"t de er p"<<aa<<" hjem"<<endl;
if (sp==0)
cout <<"Det er "<<s1<<"'s tur"<<endl; //angiver hvilken spiller's tur det er
else
cout <<"Det er "<<s2<<"'s tur"<<endl; //angiver hvilken spiller's tur det er
visPlade(rum,bager); //viser pladen
starthul=valghul(starthul); //lader spilleren vælge starthul
starthul--; //trækker én fra starthullet, så det passer i array'en
rest=rum[starthul]; //lægger "boldene" over i "hånden"
rum[starthul]=0; //tømmer rummet
if (sp=0) //rækkefølge for turen for spiller 1
{
do
{
a=sp1(fortsat,rest,starthul,sp,rum,bager,a);
// når a er 12 får spilleren en ekstra tur, er a 13 afsluttes turen,
// ellers fortsætter turen på modstanderes side af spillepladen
while (a==12)
{
visPlade(rum,bager); //viser pladen
starthul=valghul(starthul);
rest=rum[starthul-1]; //lægger "boldene" over i "hånden"
rum[starthul-1]=0; //tømmer rummet
starthul--; //trækker én fra starthullet, så det passer i array'en
a=sp1(fortsat,rest,starthul,sp,rum,bager,a);
}
if (a!=13)
a=sp2(fortsat,rest,starthul,sp,rum,bager,a);
}
while (a!=13);
}
else
{
a=sp2(fortsat,rest,starthul,sp,rum,bager,a);
while (a==12)
{
visPlade(rum,bager); //viser pladen
starthul=valghul(starthul);
rest=rum[starthul-1]; //lægger "boldene" over i "hånden"
rum[starthul-1]=0; //tømmer rummet
starthul--; //trækker én fra starthullet, så det passer i array'en
a=sp2(fortsat,rest,starthul,sp,rum,bager,a);
}
if (a!=13)
a=sp1(fortsat,rest,starthul,sp,rum,bager,a);
}
}
}
while (rum[0,1,2,3,4,5,6,7,8,9,10,11]!=0);
if (bager[0]>bager[1])
vinner=s1;
else
vinner=s2;
if (bager[sp]>36)
cout <<"Tilykke til" <<vinner<<endl;
system("PAUSE");
return 0;
}
//----------------------------------------------------//
int valghul (int starthul)
{
do //sikkerhedsløkke, som sørger for at der kun kan indtastes værdierne: 1,2,3,4,5,6
{
cout <<"Indtast starthul..."<<endl;
cin >> starthul; //lader spilleren angive det ønskede starthul
if (starthul>6)
cout <<"Der er kun 6 huller, v"<<ae<<"lg et af dem"<<endl;
}
while (starthul>6);
return starthul;
}
//----------------------------------------------------//
void visPlade (int rum[], int bager[])
{
cout <<"(_"<<bager[0]<<"_)";
for (int i=0;i<=5;i++)
cout <<setw(3)<<rum[i];
cout <<"\n\n";
for (int i=11;i>=6;i--)
cout <<setw(3)<<rum[i];
cout <<"(_"<<bager[1]<<"_)\n";
}
//----------------------------------------------------//
int sp1 (int fortsat, int rest, int starthul, int sp, int rum[], int bager[], int a)
{
if (sp=1)
{
starthul=5;
rest=a;
}
for (int i=rest;i>0;i--)
{
starthul--; //næste hul
rum[starthul]++; //bold i næste hul
if (starthul=-1 && sp==0)
{
bager[0]++;//ligger en kugle i spiller 1's bager
i--;
if (i=0) //Hvis "hånden" er tom, returneres værdien 12 som giver spilleren en tur mere
return 12;
}
a=i;
}
if (rum[starthul]=1)
return 13; //Værdien 13 resultere i afslutning af turen
else
return a; //værdien a returneres og sættes til "håndens" værdi på spiller 2's side af pladen
}
//----------------------------------------------------//
int sp2 (int fortsat, int rest, int starthul, int sp, int rum[], int bager[], int a)
{
if (sp=0)
{
starthul=6;
rest=a;
}
else
starthul=starthul+6;
for (int i=rest;i>0;i--)
{
starthul++; //næste hul
rum[starthul]++; //bold i næste hul
if (starthul=-1 && sp==1)
{
bager[1]++;
rest--;
if (i=0) //Hvis "hånden" er tom, returneres værdien 12 som giver spilleren en tur mere
return 12;
}
a=i;
}
if (rum[a]=1)
return 13; //Værdien 13 resultere i afslutning af turen
else
return a; //værdien a returneres og sættes til rest på spiller 1's side af pladen
}
| |
|
Jeg kan godt kikke på det, men kan du ikke lige starte med at fortælle hvad du havde tænkt dig at denne linie skal:
while (rum[0,1,2,3,4,5,6,7,8,9,10,11]!=0);
Jeg tvivler på at den gør det du forventer.
| |
|
Du har også en del steder hvor du bruge = i stedet for ==
f.eks:
if (sp=0)
| |
|
Når det er fixet kommer den til at køre i denne loop for evigt:
Kode do
{
a=sp1(fortsat,rest,starthul,sp,rum,bager,a);
// når a er 12 får spilleren en ekstra tur, er a 13 afsluttes turen,
// ellers fortsætter turen på modstanderes side af spillepladen
while (a==12)
{
visPlade(rum,bager); //viser pladen
starthul=valghul(starthul);
rest=rum[starthul-1]; //lægger "boldene" over i "hånden"
rum[starthul-1]=0; //tømmer rummet
starthul--; //trækker én fra starthullet, så det passer i array'en
a=sp1(fortsat,rest,starthul,sp,rum,bager,a);
}
if (a!=13)
{
a=sp2(fortsat,rest,starthul,sp,rum,bager,a);
}
}
while (a!=13); |
| |
|
nr. 1:
Den linje skulle gerne holde spillet igang indtil der ikke er flere kugler i hullerne, ved godt den ikke virker helt efter hensigten, men udskød denne del indtil jeg kom derned
nr. 2:
hov
nr.3:
kunne du uddybe det lidt, er godt klar over at den kører i uendelig loops, men kan ikke spotte hvor det er jeg laver en fejl.
Super mange tak fordi du gider btw
| |
|
Du har to funktioner der hedder hhv sp1 og sp2, er det meningen at det skal være funktioner for spiller 1 og spiller 2?
Prøv at forklare hvad de to funktioner skal gøre og hvad returværdien skal betyder, 12 og 13 synes at have specielle betydninger?
Jeg kikker på det lidt senere på aftenen.
| |
|
sp1, er en funktion for spiller 1's side af pladen og det samme for sp2.
værdierne 12 og 13 er tænkt fungerende således at hvis der returneres 12 får spilleren en ekstra tur.
returneres 13 afsluttes spillerens tur
| |
|
Jeg forstår stadig ikke koden, men jeg kikker lidt videre.
Jeg løber ret hurtigt ind i at sp1 returnerer 1 og kommer dermed til at køre i en uendelig løkke...
| |
|
Hey ja jeg omformulere lige spørgsmålet, jeg indså det andet var lidt halvstort, kunne nogle så tilgengæld sige mig hvad der er galt med følgende programmering?
int sp1 (int fortsat, int rest, int starthul, int sp, int rum[], int bager[], int a)
{
if (a>=0)
rest=a;
cout <<"rest: "<<rest<<" starthul kage1 : "<<starthul<<endl;
do
{
rest--;
starthul--;
rum[starthul]++;
cout <<"rest: "<<rest<<" starthul: "<<starthul<<endl;
system("PAUSE");
/*if (starthul=0 && sp==0)
{
bager[0]++;
rest--;
cout <<"hej"<<endl;
if (rest==0)
return -1;
}*/
//a=rest;
}
while (rest!=0);
return a;
}
rum er et array, og de resterende heltal, string osv. definition kan findes ovenover.
Det er meningen med denne funktion at den skal "tage en bold og ligge i et hul indtil der ikke er flere bolde", men af uransaglige årsager tømmer programmet array plads nr. 1 fuldstændig for kugler.
Help anyone? Please.
| |
|
Undskyld mit fravær, jeg har haft travlt. Jeg skal nok prøve at kikke på det igen senere på aftenen.
Du kunne prøve at skrive et lille test-program til din funktion, så burde det være muligt at se og overskue hvad der er galt.
| |
| Accepteret svar Fra : BertelBrander | Modtaget 150 point Dato : 13-04-08 23:26 |
|
Jeg forstår ikke rigtigt ""tage en bold og ligge i et hul indtil der ikke er flere bolde""
Jeg synes ikke din funktion giver ret meget mening, hvad sker der når starthul bliver mindre end 0?
Jeg kunne forestille mig: "tage de bolde der ligger i et hul, og lægge dem i hullerne indtil der ikke er flere bolde".
Hvad er en "bager" i kalaha?
Jeg kan ikke huske de præcise regler, men lad os lave en funktion der gør ovenstående, erklæringen kunne se sådan ud:
int oneRound(int bane[], int start)
Den tager en bane med de 14 huller og stedet hvor den skal starte, og den returnerer det hul den ender i.
Funktionen ser da sådan ud:
int oneRound(int bane[], int start)
{
int bolde = bane[start];
bane[start] = 0;
while(bolde)
{
start++;
if(start >= 14) // hvis det er det sidste hul
start = 0; // Start forfra
bane[start]++; // En bold i hullet
bolde--; // en bold mindre
}
return start;
}
Og vi laver et lille test program:
int main()
{
int bane[14];
int a, b;
for(a = 0; a < 14; a++) // 6 kugler i alle huller...
bane[a] = 6;
int start = 4; //første gang starter vi i hul 4
// lad os køre 3 runder
for(b = 0; b < 3; b++)
{
start = oneRound(bane, start); // næste gang starter vi i det hul hvori vi sluttede
std::cout << "Vi endte i: " << start << std::endl;
for(a = 0; a < 14; a++) // udskriv antal kugler i hver hul
cout << bane[a] << " ";
cout << endl;
}
}
Selv om programmet gør det det skal, er der sandsynligvis noget galt med reglerne i ovenstående:
1: Der skal vist gøres noget specielt med de to yderste huller (de store). Vi kan give dem numrene 0 og 7.
2: Jeg kan ikke huske om den første bold skal i det hul den er taget fra.
Det næste skridt kan være at lave en funktion der kører denne løkke så mange gange som én bruger må.
| |
|
Super mange tak, jeg er kommet meget videre
| |
| Godkendelse af svar Fra : jedi_bjerre |
Dato : 14-04-08 22:55 |
|
Tak for svaret BertelBrander.
| |
|
Tak, du siger bare til hvis du har brug for mere hjælp.
| |
| Du har følgende muligheder | |
|
Eftersom du ikke er logget ind i systemet, kan du ikke skrive et indlæg til dette spørgsmål.
Hvis du ikke allerede er registreret, kan du gratis blive medlem, ved at trykke på "Bliv medlem" ude i menuen.
| |
|
|