Stránka 1 z 1

Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 11:58
od Hlavson
Čau all. V C++ dělám jen pár chvil takže se nechytejte za hlavu pokud Vám můj dotaz přijde směšný :roll: :-D
Mám problém. Musím vytvořit program na simulaci hodu kostkou. To se mi povedlo, ale má to háček. Program vygeneruje číslo vždy, pokud zmáčknete nějaké číslo. Např. mačkáte jedničku a program generuje. Jenže pokud mačkáte čísla velice rychle za sebou + ENTER tak se čísla opakujou. Nevím jak přesněji to vysvětlit, hodím sem zdroják + exe tak si to kdyžtak stáhněte a vyzkoušejte.

Jde mi o to, abych i při frekvenci mačkání třeba 5 hodnot/sek program generoval vždy jiné čísla.

Kód: Vybrat vše

#include <cstring>
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <ctime>
#include <windows.h>

using namespace std;
const int ROZSAH = 6;
int main()

{   
zpet:    
         int x,r,s,d;
         cout << "Zmackni jakekoli cislo pro hod kostkou" << endl;
         cin >> x;
         srand(time(0));
         r = (rand() % ROZSAH + 1);   
         s = r;
         cout << endl << "Hodil jsi: " << s << endl;
         cin.get();

if (r<=5)
     goto zpet;

if (r=6)
     goto znovu;

znovu:    
          cout << "Gratuluji hodil jsi 6! Hazej znovu" << endl;
          goto zpet6;
          
zpet6:
          
          cout << "Zmackni jakekoli cislo pro hod kostkou" << endl;
          cin >> x;
          srand(time(0));
          r = (rand() % ROZSAH + 1);   
          d = r;
          cout << endl << "Hodil jsi " << d << endl;
          cout << "Soucet je: " << s+d << endl << endl;
          cin.get();
          
goto zpet;

     system ("PAUSE");
     return 0;
}
a EXE...
http://www.edisk.cz/stahni/89259/Hod_ko ... .89KB.html

PS: Pokud víte o celkově elegantnějším napsání celého programu nebráním se tomu :)
Díky.

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 14:34
od OndraSter
Já byl vychováván tak, že goto by se neměl používat :oops: .

Jinak našel jsem docela pěkný seznam možných náhodných čísel v C++: http://www.daniweb.com/forums/thread1769.html

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 15:14
od Hlavson
Já taky :oops: jenže sem nevěděl jak na to :sad: Zkusím mrknout na to co si sem postl...

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 17:20
od Pavel.P.
Mně to ve Visual studiou ani nejde od count po cin :mrgreen: Nevíte jak to rozchodit? Zkoušel sem i nápovědu ale prd k tomu... :?

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 17:51
od OndraSter
Jak nejde? Ten samý kód co má Hlavson?

// Hlavsone, musí to být nutně v C++? Možná bych se o něco pokusil v C#/C++, jestli na to nezapomenu :D .

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 17:53
od Pavel.P.
Jde o to, že nemůžu v Microsoft Visual C++ 2008 Express Edition rozchodit ani jednoduché příkazy typu:

cout <<
cin >>

Nechápu proč...

//Musím místo toto používat příkazy pro C, které vykonají stejnou úlohu
//Už to funguje :)

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 18:17
od OndraSter
Jestli by Ti, Hlavsone, stačil C# tak tady máš funkční C# kód:

Kód: Vybrat vše

using System;

namespace hodkostkou
{
    class Program
    {

        static int limit = 6;

        static Random nahodne = new Random();


        static void Main(string[] args)
        {
            while (true)
            {

                Console.WriteLine(hod());

                Console.ReadKey();
            }
        }

        static int hod( )
        {

            int hozeno = Program.nahodne.Next(1, Program.limit + 1);

            if (hozeno == 6)
            {
                Console.Write("Hodil jsi šestku ");
                return hozeno + hod();
            }
            else return hozeno;

        }
    }
}

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 18:34
od Hlavson
Tady je to v C++. Sice s goto ale funguje to tak jak má :)

Kód: Vybrat vše

#include <cstring> 
#include <iostream> 
#include <cstdlib> 
#include <math.h> 
#include <ctime> 
#include <windows.h> 

using namespace std; 
const int ROZSAH = 6; 
int main() 

{    
    srand(time(NULL)); 
    int r,s,d,x; 
    
zpet:    
         cout << "Zmackni jakekoli cislo pro hod kostkou" << endl; 
         cin >> x; 
         r = (rand() % ROZSAH + 1);    
         s = r; 
         cout << endl << "Hodil jsi: " << s << endl; 
         cin.get(); 
         
    if (r<=5) goto zpet;
    if (r=6)  goto znovu;
    
znovu:    
          cout << "Gratuluji hodil jsi 6! Hazej znovu" << endl; 
          goto zpet6; 
          
zpet6:    
          cout << "Zmackni jakekoli cislo pro hod kostkou" << endl; 
          cin >> x; 
          r = (rand() % ROZSAH + 1);    
          d = r; 
          cout << endl << "Hodil jsi " << d << endl; 
          cout << "Soucet je: " << s+d << endl << endl; 
          cin.get(); 
          goto zpet; 
          
          system ("PAUSE"); 
          return 0; 
}

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 18:37
od Hlavson
OndraSter píše:Jestli by Ti, Hlavsone, stačil C# tak tady máš funkční C# kód:
Díky, ale bohužel jsem dostal zadání na C++. C# jsme ani nedělali :-D To by byl učitel mimo :-D

Re: Hod kostkou C++ (odladění bugu)

Napsal: ned 18. led 2009, 18:51
od Hlavson
Povedlo se i bez goto :)

Kód: Vybrat vše

#include <cstring> 
#include <iostream> 
#include <cstdlib> 
#include <math.h> 
#include <ctime> 
#include <windows.h> 

using namespace std; 
const int ROZSAH = 6; 

int main() 
{ 
    srand((unsigned)time(NULL)); 
    int r,s,d,x; 

    do 
    { 
        do 
        { 
            cout << "Zmackni jakekoli cislo pro hod kostkou" << endl; 
            cin >> x; 
            r = (rand() % ROZSAH + 1); 
            s = r; 
            cout << endl << "Hodil jsi: " << s << endl; 
            cin.get(); 
        } 
        while(r!= 6); 

        cout << "Gratuluji hodil jsi 6! Hazej znovu" << endl; 
        cout << "Zmackni jakekoli cislo pro hod kostkou" << endl; 
        cin >> x; 
        r = (rand() % ROZSAH + 1); 
        d = r; 
        cout << endl << "Hodil jsi " << d << endl; 
        cout << "Soucet je: " << s+d << endl << endl; 
        cin.get(); 
    } 
    while(true); 

    return 0; 
}

Re: Hod kostkou C++ (odladění bugu)

Napsal: pon 19. led 2009, 08:04
od Pavel.P.
Včera sem se začal učit C++/C# ale už to chápu natolik, že ti můžu říct, že tento kód je o mnohem lepší než ty, co jsi tu uváděl před tím... ;-)

Re: Hod kostkou C++ (odladění bugu)

Napsal: pon 19. led 2009, 09:41
od Zivan
Jeste by slo hodit opakujici se cast jako funkci a volat ji 2x. A na goto pro priste radeji rovnou zapomen :)

Re: Hod kostkou C++ (odladění bugu)

Napsal: pon 19. led 2009, 16:25
od petr_
a nebo ji dát do while(1) a vyskakovat break

Re: Hod kostkou C++ (odladění bugu)

Napsal: pon 19. led 2009, 17:54
od Hlavson
Asi by to chtělo přidat tam i "Zmáčkni 0 pro ukončení programu" Takhle je to totiž nekonečný cyklus. Jenže jak to udělat ? Pomocí do while ?

Re: Hod kostkou C++ (odladění bugu)

Napsal: pon 19. led 2009, 18:05
od OndraSter
Namísto

cin.get();

na konci načítej do proměnné klávesu a pak k
do {
} while ( prom != 0 );

Re: Hod kostkou C++ (odladění bugu)

Napsal: úte 20. led 2009, 23:28
od €agle
Co takhle?

Kód: Vybrat vše

#include <iostream>
#define ROZSAH 6

using namespace std;

int main()
{
    srand(time(NULL));
    unsigned char c = 0;
    int s = 0;
    while(true)
    {
        cout << "Zadej cokoli pro hod kostkou, nebo 'q' pro ukonceni" << endl;
        cin >> c;
        if(c == 'q') break;
        c = rand() % ROZSAH + 1;
        if(c == 6)
        {
            cout << "Gratuluji, hodil jsi " << (s ? "opet " : "") << "cislo 6, hazis znovu" << endl;
            s += 6;
        }
        else
        {
            cout << "Hodil jsi cislo " << (int) c;
            if(s) cout << ", celkem tedy " << s + c;
            cout << endl;
            s = 0;
        }
        cout << endl;
    };
    return 0;
}