Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Venäläinen ruletti

Sivun loppuun

Linkku [09.01.2005 21:51:24]

#

Eräänä päivänä kun löysin erään huvittavan javascriptin päätin tehdä siitä ikkunallisen version.
http://javascriptkit.com/script/script2/roulette.shtml
Ja ohjelma löytyy täältä
http://www.sorsalampi.org/codes/2/69/

Ongelmaksi tuli vain se, että se toimi vain Windowsissa. (tietenkin se toimi myös winellä...) Tässä on nyt sama toteutettuna wxWidgetsillä.

.bmp-kuva on muutettu .xpm-muotoon (gimpillä), joten ei tarvita kuin yksi ohjelmatiedosto

Kääntyy linuxissa näin:
g++ main.cpp `wx-config --cxxflags --libs` -o ruletti

Kuva:
http://koti.mbnet.fi/linkku-/koodit/Ven%e4l%e4inen%20ruletti/ruletti_xpm.xpm

Screenshotit
Windows
http://koti.mbnet.fi/linkku-/koodit/Ven%e4l%e4inen%20ruletti/ruletti_win.png
Linux
http://koti.mbnet.fi/linkku-/koodit/Ven%e4l%e4inen%20ruletti/ruletti_linux_valko.png

Käännettynä
Windows ja Dev-Cpp:n projektitiedosto
http://koti.mbnet.fi/linkku-/koodit/Ven%e4l%e4inen%20ruletti/ruletti_win_dev-cpp.zip
Linux
http://koti.mbnet.fi/linkku-/koodit/Ven%e4l%e4inen%20ruletti/ruletti.tar.gz

main.h

#include <wx/wx.h>
#include <wx/timer.h>      // wxTimer
#include <stdlib.h>        // srand(), rand()
#include <time.h>          // time()

// lisätään kuvadata
#include "ruletti_xpm.xpm"

class App: public wxApp
{
public:
    bool OnInit();
};

// main-funktio
IMPLEMENT_APP(App)

class MainFrame: public wxFrame
{
public:
    MainFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size);
    DECLARE_EVENT_TABLE()
private:
    void OnPaint(wxPaintEvent& evt);
    void OnTimer(wxTimerEvent& event);
    void OnButton(wxCommandEvent& evt);

    void OnCloseWindow(wxCloseEvent& event);

    wxString RulettiTeksti;
    wxComboBox *cb;
    wxButton *btn;
    wxTimer *timer;
    wxStaticText *text;
};

bool App::OnInit()
{
    // alustetaan satunnaislukugeneraattori
    srand(time(0));

    // luodaan ikkuna
    MainFrame *frame = new MainFrame(NULL, wxT("Venäläinen ruletti"),
        wxPoint(300, 300), wxSize(300, 250));

    frame->Show(true);

    return true;
}

void MainFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
{
    // tuhotaan ajastin
    delete timer;
    // framen kanssa pitäisi käyttää Destroyt():tä eikä Close():a
    Destroy();
}

// vakiot
enum {
    COMBOBOX = wxID_HIGHEST+1,
    BUTTON,
    TIMER
};

// asetetaan tapahtumankäsittelijät
BEGIN_EVENT_TABLE(MainFrame, wxWindow)
    // kun ikkuna pitää piirtää uudestaan
    EVT_PAINT(MainFrame::OnPaint)
    // kun nappia on painettu
    EVT_BUTTON(BUTTON, MainFrame::OnButton)
    // kun ajastimen aika on kulunut
    EVT_TIMER(TIMER, MainFrame::OnTimer)
    // kun ikkuna suljetaan
    EVT_CLOSE(MainFrame::OnCloseWindow)
END_EVENT_TABLE()

main.cpp

#include "main.h"

MainFrame::MainFrame(wxFrame *frame, const wxString& title,
    const wxPoint& pos, const wxSize& size):wxFrame(frame,
    wxID_ANY, title, pos, size, wxDEFAULT_FRAME_STYLE )
{
    RulettiTeksti = wxT("Pelaa rulettia");

    // asetetaan ajastin
    timer = new wxTimer(this, TIMER);

    // lisätään teksti
    text = new wxStaticText(this, -1, wxT("Valitse panosten määrä"), wxPoint(120, 10));

    // tausta valkoiseksi
    SetBackgroundColour(*wxWHITE);
    text->SetBackgroundColour(*wxWHITE);

    // comboboxin vaihtoehdot
    wxString choices[6] = { wxT("1"), wxT("2"), wxT("3"), wxT("4"), wxT("5"), wxT("6") };

    // lisätään combobox
    cb = new wxComboBox(this, COMBOBOX, wxT(""), wxPoint(160, 50),
        wxSize(80, 180), 6, choices, wxCB_READONLY);

    // pistetään oletusvalinnaksi numero 6
    cb->SetSelection(5);

    // lisätään "Pelaa rulettia"- nappi
    btn = new wxButton(this, BUTTON, RulettiTeksti,
        wxPoint(160, 160), wxSize(120, 30));
}

void MainFrame::OnPaint(wxPaintEvent& WXUNUSED(evt))
{
    wxPaintDC dc(this);
    // käytetään xpm-muotoon tallennettua kuvaa
    wxBitmap bitmap(ruletti_xpm);
    // piirretään kuva
    dc.DrawBitmap(bitmap, 5, 5, false);
}

void MainFrame::OnButton(wxCommandEvent& WXUNUSED(evt))
{
    // huippusalainenvenäläinenrulettialgoritmi
    int random = (rand() % 6) - 1;
    if(random<cb->GetSelection())
        wxMessageBox(wxT("Olet kuollut!"), wxT("BANG!"), wxOK|wxICON_ERROR, this);
    else {
        // jos et hävinnyt vaihdetaan teksti
        btn->SetLabel(wxT("Sinulla kävi tuuri"));
        // ja laitetaan timer, jolla saadaan vanha teksti takaisin
        // wxTIMER_ONE_SHOT = ajastin suoritetaan vain kerran
        timer->Start(1000, wxTIMER_ONE_SHOT);
    }
}

void MainFrame::OnTimer(wxTimerEvent& WXUNUSED(event))
{
    // kun timerin aika on kulunut laitetaan vanha teksti buttoniin
    btn->SetLabel(RulettiTeksti);
}

FrozenFire [13.01.2005 07:39:12]

#

Hauska idea...

Onks tää buki vai ominaisuus? Kun vast 15 kerralla sain napin ottaan (välillä ekallakin...). Koodissa vois olla jotain tarkistamista jos kyseessä on kuudesti laukeava (maksimi luotien määrä) tai kahdeksan kertaa laukeava (kuvasta).

Linkku [13.01.2005 18:01:31]

#

lainaus:

Onks tää buki vai ominaisuus? Kun vast 15 kerralla sain napin ottaan

Mitä? Voitko hiukan tarkentaa? Vikaa voi tietenkin olla myös rand()-funktiossa.

lainaus:

Koodissa vois olla jotain tarkistamista jos kyseessä on kuudesti laukeava (maksimi luotien määrä) tai kahdeksan kertaa laukeava (kuvasta).

Juu, mutta ajattelin nyt tehdä kuudella panoksella kuten alkuperäisessä.

FrozenFire [14.01.2005 06:42:33]

#

No testailin yhdellä panoksella... Niin kerran pysyin jopa 15 vuorolla hengiissä. Hyvin usein se meni yli sen kuuden...

(oon lähes jumala? tai ainakin kissa ku on yheksän lisä elämää.)

Ton ekan viestin jälkeen kokeilin laittaa 5 panosta... siinä ennätyksesksi pienellä naputtelulla sain 3 kertaa (0-1kertaa pitäs vissiin olla?)

Linkku [14.01.2005 07:44:03]

#

lainaus:

No testailin yhdellä panoksella... Niin kerran pysyin jopa 15 vuorolla hengiissä. Hyvin usein se meni yli sen kuuden...

(oon lähes jumala? tai ainakin kissa ku on yheksän lisä elämää.)

Ton ekan viestin jälkeen kokeilin laittaa 5 panosta... siinä ennätyksesksi pienellä naputtelulla sain 3 kertaa (0-1kertaa pitäs vissiin olla?)

Siinähän kuolee jos panosten määrä on isompi kuin randomi -1:n ja 5:n väliltä.
rand():ssa voi tietenkin olla vikaa.

Kertokaa ihmeessä jos tiedätte jonkun paremman satunnaislukufnktion.

FooBat [14.01.2005 09:20:42]

#

lainaus:

rand():ssa voi tietenkin olla vikaa.

Ei siinä rand():ssa mitään vikaa ole. Joka laukaisun yhteydessä panos vaan arvotaan uudestaan eri paikkaan. Oikea tapahan olisi asetta ladatessa arpoa, mihin kohtaan panos tulee ja liipasinta painettaessa katsoa ollaanko panoksen kohdalla.

Nyt todennäköisyys, että n:llä laukauksella ei tule nappia otsaan on (5/6)^n eli hyvällä tuurilla voi liipasinta hypistellä varsin monta kertaa.

tesmu [14.01.2005 12:40:35]

#

tää ois niin yksinkertasta tehä vbeellä

Linkku [14.01.2005 14:22:59]

#

lainaus:

Nyt todennäköisyys, että n:llä laukauksella ei tule nappia otsaan on (5/6)^n eli hyvällä tuurilla voi liipasinta hypistellä varsin monta kertaa.

Aivan.

lainaus:

tää ois niin yksinkertasta tehä vbeellä

Pistä ihmeessä VB:llä tehty ohjelma.

tesmu [15.01.2005 04:26:55]

#

ok pistän

Grey [15.01.2005 23:09:22]

#

Luulenpa ettei siinä oikeassakaan venäläisessä ruletissa mene niin täsmällisesti se että tuleeko kuti vai eikö. Tuhat ja miljoona erilaista satunnaistekijää kun lienee moisessa mukana..

-Grey-

rutkis [17.01.2005 10:37:53]

#

Kun rullaa pyöräyttää sitten, että se pyörii vapaasti niin rullassa oleva yksi ainoa panos painollaan painaa itsensä rullan "pohjalle" hyvinkin usein. Luulisin että noin kolmannella napsahtaa otsaan melko usein.

Linkku [17.01.2005 20:37:14]

#

lainaus:

Kun rullaa pyöräyttää sitten, että se pyörii vapaasti niin rullassa oleva yksi ainoa panos painollaan painaa itsensä rullan "pohjalle" hyvinkin usein. Luulisin että noin kolmannella napsahtaa otsaan melko usein.

Siitähän oli juuri juttu iltalehdessä, kun kaksi miestä oli pelannut venäläistä rulettia ja toinen ei ollut pyoräyttanyt rullaa kunnolla ja kuinkas kävikään...

Minä [18.01.2005 22:39:02]

#

lainaus:

Siitähän oli juuri juttu iltalehdessä, kun kaksi miestä oli pelannut venäläistä rulettia ja toinen ei ollut pyoräyttanyt rullaa kunnolla ja kuinkas kävikään...

Ja samassa jutussa oli myös maininta pienentää todennäköisyyttä. Rullan annettaessa pyöriä vapaasti, jää hyvin rasvattussa aseessa rulla suuremmalla todennäköisyydellä painovoiman vaikuttaessa alas, kun ylös. Jos jollakin on lehti tallessa niin voi varmaan tarkentaa jos olen väärässä!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta