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); }
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).
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ä.
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?)
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.
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.
tää ois niin yksinkertasta tehä vbeellä
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.
ok pistän
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-
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.
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...
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ä!
Aihe on jo aika vanha, joten et voi enää vastata siihen.