Seite 1 von 3

17&4

Verfasst: 11.07.2005 20:09
von benpicco
Nachdem mir heute erklärt wurde wie 17&4 funktioniert hab ich gedacht, das sowas doch ganz einfach mit PureBasic zu machen wäre.
War es auch, naja, hier ist sozusagen das ergebniss (ok, es ist irgendwie öde...)
edit: Grafik geupdatet, Danke an Rings für die Windowskartenfunktion

Code: Alles auswählen

Global budget.l
Global kartenwert.b
Global newround.b
budget=1000
newround=1
Enumeration
  #neuekarte
  #fertig
  #einsatz
  #ok
  #budget
  #text
  #thanks
EndEnumeration
#WindowWidth=400
#windowHeight=300
Structure karte
  wert.b
  name.s
  state.b
  Sprite.b
EndStructure

Structure hand
  wert.b
  name.s
  Sprite.b
EndStructure
Dim karten.karte(52)
NewList hand.hand()
Procedure.s farbe(farbe)
  Select farbe
    Case 1
      farbreturn.s="Kreuz"
    Case 2 
      farbreturn.s="Karo"
    Case 3
      farbreturn.s="Herz"
    Case 4
      farbreturn.s="Piek"
  EndSelect
  ProcedureReturn farbreturn
EndProcedure
Procedure zieh()
  rezieh:
  karte=Random(51)+1
  If karten(karte)\state=0
    Goto rezieh
  EndIf
  ResetList(hand())
  AddElement(hand())
  hand()\name=karten(karte)\name
  hand()\wert=karten(karte)\wert
  hand()\Sprite=karten(karte)\Sprite
  karten(karte)\state=0
  ;DeleteElement(karten())
  num=0
EndProcedure
For kart=1 To 13
  For farb=1 To 4
  
  
    
    Select kart
      Case 1
        karten(num)\wert=11
        karten(num)\name=farbe(farb)+" "+"Ass"
      Case 11
        karten(num)\wert=10
        karten(num)\name=farbe(farb)+" "+"Bube"
      Case 12
        karten(num)\wert=10
        karten(num)\name=farbe(farb)+" "+"Dame"
      Case 13
        karten(num)\wert=10
        karten(num)\name=farbe(farb)+" "+"König"
      Default
        karten(num)\wert=kart
        karten(num)\name=farbe(farb)+" "+Str(kart)
    EndSelect
    karten(num)\state=1
    karten(num)\Sprite=num
    num+1
  Next
Next
Procedure CardDraw(hdc,NR,x,y,X2,Y2) 
  result=OpenLibrary(1,"cards.dll") 
  If result 
    cdtInit=IsFunction(1,"cdtInit") 
    cdtDrawExt=IsFunction(1,"cdtDrawExt") 
    cdtTerm=IsFunction(1,"cdtTerm") 
  EndIf 
  result=CallFunctionFast(cdtInit,@w,@h) 
  result=CallFunctionFast(cdtDrawExt,hdc,x,y,X2,Y2,NR,0,0) 
  result= CallFunctionFast(cdtTerm) 
  CloseLibrary(1) 
EndProcedure 
OpenWindow(1,100,100,#WindowWidth,#windowHeight,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget,"17&4")
;OpenWindowedScreen(WindowID(),0,0,300,200,1,0,0)
 


CreateGadgetList(WindowID())
ButtonGadget(#neuekarte,10,#windowHeight-20,100,20,"Noch eine Karte")
ButtonGadget(#fertig, 110,#windowHeight-20,50,20,"Fertig")
ButtonGadget(#ok,250,#windowHeight-20,40,20,"OK")
StringGadget(#budget,#WindowWidth-100,10,100,20,Str(budget),#PB_String_ReadOnly|#PB_String_LowerCase)
SpinGadget(#einsatz,200,#windowHeight-20,50,20,1,19999)
TextGadget(#text,160,#windowHeight-20,75,20,"Einsatz:")
SetGadgetState(#einsatz,10)
DisableGadget(#neuekarte,1)
DisableGadget(#fertig,1)
DisableGadget(#einsatz,1)
TextGadget(#thanks,100,#windowHeight+2,300,15,"BenpiccoSoft 2005, special Thanks to Rings")
LoadFont(1,"Old English Text MT",16)
LoadFont(0,"Times New Roman",14)
Procedure newround(message$,win)
  StartDrawing(WindowOutput())
  Box(150,100,100,15,RGB($DB,$E0,$1))
  DrawingMode(1)
  Locate(150,200)
  FrontColor(255,10,10)
  DrawingFont(UseFont(1))
  DrawText(message$)
  ;Box(0,0,WindowWidth(),WindowHeight(),RGB($DB,$E0,$1))
  StopDrawing()
  DisableGadget(#fertig,1)
  DisableGadget(#neuekarte,1)
  budget=budget+GetGadgetState(#einsatz)*win
  DisableGadget(#ok,0)
  newround=1
  ClearList(hand())
  kartenwert=0
  For x=1 To 52
    karten(x)\state=1
  Next
  ClearList(hand())
  If win>1
    For x=1 To 3
      beep_(150*x,100)
    Next
  ElseIf win<=0
    For x=3 To 1 Step-1
      beep_(150*x,100)
    Next  
  ElseIf win=1
    beep_(100,100) 
  EndIf
  StartDrawing(WindowOutput())
  Locate(100,100)
  DrawingFont(UseFont(0))
  DrawText("Drücken Sie OK um fortzufahren")
  StopDrawing()
  
EndProcedure
Repeat
  Delay(10)
  x=0
  Redraw-1
  If Redraw<1
    Redraw=100
  hdc.l = StartDrawing(WindowOutput()) 
  ;For card=0 To 51
  ;  CardDraw(hdc,karten(card)\Sprite,10+(card*30),10,80,100) 
  ;Next
  DrawingMode(1)
  ForEach hand()
    x+1 
    ;Debug hand()\name
    CardDraw(hdc,hand()\Sprite,10,15*x,80,100) 
    Locate(10,15*x+100)
    DrawText("Gesamt:"+Str(kartenwert))
  Next
  StopDrawing()
EndIf

  Event = WaitWindowEvent()
  If budget<=0
    Goto blank:
  EndIf
  
  If kartenwert>21
   newround("Verloren!",-1)
  ElseIf kartenwert=21
    newround("Gewonnen!",2)
  EndIf
  If Event = #PB_EventGadget
    GadgetID = EventGadgetID()
    
  If GadgetID=#neuekarte
    zieh()
    Redraw=0


    
  ElseIf GadgetID=#fertig
    ClearList(hand())
    wert=1
    zieh=0
    Repeat 
      
      zieh()
      ResetList(hand())
      NextElement(hand())
      wert+hand()\wert
      zieh+1    
      hdc=StartDrawing(WindowOutput())
      CardDraw(hdc,hand()\Sprite,100,15*zieh,80,100)
      StopDrawing()
      Delay(500)
      If wert>21
        newround("Verloren!",-1)
        Goto gewinn
      EndIf
    Until wert >16 Or zieh>4 Or Random(budget)=1 
    If wert>21
      newround("Verloren!",-1)
      Goto gewinn
    EndIf
      If wert>kartenwert
        newround("Verloren!",-1)
      ElseIf wert<kartenwert
        newround("Gewonnen!",2)
      ElseIf wert=kartenwert
        newround("Unentschieden...",1)
      EndIf
      gewinn:
      
  ElseIf GadgetID=#einsatz And GetGadgetState(#einsatz)>budget
   
      SetGadgetState(#einsatz,budget)
   
    ElseIf GadgetID=#ok And newround=1
      StartDrawing(WindowOutput())
      DrawingFont(UseFont(0))
      Box(100,100,TextLength("Drücken Sie OK um fortzufahren"),16,RGB(255,255,255))
      Locate(100,100)
      DrawText("Ihren Einsatz bitte.")
      StopDrawing()
        newround=0
        DisableGadget(#einsatz,0)

      ElseIf GadgetID=#ok And newround=0
        StartDrawing(WindowOutput())
        Box(0,0,#WindowWidth-110,#windowHeight-30,RGB($DB,$E0,$1))
        StopDrawing()
        Redraw=1
    DisableGadget(#einsatz,1)
    DisableGadget(#ok,1)
    DisableGadget(#neuekarte,0)
    DisableGadget(#fertig,0)
    For x=1 To 2
      zieh()
    Next
  EndIf
  
  SetGadgetText(#budget,Str(budget))
  SetGadgetText(#einsatz,Str(GetGadgetState(#einsatz)))
  StartDrawing(WindowOutput())
  Box(10,15,200,15*CountList(hand()),RGB($DB,$E0,$1))
  DrawingMode(1)
  ResetList(hand())
  x=0
  kartenwert=0
  While NextElement(hand())
    x+1
    Locate(10,15*x)
    ;DrawText("Test")
    DrawText(hand()\name)
    kartenwert=kartenwert+hand()\wert
  Wend
  ;Locate(100,150)
  ;Box(100,150,100,20,RGB($DB,$E0,$1))
  
  StopDrawing()
    
EndIf

  
Until Event = #PB_EventCloseWindow
End
blank:
MessageRequester("Blank","Du bist blank!")
End
Eine kleine Erklärung:
Das Ding in der Mitte ist das Feld für den Einsatz (ich weiß, das ginge schöner...), naja, dann bekommt man die karten, Ziel des Spiels ist es, 21 Punkte zu erreichen, tut man das, hat man gewonnen (z.b. ein Ass (11) und ein König (10), oder Eine 7 eine 10 und eine 4)
man drückt solange auf "Noch eine karte" bis man glaubt, es seie gut (hat man über 21, hat man verloren). Dann auf "Fertig" Jetzt versucht der Computer (der die bank spielt) eine höhere Punktzahl zu erreichen (er weiß nichts von der Spielerpunktzahl). Geingt ihm das, verliert man den einsatz, anderenfalls hat man das doppelte gewonnen.
Achso, das oben rechts ist das Geld, das man hat.

Verfasst: 24.07.2005 00:27
von R4z0r1989
GIbt es jetzt scho a verbesserung womit man die Karten sieht
die idee ist nämlich echt gut.
aber ich möchte es verbessern(bin aber noch anfänger).
aber das mit den karten schaf ich net.

Dank im voraus!

Verfasst: 25.07.2005 17:04
von R4z0r1989
ich will ja echt nicht spammen aber ich krieg nicht mal ne antwort!!!

Schöne communtity

Verfasst: 25.07.2005 17:30
von bluejoke
Man, du hast absolut kein Recht auf eine Antwort.
Wenn dir keiner Hilfe geben mag, oder nicht kann, dann hast du Pech gehabt.

Windows liefert, soviel ich weiß, eine DLL mit, mit deren Hilfe man Karten anzeigen lassen kann. Den Rest kannst du ja wohl selbst rausfinden. Und diesmal bitte kein "Link please"

Verfasst: 25.07.2005 17:32
von redacid
Badboy99 hat geschrieben:ich will ja echt nicht spammen aber ich krieg nicht mal ne antwort!!!
Soll vorkommen...

Was willst du denn genau? Woran scheitert es bei dir? Zeig doch mal, wie weit du schon gekommen bist.

Schöne communtity
finde ich auch. :D

PS: ist die "99" in deinem Nicknamen dein Geburtsjahr? Das würde deinen Ton entschuldigen....

Verfasst: 25.07.2005 17:38
von MVXA
Aus deinem Post wird mir nicht mal klar was du eigentlich haben möchtest, Badboy99

Verfasst: 25.07.2005 17:38
von Kiffi
Badboy99 hat geschrieben:ich will ja echt nicht spammen aber ich krieg nicht mal ne antwort!!!
auf welche Frage denn? Etwa auf:
Badboy99 hat geschrieben:aber ich möchte es verbessern(bin aber noch anfänger).
aber das mit den karten schaf ich net.
?

tscha, die Tatsache, dass Du hier keine Antwort bekommst, könnte daran
liegen, dass Du Dein Problem ein wenig zu unscharf formulierst.

Geh' nochmal in Dich, überlege, was Du genau nicht schaffst, verpacke
das ganze in einer netten Anfrage und dann können wir noch mal
überlegen, ob wir eine Lösung für Dich haben.

Aber bedenke: Eine Antwortgarantie gibt's hier nicht!

Grüße ... Kiffi

Verfasst: 25.07.2005 18:06
von crossroads
Ich habe den Code leicht verändert - alle Prozeduren nach oben, die GOTO-Befehle ersetzt, den "OK"-Button verschoben.
Man sollte auf jeden Fall vermeiden, direkt ins Fenster zu malen; nach gewonnen/verloren verschwinden sonst die Gadgets ganz oder teilweise und kommen erst wieder zum Vorschein,, wenn man auf einen blind draufklickt.
Versuch mal, einen "windowed screen" zu öffnen und dort alle gezeichneten Aktionen reinzupacken.
Siehe dazu in der Hilfe unter OpenWindowedScreen()

Code: Alles auswählen

InitSprite() 
Global budget.l 
Global kartenwert.b 
budget=1000 

Enumeration 
  #neuekarte 
  #fertig 
  #einsatz 
  #ok 
  #budget 
EndEnumeration 

Structure karte 
  wert.b 
  name.s 
  state.b 
EndStructure 

Structure hand 
  wert.b 
  name.s 
EndStructure 

Dim karten.karte(52) 
NewList hand.hand() 

Procedure.s farbe(farbe) 
  Select farbe 
    Case 1 
      farbreturn.s="Pik" 
    Case 2 
      farbreturn.s="Kreuz" 
    Case 3 
      farbreturn.s="Karo" 
    Case 4 
      farbreturn.s="Herz" 
  EndSelect 
  ProcedureReturn farbreturn 
EndProcedure 

Procedure zieh() 
  Repeat
    karte=Random(51)+1 
  Until karten(karte)\state <> 0
  ResetList(hand()) 
  AddElement(hand()) 
  hand()\name=karten(karte)\name 
  hand()\wert=karten(karte)\wert 
  karten(karte)\state=0 
EndProcedure 

Procedure verlier() 
  StartDrawing(WindowOutput()) 
  DrawingMode(1) 
  Locate(150,100) 
  FrontColor(255,10,10) 
  DrawText("Verloren") 
  Box(0,0,WindowWidth(),WindowHeight(),RGB($DB,$E0,$1)) 
  StopDrawing() 
  DisableGadget(#fertig,1) 
  DisableGadget(#neuekarte,1) 
  budget=budget-GetGadgetState(#einsatz) 
  DisableGadget(#ok,0) 
  DisableGadget(#einsatz,0) 
  ClearList(hand()) 
  kartenwert=0 
  For x=1 To 52 
    karten(x)\state=1 
  Next 
  ClearList(hand()) 
  MessageRequester("Verloren!","Verloren!") 
EndProcedure 

Procedure gewinn() 
  StartDrawing(WindowOutput()) 
  Box(150,100,100,15,RGB($DB,$E0,$1)) 
  DrawingMode(1) 
  Locate(150,100) 
  FrontColor(255,10,10) 
  DrawText("Gewonnen!") 
  Box(0,0,WindowWidth(),WindowHeight(),RGB($DB,$E0,$1)) 
  StopDrawing() 
  DisableGadget(#fertig,1) 
  DisableGadget(#neuekarte,1) 
  budget=budget+GetGadgetState(#einsatz)*2 
  DisableGadget(#ok,0) 
  DisableGadget(#einsatz,0) 
  ClearList(hand()) 
  kartenwert=0 
  For x=1 To 52 
    karten(x)\state=1 
  Next 
  ClearList(hand()) 
  MessageRequester("Gewonnen!","Gewonnen!") 
EndProcedure 

For farb=1 To 4 
  For kart=1 To 13 
    num+1 
    Select kart 
      Case 1 
        karten(num)\wert=11 
        karten(num)\name=farbe(farb)+" Ass" 
      Case 11 
        karten(num)\wert=10 
        karten(num)\name=farbe(farb)+" Bube" 
      Case 12 
        karten(num)\wert=10 
        karten(num)\name=farbe(farb)+" Dame" 
      Case 13 
        karten(num)\wert=10 
        karten(num)\name=farbe(farb)+" König" 
      Default 
        karten(num)\wert=kart 
        karten(num)\name=farbe(farb)+" "+Str(kart) 
    EndSelect 
    karten(num)\state=1 
  Next 
Next 
;For x=1 To 52 
  ;Debug karten(x)\name + " Wert:"+Str(karten(x)\wert) 
;Next 
 

OpenWindow(1,100,100,300,200,#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered,"17&4") 
CreateGadgetList(WindowID()) 
ButtonGadget(#neuekarte,10,170,100,20,"Noch eine Karte") 
ButtonGadget(#fertig, 150,170,50,20,"Fertig") 
ButtonGadget(#ok,160,100,40,20,"OK") 
StringGadget(#budget,260,10,100,20,Str(budget),#PB_String_ReadOnly|#PB_String_LowerCase) 
SpinGadget(#einsatz,100,100,50,20,1,19999) 
SetGadgetState(#einsatz,10) 
DisableGadget(#neuekarte,1) 
DisableGadget(#fertig,1) 

Repeat 
  Event = WaitWindowEvent()
  If budget<=0 
    MessageRequester("Blank","Du bist blank!") 
    End 
  EndIf 
  
  If kartenwert>21 
    verlier() 
  ElseIf kartenwert=21 
    gewinn() 
  EndIf 
  If Event = #PB_EventGadget 
    GadgetID = EventGadgetID() 
    StartDrawing(WindowOutput()) 
    ;Box(0,0,WindowWidth(),WindowHeight(),RGB($DB,$E0,$1)) 
    StopDrawing()      
    If GadgetID=#neuekarte 
      zieh() 
 
    ElseIf GadgetID=#fertig 
      ClearList(hand()) 
      wert=1 
      zieh=0 
      Repeat 
        zieh() 
        ResetList(hand()) 
        NextElement(hand()) 
        wert+hand()\wert 
        zieh+1    
        StartDrawing(WindowOutput()) 
        DrawingMode(1) 
        Locate(100,15*zieh) 
        DrawText(hand()\name) 
        StopDrawing() 
        Delay(500) 
        If wert>21 
          Break 
        EndIf 
      Until wert >16 Or zieh>4 Or Random(budget)=1 
      If wert>21 
        verlier() 
      ElseIf wert>kartenwert 
        verlier() 
      ElseIf wert<kartenwert 
        gewinn() 
      EndIf 
      
    ElseIf GadgetID=#einsatz And GetGadgetState(#einsatz)>budget 
      
      SetGadgetState(#einsatz,budget) 
      
    ElseIf GadgetID=#ok 
      DisableGadget(#einsatz,1) 
      DisableGadget(#ok,1) 
      DisableGadget(#neuekarte,0) 
      DisableGadget(#fertig,0) 
      For x=1 To 2 
        zieh() 
      Next 
    EndIf 
    
    SetGadgetText(#budget,Str(budget)) 
    SetGadgetText(#einsatz,Str(GetGadgetState(#einsatz))) 
    StartDrawing(WindowOutput()) 
    Box(10,15,200,15*CountList(hand()),RGB($DB,$E0,$1)) 
    DrawingMode(1) 
    ResetList(hand()) 
    x=0 
    kartenwert=0 
    While NextElement(hand()) 
      x+1 
      Locate(10,15*x) 
      DrawText(hand()\name) 
      kartenwert=kartenwert+hand()\wert 
    Wend 
    Locate(100,150) 
    Box(100,150,100,20,RGB($DB,$E0,$1)) 
    DrawText("Gesamt:"+Str(kartenwert)) 
    StopDrawing()  
  EndIf 
 
Until Event = #PB_EventCloseWindow 
End 

Verfasst: 25.07.2005 18:12
von DarkDragon
Badboy99 hat geschrieben:GIbt es jetzt scho a verbesserung womit man die Karten sieht
die idee ist nämlich echt gut.
aber ich möchte es verbessern(bin aber noch anfänger).
aber das mit den karten schaf ich net.

Dank im voraus!
[url=file:///C:%5CWINDOWS%5Csystem32%5Ccards.dll]Link1[/url]
Link2

Verfasst: 25.07.2005 22:39
von R4z0r1989
danke für die vielen antworten.
Aber mein Problem ist das bei mir warum auch immer , die Karten net angezeigt werden.
Also es steht bei meinen Karten nix da.
Ich muss Praktisch raten.
Und das ist ums erlich zu sagen scheise.
und beim 2. mal wird alles gelb,
also mein ganzes Fenster!!!

Danke im Voraus!!!

PS: Sorry das ich so ausgerastet bin.