spr-spel

Cursussen, tutorials
Plaats hier uw bijdrage.

spr-spel

Berichtdoor ForNext » do apr 28, 2011 2:12 pm

In het kader van de huiswerkopdracht heb ik een variant (zie bijlage zip.file) vervaardigd.

Het probleem waar ik tegenaan liep, was dat ik bij een 2e poging (door op een andere keuzeknop te drukken) wel een nieuwe afbeelding in het vak keuze speler krijg, maar dat ik de (oude?) afbeelding uit het vak keuze computer niet weg krijg. Deze afbeelding wordt wel keurig vervangen door de nieuwe afbeelding.
Om het probleempje te tackelen, heb ik er een knop "opnieuw" bijgemaakt, waardoor het programma weer opnieuw gaat draaien en dus alles schoonveegt. Maar ik ben niet tevreden met deze grove oplossing.
Hoe kan het simpeler?

Ciao,
Roberto.
Bijlagen
spr-game.zip
(26.49 KiB) 161 keer gedownload
Cursist LB Amstelveen
ForNext
 
Berichten: 60
Geregistreerd: za okt 27, 2007 9:40 am
Woonplaats: Amstelveen

Re: spr-spel

Berichtdoor Gordon » do apr 28, 2011 10:00 pm

Hallo Roberto,

Prima spel en goede listing.
Ik heb het even druk met het Amerikaanse contest
(de helpfile verbeteren)

Misschien kun je een zwart plaatje (of boxfilled black) op de plek
waar het plaatje van de computer staat plaatsen?

Super...

Gordon
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Re: spr-spel

Berichtdoor glpape » zo mei 01, 2011 3:39 pm

Roberto hallo,

Prachtig mooi venster. De spelregels begrijp ik niet erg maar als ik speel zie ik dat ik regelmatig win en dat maakt alles goed.

Ik had willen antwoorden hoe je alle plaatjes, lijnen, zelfs een enkel punt in een grafisch venster kunt vastleggen in individuele segmenten en die stuk voor stuk kunt wissen met < delsegment > of weer tevoorschijn halen met < redraw > ; zelf had ik daar de afgelopen tijd nogal naar gekeken. Maar Gordon's idee van een zwarte rechthoek is beter, want met <delsegment > heb je altijd redraw nodig en het beeld flikkert dan even.

Maar toen ik naar je code keek had ik nog wat andere vragen.
In de sub shortPause disable en enable je steeds #g. Ik moest even denken, maar nu begrijp ik dat dat moet zijn om te voorkomen dat je op een knop drukt terwijl je in de sub zit en dan op foute wijze de < while . . . wnd > loop uitgaat. Ik denk dat je dan de buttons moet dis-abelen. Lijkt me dat je ze pas weer hoeft te en-abelen als het spel is gespeeld, als de progress bar dus teneinde is en het tweede plaatje is getekend. Ik heb dat in je code geprobeerd en in het [go] blok worden de buttons inactief gemaakt. Hier heb ik ook Gordon's zwarte blokken geplaatst.
De buttons worden blijkbaar bliksemssnel dis-abled, als je nu per ongelukt dubbel-klikt krijg je niet de error messages. En zolang de progress bar loopt is er steeds geen control input mogelijk en dus weer geen error message.
< SetFocus > ken ik alleen als een commando voor keyboard input; als je met de muis werkt is het irrelevant denk ik, als je met een muis op een control klikt wordt die door Windows ge-activeerd. Ik heb de setfocus-sen weggehaald en ik miste ze niet.
Hier de listing met mijn suggesties. De heel strakke systematiek die erin zat heb ik niet helemaal kunnen handhaven ! Ik heb ook nog een korte pauze gemaakt als een nieuwe speel-ronde begint, waarin alle hokjes even zwart en leeg zijn. Dit is alleen de .bas file zonder de .bmp's.

Code: Selecteer alles
REM    based on 3_items scissors 10.bas
       nomainwin

       loadbmp "bmp1","scissors.bmp"
       loadbmp "bmp2","paper.bmp"
       loadbmp "bmp3","rock.bmp"

[weer] bmpbutton #g.ba, "scissors.bmp", [bmp1], UL, 050,040
       bmpbutton #g.bb, "paper.bmp",    [bmp2], UL, 050,160
       bmpbutton #g.bc, "rock.bmp",     [bmp3], UL, 050,280

'      button #g.bt, "Opnieuw", [opnw], UL, 438,310

       WindowWidth = 600 : WindowHeight = 430
       UpperLeftX=int((DisplayWidth-WindowWidth)/2)
       UpperLeftY=int((DisplayHeight-WindowHeight)/2)

       graphicbox #g.bx 200,210,324,026

       t$ = space$(8); "Maak een keuze en klik op afbeelding 1, 2 of 3"
       Open t$ for graphics_nsb_nf as #g         '  - - - - - - - - - -
       #g "trapclose [quit]"
       #g "fill black"
       #g "backcolor black"
       #g "color white"
       #g "font arial 12 bold"
       #g.bx "backcolor 150 255 45"
       #g.bx "down"

       #g "place 030 030 ; down ;| 1. Schaar"
       #g "place 030 150 ; down ;| 2. Papier"
       #g "place 030 270 ; down ;| 3. Steen"
       #g "place 200 030 ; down ;| keuze Speler"
       #g "place 390 030 ; down ;| keuze Computer"

       #g "place 200 040; box 330, 170"
       #g "place 390 040; box 520, 170"
       #g "place 200 360; box 400, 280"
       #g "place 420 360; box 520, 280"
       #g "flush"
       wait

[bmp1]'#g "setfocus"
      '#g "drawbmp bmp1 220, 060"
      'q1 = 1  :  goto [pbar]
       q1 = 1  :  goto [go]

[bmp2] q1 = 2  :  goto [go]

[bmp3] q1 = 3  :  goto [go]

[go]   #g.ba "disable"  :  #g.bb "disable"  :  #g.bc "disable"
       #g "place 210  50; color black; boxfilled 320 160             "    ' UL box
       #g "place 400  50;              boxfilled 510 160             "    ' UR box
       #g "place 210 350;              boxfilled 390 290; color white"    ' LL box
           timer 500, [continue] : wait
           [continue]
           timer 0
       #g "drawbmp bmp"; q1; " 220, 060"

[pbar] #g.bx "cls"
       while x < 326
       #g.bx "boxfilled "; x; " 26"
       call shortPause
       x = x+3
       wend
       x = 0
       goto [quiz]

       sub shortPause
       '   #g "disable"
           timer 10, [cont] : wait
           [cont]
           timer 0
       '   #g "enable"
           end sub

[quiz] q2 = int(rnd(0)*3)+1

       if q2 = 1 then
       '  #g "setfocus"
          #g "drawbmp bmp1 410, 060"
       end if

       if q2 = 2 then  #g "drawbmp bmp2 410, 060"

       if q2 = 3 then  #g "drawbmp bmp3 410, 060"

       select case
              case q1 = 1 and q2 = 2
                   #g "place 230 324"
                   #g "| speler wint  "

              case q1 = 1 and q2 = 3
                   #g "place 230 324"
                   #g "| computer wint"

              case q1 = 2 and q2 = 1
                   #g "place 230 324"
                   #g "| computer wint"

              case q1 = 2 and q2 = 3
                   #g "place 230 324"
                   #g "| speler wint  "

              case q1 = 3 and q2 = 1
                   #g "place 230 324"
                   #g "| speler wint  "

              case q1 = 3 and q2 = 2
                   #g "place 230 324"
                   #g "| computer wint"

              case q1 = q2
                   #g "place 230 324"
                   #g "| gelijkspel   "
       end select
       #g.ba "enable" : #g.bb "enable" : #g.bc "enable"
       wait

' [opnw] close #g
'        goto [weer]

[quit] unloadbmp "bmp1"
       unloadbmp "bmp2"
       unloadbmp "bmp3"
       close #g  :  end



Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm

Re: spr-spel

Berichtdoor ForNext » ma mei 02, 2011 6:27 pm

Beste George,

Hartelijk dank voor je fijne reactie.
Ook ik was al in de weer geweest met “delsegment” en “redraw”, maar het onrustige beeld kon ook mij niet bekoren. Vandaar ook dat ik met het knipperende beeld als gevolg van de knop “opnieuw” naar het forum en Gordon ben gegaan voor een betere oplossing.
Een “black.bmp” had ik ook al klaar staan, maar zodra ik die er succesvol in plaatste, kreeg ik hem er niet meer uit. En dus kwam de keuze (bmp) van de computer achter die black.bmp te staan. Daarom staan al die “setfocus”-sen overal tussendoor als een wanhoopspoging die keuze zichtbaar te krijgen.

Die truc met “t$=space$(8);” kende ik nog niet. Maar nu ik weet – even de helpfile geraadpleegd – hoe het werkt, heb ik van die (8) zelfs (10) gemaakt. Lijnt nog mooier uit. En dat zie ik graag.

Nogmaals hartelijk dank voor al je (overige) verbeteringen.

Voor een goed begrip van de spelregels, bijgaand een vele malen simpeler uitgevoerde versie van “5-items” waarin de onderlinge relaties staan afgebeeld.

Ciao,
Roberto
Bijlagen
5-items.zip
(27.92 KiB) 156 keer gedownload
Cursist LB Amstelveen
ForNext
 
Berichten: 60
Geregistreerd: za okt 27, 2007 9:40 am
Woonplaats: Amstelveen

Re: spr-spel

Berichtdoor glpape » vr mei 06, 2011 4:31 pm

Roberto hallo,

Ik gebruikte t$ om de lenge te beperken van de regel die het venster opende.
Je kunt space$() en chr$(13) ook gewoon in het commando zetten.

Hier een voorbeeld :

Code: Selecteer alles
REM  03052011 demonstrates use of space$() with  <input>
'    needs function : cr$()  en sub : Pause , SetWdw .


calldll #user32, "GetActiveWindow", hmain as ulong
mainwin 60 16

call SetWdw 250, 100, 550, 300
open  space$(36); "Dit"; space$(24); "Venster" for window as #WW              ' ja
#WW "trapclose [qq]"

call Pause 3000
calldll #user32, "SetActiveWindow", hmain as ulong, rtn as boolean
print

' input space$(12); "Press  < Enter >  to Continue : "; aa                    ' nee
input ""; space$(12); "Press  < Enter >  to Continue : "; aa                  ' ja

print cr$(2); space$(24); "Centered"                                          ' ja

' input cr$(5); space$(9); "And  < Enter >  to Close both Windows : "; aa     ' nee
input ""; cr$(5); space$(9); "Now  < Enter >  to Close both Windows : "; aa   ' ja

[qq]
close #WW
if hmain then calldll #user32, "PostMessageA", hmain as ulong, _
              _WM_CLOSE as long, 0 as long, 0 as long, rtn as boolean
end


sub SetWdw a,b,c,d                          ' sets ULX, etc
UpperLeftX = a
UpperLeftY = b
WindowWidth = c
WindowHeight = d
end sub

sub Pause pp                                ' pause in milliseconds
tt = time$("ms") : dd = date$("days")
while  time$("ms") + 3600*24*1000*k  < tt + pp
k = date$("days") - dd
wend
end sub

function cr$(k)                             ' Gives k carriage returns [chr$(13)]
   for i = 1 to k
   cr$ = cr$; chr$(13)
   next i
end function

function crlf$(k)                           ' Gives k carriage returns + line feeds [chr$(13)+chr$(10)]
   for i = 1 to k
   crlf$ =  crlf$; chr$(13); chr$(10)
   next i
end function


Liberty is niet helemaal consequent in z'n syntax. De functies werken ook in print, in multiline buttons (_BS_MULTINLINE) en multiline textboxes (_ES_MULTILINE, verwijder _ES_AUTOHSCROLL) en in static text (is standaard multiline met wordwrap, zoals ik pas onlangs ontdekte), maar de textbox wil, afwijkend, CR + LF [chr$(13)+chr$(10)]. Eigenlijk lijkt CR (=naar begin regel) + LF (= nieuwe regel) me altijd het juiste commando maar ik zoek graag de kortste vorm die werkt om te lange regels te vermijden.
Afwijkend is ook input: daar werken de functie niet als eerste argment van het commande, maar wel na een initiele string, en dat mag een lege string zijn.

Ik heb de functies ook wel gebruikt om hoogte en breedte en textpositie van dialogs (prompt, notice) te be-invloeden.

Vr groet,

George Pape.
glpape
 
Berichten: 83
Geregistreerd: za nov 08, 2008 5:32 pm


Keer terug naar Leren programmeren met Liberty BASIC

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron