Page 41 of 50
Re: Tyhmät kysymykset (I/2011)
Posted: Sat Sep 10, 2011 4:06 pm
by koodaaja
Koska ruutusi koko on 32 pikseliä ja CB käyttää koordinaattina yksittäisiä pikseleitä. Luvut eivät sen jälkeenkään täsmää, mutta jaa mX 32:lla niin liikut ainakin samankokoisessa koordinaatistossa.
Re: Tyhmät kysymykset (I/2011)
Posted: Sat Sep 10, 2011 4:22 pm
by Paroni
Tiedän.
Tarkoitin lähinnä miksi tuo luku on noin suuri kun Box 0, 0, grid, grid piirtää laatikon tuon sinisen laatikon viereen. Tuon klikkauksen mukaan taas X:n 0 -koordinaatti on jossain ihan muualla. En tiedä mietinkö tätä väärin mutta vaikuttaa jotenkin oudolta.
Re: Tyhmät kysymykset (I/2011)
Posted: Sun Sep 11, 2011 11:34 am
by Jonez
Siis sekoat siinä, että vaikka piirrät kuvan kohtaan 0, 0, mX silti palauttaa siitä koordinaatista arvon 700 jotain?
mX ei sinänsä liity mitenkään kuvien piirtämiseen. Se ei edes liity sen valkoisen kursori-boksin piirtoon, vaikka molemmat hyödyntävät MouseX():ää ja -Y():tä. Mitä mX ja mY tekevät on se, että ne ottavat tietyn origopisteen, ja liikuttavat sitä pistettä juuri vastakkaiseen suuntaan kuin mihin kamera liikkuu. Näin saamme illuusion että (mX, mY) on tietty kiinteä piste peliavaruudessa, ja pystymme liikuttamaan kameraa suhteessa siihen.
Ongelma siis on se, että sinulla on oikeastaan kolme eri koordinaatistoa: ruutukoordinaatit, joihin voisit piirtää esim. kirjoittamalla Text 20, 20, "Hello World" (ei DrawToWorldilla). Sitten on maailmakoordinaatit, joihin objektit piirretään. Myös kuvat piirretään maailmakoordinaatteihin DrawToWorldin avulla. Sitten sinulla on ihan omat maailmakoordinaatit, jotka luodaan mX:llä ja mY:llä. Nämä koordinaatit kasvavat samaan suuntaan ja yhtä nopeasti kuin normaalitkin m-koordinaatit, mutta niiden
origopiste on eri. Ja tämä johtuu yksinkertaisesti siitä kaavasta mitä käytät.
Käyttämäsi kaava on seuraavanlainen: (tämä on hieman eri kuin kaava jonka annoin, sekosin itsekin
. Toimii samalla tavalla.)
Code: Select all
mX = (ScreenWidth() / 2.0) + bX + CameraX()
mY = -((ScreenHeight() / 2.0) + bY - CameraY())
Kaavassa CameraX(), -CameraY() ovat muuttujia, jotka huolehtivat että piste liikkuu oikeaan suuntaan kun kameraa liikutetaan. -CameraY() koska kuvakoordinaatisto kasvaa vastakkaiseen suuntaan kuin objektikoordinaatisto.
bX ja bY ovat muuttujia, jotka säilövät halutun pisteen koordinaatistossa. Jos bX ja bY ovat (0, 0), mX:n ja mY:n palauttama piste on tämän oman koordinaatiston origo.
ScreenWidth() / 2, ScreenHeight() / 2 ovat nyt se origo. Tämä kertoo missä suhteessa uusi origo on alkuperäiseen kuvakoordinaatiston origoon. Tässä on ongelmasi: origosi on eri kuin ehkä haluat. Ja pääsemme ratkaisuun. Siirrämme origoa:
Code: Select all
mX = (-ScreenWidth() / 2.0) + bX + CameraX()
mY = -((-ScreenHeight() / 2.0) + bY - CameraY())
Ja nyt mX:n ja mY:n palauttamat arvot ovat identtiset maailmakoordinaatiston kanssa.
(Koordinaatistomuunnokset ovat minullekin aika vaikea asia, toivottavasti en nyt seonnut pahasti jossain seikassa. Koodin pitäisi kuitenkin toimia).
Re: Tyhmät kysymykset (I/2011)
Posted: Sun Sep 11, 2011 5:59 pm
by Laurenzo
Kuinka pystyisin tekemään pause-tilan peliini?Eli kun Painaa näppäintä P niin esiin ilmestyy pausevalikko jossa on napit:
JATKA eli peli jatkuisi samasta kohdasta mihin se on pysäytetty
LOPETA lopettaa pelin.
Re: Tyhmät kysymykset (I/2011)
Posted: Sun Sep 11, 2011 6:29 pm
by Execute
Miten tiedän milloin tyyppikokoelmassa on jäljellä enää yksi jäsen?
Re: Tyhmät kysymykset (I/2011)
Posted: Sun Sep 11, 2011 7:13 pm
by Latexi95
Execute wrote:Miten tiedän milloin tyyppikokoelmassa on jäljellä enää yksi jäsen?
Code: Select all
määrä = 0
for each
määrä + 1
next
if määrä = 1 then
endif
Re: Tyhmät kysymykset (I/2011)
Posted: Sun Sep 11, 2011 7:21 pm
by Jonez
Execute:
Voit myös pitää globaalia muuttujaa, joka alkaa nollasta, lisääntyy yhdellä kun tyyppi luodaan ja vähentyy yhdellä kun se tuhotaan. Näin tiedät aina tyyppien määrän käymättä niitä läpi. Tämä on lähes pakollista muuttuvien taulukoiden kanssa.
Laurenzo:
Code: Select all
//Pääsilmukka
Repeat
If KeyHit(CbKeyP) Then pause = Not pause
If pause Then
//Pausen päällä oleva koodi
PiirraValikko()
Else
//Itse pelin koodi
LiikutaPelaajia()
LiikutaAmmuksia()
DrawScreen
Forever
Re: Tyhmät kysymykset (I/2011)
Posted: Sun Sep 11, 2011 7:49 pm
by jaahas
Yksinkertasempi?
Code: Select all
//pääsilmukka
Repeat
//ohjelma tähän
If KeyHit(cbkeyp) Then
UpdateGame()
Repeat
//valikko tähän
If KeyHit(cbkeyp) Then Exit
DrawScreen
Forever
EndIf
//tai tähän
DrawScreen
Forever
Re: Tyhmät kysymykset (I/2011)
Posted: Sun Sep 11, 2011 8:04 pm
by Awaclus
Itsehän olen toteuttanut pausen aina aliohjelmalla, selkeyttää mielestäni päälooppia kun ei ole jotain varsinaisesti peliin kuulumatonta seassa. Toisin sanoen näin:
Code: Select all
ukko = LoadObject ("Media\cow.bmp")
Repeat
TranslateObject ukko, RightKey()*2-LeftKey()*2, UpKey()*2-DownKey()*2
If KeyHit(cbkeyp) Then Gosub pause
DrawScreen
Forever
pause:
Repeat
DrawScreen
Until KeyHit(cbkeyp)
Return
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 3:20 pm
by Noun
Saako CB:n Make- ja EditMapeilla tuotettuja karttoja tallennettua mitenkään?
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 3:24 pm
by Latexi95
Noun wrote:Saako CB:n Make- ja EditMapeilla tuotettuja karttoja tallennettua mitenkään?
CoolBasicissa ei ole valmiina sellaista komentoa, mutta tilesterin karttaformaatti on varsin helppo(ohjeet latausfunktion tekoon löytyvät tilesterin asennuskansiosta), joten tallennus funktio on varsin helppo tehdä. Veikkaan kyllä, että aika monelta löytyy tarvittava koodi jostain arkistojen pohjalta. Itsekin tein joskus tuollaisen funktion, mutta sen lähdekoodi on kyllä tainnut jo hävitä.
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 4:05 pm
by axu
Noun wrote:Saako CB:n Make- ja EditMapeilla tuotettuja karttoja tallennettua mitenkään?
Tämmösen joskus tein (avaus- ja tallennusfunktiot):
Code: Select all
Dim TileAnim(1,1) //TileAnim -taulukko sisältää tilejen animoinnin(koska coolbasicissa ei voi tarkistaa sitä jälkikäteen), TileAnim(TILE, ANIMAATION_PITUUS = 0/ANIMAATION_HITAUS = 1
Function OpenMap(FileName$, Tileset$="", PrintHeader = 0)
f = OpenToEdit(FileName)
' If Not(ReadByte(f) = 40 And ReadByte(f) = 192 And ReadByte(f) = 13 And ReadByte(f) = 139) Then MakeError "Can't load map "+FileName+". Map is not valid Tilester 1.3 file"
If PrintHeader Then
Print ReadByte(f) + " " + ReadByte(f) + " " + ReadByte(f) + " " + ReadByte(f)
WaitKey
EndIf
If Tileset = "" Then
SeekFile f, 564
For i = 0 To 255
b = ReadByte(f)
If b = 0 Then Exit Else Tileset = Tileset + Chr(b)
Next i
EndIf
SeekFile f, 820
TileCount = ReadInt(f)
TileWidth = ReadInt(f)
TileHeight = ReadInt(f)
Map = MakeMap(ReadInt(f), ReadInt(f), TileWidth, TileHeight)
TilesetImg = LoadImage(Tileset)
PaintObject Map, TilesetImg
For i = 0 To 3
If Not(ReadByte(f) = 254-i And ReadByte(f) = 45-i And ReadByte(f) = 12-i And ReadByte(f) = 166-i) Then MakeError "Can't load map "+FileName+". Map layer "+i+" was corrupted"
For Y = 1 To MapHeight()
For X = 1 To MapWidth()
EditMap Map, i + (i = 1) - (i = 2), X, Y, ReadInt(f)
Next X
Next Y
Next i
If Not(ReadByte(f) = 250 And ReadByte(f) = 41 And ReadByte(f) = 8 And ReadByte(f) = 162) Then MakeError "Can't load map "+FileName+". Tile animation was corrupted"
ReDim TileAnim(TileCount-1, 1)
For i = 0 To TileCount-1
TileAnim(i, 0) = ReadInt(f)
TileAnim(i, 1) = ReadInt(f)
SetTile i, TileAnim(i, 0), TileAnim(i, 1)
Next i
SeekFile f, 520
MaskObject Map, ReadByte(f), ReadByte(f), ReadByte(f)
CloseFile f
Return Map
End Function
Function SaveMap(Map, FileName$, TilesetImg, Tileset$ = "", MaskRED = 0, MaskGREEN = 0, MaskBLUE = 0, Comment$ = "")
f = OpenToWrite(FileName)
WriteByte f, 40 : WriteByte f, 192 : WriteByte f, 13 : WriteByte f, 139
WriteFloat f, 1.3
For i = 1 To 512
If i < Len(Comment) And i < 256 Then
WriteByte f, Asc(Mid(Comment, i, 1))
Else
WriteByte f, 0
EndIf
Next i
WriteByte f, MaskRED : WriteByte f, MaskGREEN : WriteByte f, MaskBLUE : WriteByte f, 0
For i = 1 To 40
WriteByte f, 0
Next i
For i = 1 To 256
If i < Len(Tileset) Then
WriteByte f, Asc(Mid(Tileset, i, 1))
Else
WriteByte f, 0
EndIf
Next i
TileCount = (ImageWidth(TilesetImg)/(ObjectSizeX(Map) / MapWidth())) * (ImageHeight(TilesetImg)/(ObjectSizeY(Map) / MapHeight()))
WriteInt f, TileCount
WriteInt f, ObjectSizeX(Map) / MapWidth()
WriteInt f, ObjectSizeY(Map) / MapHeight()
WriteInt f, MapWidth()
WriteInt f, MapHeight()
For i = 0 To 3
WriteByte f, 254-i : WriteByte f, 45-i : WriteByte f, 12-i : WriteByte f, 166-i
For Y = 1 To MapHeight()
For X = 1 To MapWidth()
WriteInt f, GetMap2(i + (i = 1) - (i = 2), X, Y)
Next X
Next Y
Next i
WriteByte f, 250 : WriteByte f, 41 : WriteByte f, 8 : WriteByte f, 162
For i = 0 To TileCount-1
WriteInt f, TileAnim(i, 0)
WriteInt f, TileAnim(i, 1)
Next i
CloseFile f
EndFunction
Muistaakseni toimii hyvin. Minkäänlaista ohjetta en tähän kirjoittanut
Tietenkin suosittelen itse kokeilemaan tuon tekoa, kuten Latexi sanoikin, on Tilesterin formaatti helppo ja dokumentaatio riittävä.
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 5:21 pm
by Geewilliam
Täällä taas kysymässä...
Koodissani on ilmeisesti jotain häikkää, sillä kun tuosta valikosta menee "korkolaskuriin", tuleekin pelkää tyhjää. Ongelma varmaan on jossain drawscreen tms. komennossa, mutta en vain keksi missä =p.
Koodi siis tässä:
(itse aliohjelma löytyy vähän keskikohdan alapuolelta (korkolaskuri).)
Code: Select all
SCREEN 500,250
'päävalikko
valikkonappuloita = 3
//luodaan nappuloille taulukko jossa toisen ulottuvuus kertoo onko kyseessä
//nappulan nimi (1) vai nappulafunktion palauttama arvo (0)
Dim valikkokohta(valikkonappuloita-1,1) As String
//asetetaan nappuloille nimet, nämähän voidaan toki vaikka ladata ulkoisesta tiedostostakin
valikkokohta(0,1)="Uusi peli"
valikkokohta(1,1)="korkolaskuri"
valikkokohta(2,1)="Lopeta peli"
Repeat
// tässä päivitetään kaikkien nappuloiden tila, jos nappula on alhaalla niin valikkokohta(i,0)="1" muutoin valikkokohta(i,0)="0"
For i=0 To valikkonappuloita-1
valikkokohta(i,0)=Button(100,100+30*i,100,20,valikkokohta(i,1))
Next i
//jos nappula numero 2 eli lopetus on alhaalla niin lopetetaan
If Int(valikkokohta(2,0)) Then End
If Int(valikkokohta(1,0)) Then
Gosub korkolaskuri
EndIf
DrawScreen
Forever
// x, y koordinaatit
// w,h koko
// t painikkeen teksti
// s painikkeen pyöreys
Function Button(x,y,w,h,t$,s=5)
If MouseX()>x And MouseY()>y And MouseX()<x+w And MouseY()<y+h Then
If MouseDown(1) Then Color 180,180,180 Else Color 240,240,240
If MouseUp(1) Then Return True
Else
Color 200,200,200
EndIf
Box x+s,y,w-(s*2),h
Box x,y+s,w,h-(s*2)
Circle x,y,s*2
Circle x+w-s*2,y,s*2
Circle x+w-s*2,y+h-s*2,s*2
Circle x,y+h-s*2,s*2
Color cbblack
CenterText x+w/2,y+h/2-TextHeight(t)/2,t$
EndFunction
korkolaskuri: 'korkolaskuri-aliohjelma
ClearText
xx#="" 'nollataan muuttujat
yy#=""
zz#=""
Locate 10,10
Repeat
xx# = Input("Alkusumma ")
DrawScreen OFF
Until KeyHit(28)
//tyhjennetään näppäinpuskuri ettei edellinen enterin painallus poistu suoraan seuraavastakin loopista
ClearKeys
//nollataan input seuraavaa kyselyä varten
CloseInput
Locate 10,20
Repeat
yy# = Input("Kuukausittainen korkoprosentti: ")
DrawScreen OFF
Until KeyHit(28)
//tyhjennetään näppäinpuskuri ettei edellinen enterin painallus poistu suoraan seuraavastakin loopista
ClearKeys
//nollataan input seuraavaa kyselyä varten
CloseInput
Locate 10,30
Repeat
zz# = Input("Kuinka monta kuukautta?: ")
DrawScreen OFF
Until KeyHit(28)
//tyhjennetään näppäinpuskuri ettei edellinen enterin painallus poistu suoraan seuraavastakin loopista
ClearKeys
//nollataan input seuraavaa kyselyä varten
CloseInput
aa#=yy*0.01+1.0 // lasketaan prosenttikerroin
bb#=aa^zz //nostetaan prosenttikerroin potenssiin
vastaus#=bb*xx //lasketaan vastaus
ClearKeys
Write "Vastaus on: "
Write vastaus
Print ""
Print "paina enter palataksesi päävalikkoon"
Repeat
If KeyHit (28)
Return
EndIf
Forever
DrawScreen
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 5:47 pm
by Jonez
Riviltä ~80 puuttuu Return, jolla pääsisit takaisin valikkoon. Color taitaa olla 0, 0, 0; eli voit kirjoittaa mutta mitään ei oikeastaan näy. Koska komennat DrawScreen Off (etkä pelkkä DrawScreen), kuvaa ei tyhjennetä ja valikkokuva jää ruudulle.
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 5:52 pm
by Geewilliam
Return löytyy riviltä ~119. Drawscreen off on tarkoituksella, jotta aikaisemmat textit jäävät näkyviin. (Kannattaisiko mieluummin käyttää addtextiä?)
e. Siis ei addtextiä voikaan käyttää, sillä nyt puhun noitsa inputeista. Tietysti ne voi korvata addtextillä inputin jälkeen.
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 5:55 pm
by Latexi95
Jonez wrote:Riviltä ~80 puuttuu Return, jolla pääsisit takaisin valikkoon. Color taitaa olla 0, 0, 0; eli voit kirjoittaa mutta mitään ei oikeastaan näy. Koska komennat DrawScreen Off (etkä pelkkä DrawScreen), kuvaa ei tyhjennetä ja valikkokuva jää ruudulle.
Juu... Tai oikeastaa sieltä ei taida puuttua Returnia, mutta ainakin yksi drawscreen. Ja väri todellakin on jäännyt täysin mustaksi joten mitään ei näy. Sitten vielä kannattaa opetella sisentäminen. Se helpottaa niin omaakin kuin muidenkin koodinlukua. Ai niin ja Write ja Print eivät toimi oikein jos käyttät Drawscreeniä joten vaihdoin ne AddTextiin.
Tässä korjattu koodi:
Code: Select all
SCREEN 500,250
'päävalikko
valikkonappuloita = 3
//luodaan nappuloille taulukko jossa toisen ulottuvuus kertoo onko kyseessä
//nappulan nimi (1) vai nappulafunktion palauttama arvo (0)
Dim valikkokohta(valikkonappuloita-1,1) As String
//asetetaan nappuloille nimet, nämähän voidaan toki vaikka ladata ulkoisesta tiedostostakin
valikkokohta(0,1)="Uusi peli"
valikkokohta(1,1)="korkolaskuri"
valikkokohta(2,1)="Lopeta peli"
Repeat
// tässä päivitetään kaikkien nappuloiden tila, jos nappula on alhaalla niin valikkokohta(i,0)="1" muutoin valikkokohta(i,0)="0"
For i=0 To valikkonappuloita-1
valikkokohta(i,0)=Button(100,100+30*i,100,20,valikkokohta(i,1))
Next i
//jos nappula numero 2 eli lopetus on alhaalla niin lopetetaan
If Int(valikkokohta(2,0)) Then End
If Int(valikkokohta(1,0)) Then
Gosub korkolaskuri
EndIf
DrawScreen
Forever
// x, y koordinaatit
// w,h koko
// t painikkeen teksti
// s painikkeen pyöreys
Function Button(x,y,w,h,t$,s=5)
If MouseX()>x And MouseY()>y And MouseX()<x+w And MouseY()<y+h Then
If MouseDown(1) Then Color 180,180,180 Else Color 240,240,240
If MouseUp(1) Then Return True
Else
Color 200,200,200
EndIf
Box x+s,y,w-(s*2),h
Box x,y+s,w,h-(s*2)
Circle x,y,s*2
Circle x+w-s*2,y,s*2
Circle x+w-s*2,y+h-s*2,s*2
Circle x,y+h-s*2,s*2
Color cbblack
CenterText x+w/2,y+h/2-TextHeight(t)/2,t$
EndFunction
korkolaskuri: 'korkolaskuri-aliohjelma
ClearText
Color cbWhite
xx#="" 'nollataan muuttujat
yy#=""
zz#=""
Locate 10,10
Repeat
xx# = Input("Alkusumma ")
DrawScreen
Until KeyHit(28)
//tyhjennetään näppäinpuskuri ettei edellinen enterin painallus poistu suoraan seuraavastakin loopista
ClearKeys
//nollataan input seuraavaa kyselyä varten
CloseInput
Locate 10,20
Repeat
yy# = Input("Kuukausittainen korkoprosentti: ")
DrawScreen OFF
Until KeyHit(28)
//tyhjennetään näppäinpuskuri ettei edellinen enterin painallus poistu suoraan seuraavastakin loopista
ClearKeys
//nollataan input seuraavaa kyselyä varten
CloseInput
Locate 10,30
Repeat
zz# = Input("Kuinka monta kuukautta?: ")
DrawScreen OFF
Until KeyHit(28)
//tyhjennetään näppäinpuskuri ettei edellinen enterin painallus poistu suoraan seuraavastakin loopista
ClearKeys
//nollataan input seuraavaa kyselyä varten
CloseInput
aa#=yy*0.01+1.0 // lasketaan prosenttikerroin
bb#=aa^zz //nostetaan prosenttikerroin potenssiin
vastaus#=bb*xx //lasketaan vastaus
ClearKeys
AddText "Vastaus on: " + vastaus
AddText ""
AddText "paina enter palataksesi päävalikkoon"
Repeat
If KeyHit (28)
ClearText
Return
EndIf
DrawScreen
Forever
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 8:15 pm
by Geewilliam
Huoh, heti perään täällä, tuli koodissa uusi ongelma vastaan. Kun luen tiedostosta, cb pyöristää sieltä tulleen luvun lähimpään kokonaislukuun.
Eli, kun tiedostossa lukee vain "14.74", cb lukee sen ja tulostaa "15".
Code: Select all
x=OpenToRead("tiedosto") //tässä tiedostossa ei siis ole muuta, kuin yksi desimaali luku, esim. 14.74
c=Float(ReadLine(x))
Text 10,10,c
CloseFile x
DrawScreen
WaitKey
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 8:24 pm
by Peltsi
Geewilliam wrote:Huoh, heti perään täällä, tuli koodissa uusi ongelma vastaan. Kun luen tiedostosta, cb pyöristää sieltä tulleen luvun lähimpään kokonaislukuun.
Eli, kun tiedostossa lukee vain "14.74", cb lukee sen ja tulostaa "15".
Code: Select all
x=OpenToRead("tiedosto") //tässä tiedostossa ei siis ole muuta, kuin yksi desimaali luku, esim. 14.74
c=Float(ReadLine(x))
Text 10,10,c
CloseFile x
DrawScreen
WaitKey
Käytä ReadFloat komentoa ReadLinen sijaan, sekä muuttuja c kannattaa olla c# (risuaita on kertoo cb:lle että muuttuja sisältää desimaaliluvun).
Re: Tyhmät kysymykset (I/2011)
Posted: Tue Sep 13, 2011 8:32 pm
by Geewilliam
Kun laitoin readline, se heitti nolla. Muutin muutujan desimaalimuuttujaksi (oli unohtunut aikaisemmin) ja sit se heitti jotian ihan outoa. Sit vaihdoin sen takaisin readfloatiksi, ja städäm, toimii. Ongelma siis oli muuttujan väärässä tyypissä. (c# olisi ollut oikea, eikä c) Ei voinut tuota muistaa, kun muualla en ole joutunut muuttujaa mitenkään määrittelemään. =P
e. Sekoilen taas tekstissä. laitoin siis readfloatiksi ja sit takas readlineksi.
Re: Tyhmät kysymykset (I/2011)
Posted: Wed Sep 14, 2011 4:16 pm
by Geewilliam
Hmh, ärsyttää, mutta pommitan lisää erittäin tyhmillä kysymyksillä.
Saanko if-lauseeseen ehdon "if x= >1 and <maara then...". Eli siis, jos x on suurempi, kuin 1 ja pienempi kuin muutuja maara. Tai olisiko joku hyvä keino saada jollain muulla komennolla? Tarkoitus siis saada tekemään jotain, kun/jos x on jokin luku 1-maara, jos ei, kysytään uudestaan tai tulee valitus. (Esim. while- voisi olla hyvä, että kysytään kunnes luku on 1-maara.)
EDIT:ahhah, en laittanut siihen toiseen x_x. Kiitos!