17&4

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
benpicco
Beiträge: 391
Registriert: 01.10.2004 15:32
Wohnort: im Code
Kontaktdaten:

17&4

Beitrag 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.
Zuletzt geändert von benpicco am 18.08.2005 16:35, insgesamt 3-mal geändert.
Johann Wolfgang von Geothe hat geschrieben:Wie dieses oder jenes Wort geschrieben wird, darauf kommt es doch eigentlich nicht an, sondern darauf, daß die Leser verstehen, was man damit sagen wollte.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag 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!
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag von R4z0r1989 »

ich will ja echt nicht spammen aber ich krieg nicht mal ne antwort!!!

Schöne communtity
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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"
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
redacid
Beiträge: 581
Registriert: 29.08.2004 17:06

Beitrag 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....
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Aus deinem Post wird mir nicht mal klar was du eigentlich haben möchtest, Badboy99
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
Hygge
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag 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 
Zuletzt geändert von crossroads am 25.07.2005 18:18, insgesamt 1-mal geändert.
Man soll die Tür aufmachen, bevor man durchgeht ...
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag 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.
Antworten