Kirjautuminen

Tunnus
Salasana

Haku

Tehtävät

Datatähti 2015

Datatähti on peruskoulun ja lukion ohjelmointikilpailu, jonka alkukilpailu on käynnissä 29.9–12.10. Lue lisää...

Koodivinkit: QB: Lotto

Kirjoittaja: Sami; viimeksi muokattu 03.04.2003.

Tagit: pelit

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

Kommentit

Antti Laaksonen [03.04.2003 18:08:14]

Lainaa #

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

thefox [03.04.2003 18:20:25]

Lainaa #

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".

trinit [03.04.2003 18:39:26]

Lainaa #

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?

Sami [03.04.2003 20:42:21]

Lainaa #

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.

Gary534 [11.05.2005 12:25:01]

Lainaa #

ihan hyvä koodivinkki ainakin minun omasta mielestäni. Mutta olisi koodin pystynyt tehdä helpommallakin tavalla niin kuin minä olen tehnyt.

moptim [11.07.2007 18:58:56]

Lainaa #

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.

Kirjoita kommentti

Muista lukea keskustelun ohjeet.
Tietoa sivustosta