Avatar billede tuctoh Nybegynder
26. september 2003 - 17:45 Der er 20 kommentarer og
1 løsning

C++ Spil, og fejl :p

Hej,

Jeg er ved at lave spillet "craps" (terningespil) som et C++ spil... bare for sjov.

Nå, men mit første problem er at man skal trykke 4 gange på en tast for at få den til at gå til næste spil!?

Mit andet er at det ikke er tilfældige tal den finder :p


Jeg paster min kode her nedenunder. Håber i kan hjælpe mig lidt til hvordan det gøres ;)

tak!


#include <iostream.h>
#include <stdlib.h>    //rand()
#include <conio.h>    //getche, clrscr,
#include <windows.h>  //Sleep(milisec)
#include <string>      //string


int kast1 = 0;
int spil = 0;
int vsum = 0;
int tsum = 0;
int sum;
string status;
int kastnr = 0;
int totalspil;

void start();

int kast()
{
rand();
return rand() % 6+1;
}

void vandt(){
status = "vandt";
cout << "Med " << sum << " øjne vandt du!";
vsum++;
kast1 = 0;
}

void tabt(){
status = "tabte";
cout << "Med " << sum << " øjne tabte du!";
tsum++;
kast1 = 0;
}

void uafgjort(){
status = "uafgjort";
cout << "Med " << sum << " blev spillet uafgjort. Tryk en vilkårlig tast for at kaste igen";
getch();
cout << "\n\n";
start();
}

void start(){
  int t1 = kast();
  int t2 = kast();
  sum = t1+t2;
    cout << "\n\nDen første terning viser: " << t1 << "\n" ;
    cout << "Den anden terning viser: " << t2 << "\n" ;
  cout << "Dette giver samlet " << sum << ".";

  if(kast1==0) {
      kast1 = sum;
      if(sum==7 || sum==11)
          vandt();
      else if(sum==2 ||sum==3 ||sum==12)
          tabt();
      else
          uafgjort();
  }else{
        if(sum==kast1)
          vandt();
      else if(sum==7)
          tabt();
      else
          uafgjort();

  }

    if(spil!=totalspil){ cout << "\n\nTryk for at starte næste spil";
    getche();
    clrscr();
    }
}


void main()
{

cout << "Hvor mange spil vil du spille?"; cin >> totalspil;


do
    {
  spil++;
  start();

    }while(spil!=totalspil);

cout << "\n\n\nSå er alle " << totalspil << " spil slut!";
cout << "Samlet set vandt du "<<vsum<<" ud af "<<totalspil<<" spil.";
cout << "\n\n\nTryk en tast for at lukke spillet";
getche();
}
Avatar billede arne_v Ekspert
26. september 2003 - 17:57 #1
Med hensyn til random problemet, så kald:

srand(time(NULL));

nede i main !
Avatar billede arne_v Ekspert
26. september 2003 - 18:00 #2
time kræver time.h
Avatar billede tuctoh Nybegynder
26. september 2003 - 18:01 #3
ok... men helt eksakt - hvordan virker den random funktion?

Hvad skal jeg ændre i:

int kast()
{
rand();
return rand() % 6+1;
}


for at det virker?
Avatar billede arne_v Ekspert
26. september 2003 - 18:01 #4
Med hensyn til det første problem, så er det nok generelt meget usikkert
at blande cin/cout og getch/getche.

Hvilken compiler bruger du ?
Avatar billede tuctoh Nybegynder
26. september 2003 - 18:05 #5
Jeg bruger Borland C++

Grunden til at jeg blander dem sammen, er at jeg nogle gange ikke vil have at man skal trykke enter, men bare en vilkårlig tast :S
Avatar billede arne_v Ekspert
26. september 2003 - 18:10 #6
rand() returnerer en "tilfældig" integer.

Der er ingen grund til at lave det første kald.

Får at få det lidt mere tilfældigt skal du kalde srand en og kun en gang.
Avatar billede arne_v Ekspert
26. september 2003 - 18:11 #7
rand er iøvrigt sjældent specielt god.

Overvej f.eks.:

(rand() >> 2) % 6 + 1

det hjælper nemlig lidt.
Avatar billede tuctoh Nybegynder
26. september 2003 - 18:16 #8
hej,

med:

int kast()
{
srand(time(NULL));
return (rand() >> 2) % 6 + 1;
}

får begge terninger samme værdi hver gang :s
Hvorfor er det så svært at få et tilfældigt tal i C++?

mht. getche og cin - hvis jeg ikke må blande de to udtryk, hvordan skal man så lave en "tryk en vilkårlig tast for at fortsætte"?
Avatar billede arne_v Ekspert
26. september 2003 - 18:29 #9
srand skal kun kaldes 1 gang - sæt det kald ind øverst i main !
Avatar billede arne_v Ekspert
26. september 2003 - 18:30 #10
Det er vel heller ikke specielt svært.

Det er helt normalt at man skal kalde en initialisering 1 gang og så hente
N tilfældige tal.

Der er bedre algoritmer end den rand bruger, men få nu rand til at virke først.
Avatar billede tuctoh Nybegynder
26. september 2003 - 18:44 #11
start kaldes en hel del gange... hver gang der skal kastes med terningerne :s så hvorfor skulle den op i starten?

Rand virker som sådan fint nok, men når der kastes to terninger, bliver de to altid ens... det er dét jeg ikke forstår.
Avatar billede arne_v Ekspert
26. september 2003 - 18:54 #12
srand skal heller ikke øverst i start men øverst i main.

På den måde bliver den kun kaldt ved program start.
Avatar billede tuctoh Nybegynder
26. september 2003 - 18:59 #13
ahh ok, det hjalp :)

Nu er det tilfældigt. Har dog stadig problemet med at den spørger om næste spil en hel del gange i træk :(

Er der nogen der kan hjælpe med den del af det?
Avatar billede arne_v Ekspert
26. september 2003 - 19:02 #14
Prøv og erstat:

cout << "\n\nTryk for at starte næste spil";

med:

cout << "\n\nTryk for at starte næste spil\n";
Avatar billede arne_v Ekspert
26. september 2003 - 19:03 #15
Altså en \n til sidst.
Avatar billede tuctoh Nybegynder
26. september 2003 - 19:23 #16
det hjalp ikke, men jeg tror fejlen ligger i de loops jeg har hvor jeg kalder den samme funktion flere gange :p

Jeg vil kigge på det senere i dag, og vende tilbage hertil :)
Avatar billede arne_v Ekspert
26. september 2003 - 20:35 #17
Du har ret.

Der er noget galt.

Så vidt jeg kan ligger problemet i at uafgjort kalder start.

Og det der test i bunden af start skal ikke udføres, når der er et
"om kast".

Du skal restruktuere logikken lidt.
Avatar billede tuctoh Nybegynder
26. september 2003 - 21:33 #18
yup :)

Fandt ud af at smide

    if(spil!=totalspil){ cout << "\n\nTryk for at starte næste spil";
    getche();
    clrscr();
    }

ned under main i min do-loop.

Det virker :D


Hvis jeg selv skal sige, ikke alt for dårligt, når man tænker over at det er mit første C++ program :p


Nå, men tak for hjælpen :) Du får points
Avatar billede narrr Nybegynder
28. september 2003 - 09:57 #19
Arne, hvordan kan det være at (rand()>>2) giver bedre resultater? Hvis nu rand fx returnerer 2, så bliver (rand()>>2) jo til 0. Øger du ikke chancen for at det tilfældige tal bliver 0 ?
Avatar billede arne_v Ekspert
28. september 2003 - 11:10 #20
Standard C/C++ rand tilhører den klasse af random generatorer som
man kalder LCG (Linear Congruential Generator). De har nogle
matematiske egenskaber som gør at de sidste bit er mindre random
end de højeste.

>>2 smider de 2 laveste bit væk og kan derfor give mere tilfældige tal.

[Nogle LCG'ere skifter bl.a. mellem lige og ulige tal fordi mindste
bit køer 0 1 0 1 0 1 ...]
Avatar billede narrr Nybegynder
28. september 2003 - 18:01 #21
Okey, tak for forklaringen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester