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 arvataTä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
NEXTItse 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.