Kirjoittaja: Sami
Kirjoitettu: 03.04.2003 – 03.04.2003
Tagit: pelinteko, koodi näytille, peli, vinkki
Kaikkien tuntema Lotto QBasicille.
'Kaikkien tuntema Lotto QBasicille 'Tehnyt: Sami CLS ' Kaikki tietävät tämän (toivottavasti) numeroita = 39 ' Kuinka monesta numerosta arvotaan arvottavia = 7 ' Kuinka monta numeroa arvotaan IF arvottavia > numeroita THEN ' Estetään virhetilanteita PRINT "Ei voi arpoa useampaa numeroa kuin pelissä on numeroita!" END END IF IF arvottavia < 2 THEN ' Estetään lisää virhetilanteita PRINT "Pitää arpoa vähintään 2 numeroa!" END END IF RANDOMIZE TIMER ' Jotta kaikki arvonnat eivät olisi samanlaisia... DIM numero(1 TO arvottavia) AS INTEGER ' Taulukko arvotuille numeroille DIM omanumero(1 TO arvottavia) AS INTEGER ' Taulukko omille numeroille ' Kysytään haluaako pelaaja vatita numerot itse vaiko eikö PRINT "*** QB-LOTTO ***" PRINT PRINT "1) Valitse itse omat numerosi" PRINT "2) Arvo itsellesi satunnaiset numerot" PRINT "3) Lopeta" DO SELECT CASE INKEY$ CASE "1" arvo = 0 EXIT DO CASE "2" arvo = 1 EXIT DO CASE "3", CHR$(27) END END SELECT LOOP ' Oman rivin arvonta IF arvo = 1 THEN ' Jos arvo = 1 niin suoritetaan omien numeroiden arvonta CLS PRINT "Arvontaa suoritetaan..." FOR I = 1 TO arvottavia ' Arpoo omat numerot omanumero(I) = INT(RND * numeroita) + 1 NEXT I DO ' Estää samojen numeroiden tulemisen uusinta = 0 FOR a = 1 TO arvottavia FOR b = 1 TO arvottavia IF a <> b THEN IF omanumero(a) = omanumero(b) THEN uusinta = 1 omanumero(a) = INT(RND * numeroita) + 1 END IF END IF NEXT NEXT LOOP WHILE uusinta = 1 FOR a = 1 TO arvottavia - 1 ' Järjestää omat numerot pienimmästä suurimpaan FOR b = 1 TO arvottavia - 1 IF omanumero(b) > omanumero(b + 1) THEN SWAP omanumero(b), omanumero(b + 1) NEXT NEXT END IF ' Oman rivin päättäminen itse IF arvo = 0 THEN ' Jos arvo = 0 niin pelaaja voi itse päättää numeronsa CLS PRINT "Anna omat numerosi yksi kerrallaan" SLEEP FOR a = 1 TO arvottavia DO uusinta = 0 CLS IF a > 1 THEN PRINT "Olet valinnut jo numerot "; ' Näyttää jo valitut numerot FOR b = 1 TO a - 1 IF b < a - 1 THEN PRINT LTRIM$(STR$(omanumero(b))); ", "; ELSE PRINT LTRIM$(STR$(omanumero(b))) END IF NEXT END IF INPUT "Anna seuraava numero: ", omanumero(a) IF omanumero(a) < 1 OR omanumero(a) > numeroita THEN ' Ei hyväksy liian pieniä tai liian suuria numeroita uusinta = 1 END IF FOR c = 1 TO a ' Ei hyväksy myöskään samoja numeroita FOR d = 1 TO a IF c <> d THEN IF omanumero(c) = omanumero(d) THEN uusinta = 1 END IF END IF NEXT NEXT LOOP WHILE uusinta = 1 IF a > 1 THEN FOR c = 1 TO a - 1 ' Järjestää omat numerot pienimmästä suurimpaan FOR d = 1 TO a - 1 IF omanumero(d) > omanumero(d + 1) THEN SWAP omanumero(d), omanumero(d + 1) NEXT NEXT END IF NEXT END IF CLS PRINT "Arvontaa suoritetaan..." ' "Oikean rivin" arvonta alkaa tästä FOR I = 1 TO arvottavia numero(I) = INT(RND * numeroita) + 1 ' Arpoo numerot NEXT I DO ' Tämä looppi estää samojen numeroiden tulemisen uusinta = 0 FOR a = 1 TO arvottavia FOR b = 1 TO arvottavia IF a <> b THEN IF numero(a) = numero(b) THEN uusinta = 1 numero(a) = INT(RND * numeroita) + 1 END IF END IF NEXT NEXT LOOP WHILE uusinta = 1 FOR a = 1 TO arvottavia - 1 ' Järjestää numerot pienimmästä suurimpaan FOR b = 1 TO arvottavia - 1 IF numero(b) > numero(b + 1) THEN SWAP numero(b), numero(b + 1) NEXT NEXT ' Tulosten ilmoittaminen CLS PRINT "QB-LOTON tämän arvonnan oikea rivi on:" FOR I = 1 TO arvottavia ' Kirjoittaa arvotut numerot IF I < arvottavia THEN PRINT LTRIM$(STR$(numero(I))); ", "; ELSE PRINT LTRIM$(STR$(numero(I))) END IF NEXT PRINT PRINT "Omat numerosi olivat: " FOR I = 1 TO arvottavia ' Kirjoittaa omat numerot IF I < arvottavia THEN PRINT LTRIM$(STR$(omanumero(I))); ", "; ELSE PRINT LTRIM$(STR$(omanumero(I))) END IF NEXT FOR a = 1 TO arvottavia ' Laskee oikein osuneiden numeroiden määrän FOR b = 1 TO arvottavia IF omanumero(a) = numero(b) THEN oikein = oikein + 1 END IF NEXT NEXT PRINT PRINT "Sait"; oikein; "oikein" ' Tämän saattaa jopa arvata
Tässä on toinen tapa arpoa lottonumerot, joka on siitä hyvä, että numeroita täytyy arpoa vain seitsemän.
'numeroiden määrä ja taulukon alustus numerot = 39 DIM taulukko(numerot) AS INTEGER 'täytetään taulukko numeroilla FOR i = 1 TO numerot taulukko(i) = i NEXT 'tyhjennetään näyttö ja alustetaan 'satunnaislukugeneraattori CLS RANDOMIZE TIMER 'alkioiden määrä alussa maara = numerot 'lasketaan 7 numeroa FOR i = 1 TO 7 'arvotaan joku taulukon numeroista numero = INT(RND * maara) + 1 'tulostetaan arvottu numero PRINT taulukko(numero) 'poistetaan arvottu numero taulukosta '(alkioita siirretään yksi eteenpäin 'oikealta kohdalta) FOR j = numero + 1 TO maara taulukko(j - 1) = taulukko(j) NEXT 'alkioiden määrä on yhtä pienempi maara = maara - 1 NEXT
Itse väänsin kerran niinkin mielenkiintoisen ohjelman (taisi olla VB:llä), joka etsi kaikista edellisistä arvonnoista yleisimmät numerot ja kertoi ne käyttäjälle ;-)
Koodivinkistä sen verran että muutamassa paikassa hommat olisi voinut hoitaa hieman elegantimmin. Mennee sarjaan "ihan kiva".
Ihan käypä vinkki. Itsekin tullut muutamia sovelluksia tehtyä VB:llä, joista uusin ja keskeneräinen on Kenon rivien haku Veikkauksen palvelimelta josta lasketaan yleisimpien numeroiden esiintymiskerrat ja prosentit. Muutama kuvakaappaus:
http://www.saunalahti.fi/~trinit/ka03_1.jpg
http://www.saunalahti.fi/~trinit/ka03_2.jpg
Todennäköisyyden laskenta-algoritmista en ole varma onko oikein (itse kehitelty). Ei kukaan tietäisi mistä löytyisi oikeita algoritmeja?
Vaikuttaa näppärältä tuo Antin tapa. En itse jaksanut alkaa kauheasti miettimään tuon koodin sieventämistä, sillä tein sille pohjan eilen illalla muutamassa minuutissa ja parantelin siihen tänään mm. omien numeroiden syötön.
ihan hyvä koodivinkki ainakin minun omasta mielestäni. Mutta olisi koodin pystynyt tehdä helpommallakin tavalla niin kuin minä olen tehnyt.
Turha sitä on kattoa mikä on yleisin, jos lottonumerot tulee satunnaisesti (tietysti pallojen välillä saattaa olla vaihtelua, mutta..). Lotossahan periaatteessa rivi 1,2,3,4,5,6,7 olisi yhtä järkevä kuin joku 1,2,3,4,5,13,37 tai w/e, tosin 1,2,3,4,5,6,7 lienee hyvin suosittu rivi, ja jos se voittaisi, voiton saisi jakaa noin n+1 muun henkilön kanssa.