[Hilfe] Card Game

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen

 

Snowdragon

Betreff: [Hilfe] Card Game

BeitragSa, Mai 17, 2014 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community!

Nachdem ich mich nun einige Jahre lang mit HTML und PHP beschäftigt habe und ein wenig in der Programmierung von Mikrocontrollern, suche ich nach etwas Neuem.

Ich würde gerne ein eigenes Kartenspiel programmieren (auf 2D-Basis) und Grafiken etc. sind kein Problem, erstelle ich mit links. Momentan arbeite ich einige Tutorials durch, was mir eigentlich keine großen Schwierigkeiten durch meine Vorkenntnisse bereitet.

Allerdings sind es momentan wirklich nur die Basics und deshalb wollte ich fragen, ob jemand eventuell einen Code hat oder einen Tipp, wo ich einen finden kann (egal) welches Kartenspiel. Ich will mir erstmal einen Überblick verschaffen und gucken wie sich was am besten umsetzen lässt.

Über eure Hilfe würde ich mich sehr freuen! Wink

Xeres

Moderator

BeitragSa, Mai 17, 2014 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wozu willst du fertigen Code, wenn programmieren für dich kein Problem darstellt?
Wenn du dein Problem genauer beschreibst, oder ein Code Ausschnitt hast, der dir fragwürdig erscheint, wirst du gewiss genug Hinweise erhalten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Snowdragon

BeitragSa, Mai 17, 2014 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow ich weiß nicht ob das was ich da geschrieben habe irgendwie arrogant klingt oder so.

Ich habe nie geschrieben, dass mir das Programmieren keine Schwierigkeiten bereitet ... Es ging um das Designen bzw. die Grafiken. Ich habe lediglich geschrieben die Tutorials bis jetzt, stellen keine Herausforderung dar, da es wirklich nur Basic-Sachen sind wie Schleifen usw. In welchem Maße ich dann tatsächlich Ahnung habe, steht in den Sternen, weil ich nicht weiß in wie fern es meine Vorstellungen abdeckt (Zufallsverteilung von Karten und und und).

Ein Code zu irgendeinem Kartenspiel würde ich deshalb gerne haben, um zu sehen wie sich was umsetzen lässt und über Hilfe wäre ich deshalb sehr froh (und ja ich bin mir bewusst das es sehr sehr lang dauern kann).

Xeres

Moderator

BeitragSa, Mai 17, 2014 21:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe deinen Eingangspost auch nicht als arrogant empfunden.
Unabhängig von deinen Fähigkeiten halte ich fertigen Code nicht unbedingt für die sinnvollste Art, etwas zu lernen, denn dabei kann man keine Fehler machen.
Darum: Wenn du einfach anfängst (und deine Erfahrung sollte dazu reichen) wird mehr dabei herum kommen.

Mach dir einen Plan/Design Dokument/UML Diagramm von dem, was du erreichen willst, dann wird die Umsetzung in Code leichter - oder du siehst zumindest, wo du selbst nicht weiter weißt.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Snowdragon

BeitragSa, Mai 17, 2014 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich denke auch, dass beispielsweise ein Struktogramm sehr hilfreich sein wird. Aber wie gesagt ich bin gerade mehr oder weniger skeptisch, ob das so klappt wie ich es mir vorstelle. Im Vorfeld habe ich nämlich geforscht um herauszufinden welche Sprache sich dafür eignet und natürlich eigentlich so ziemlich jede.

Doch ich finde kein wirkliches Beispiel und mir fehlt einfach ein Ansatzpunkt. Mein erstes Ziel ist im Prinzip aus einem Stapel von 40 Karten 5 zufällig einem Spieler zu zuordnen. Selbstverständlich arbeite ich aber noch die Tutorials die ich finden kann ab, doch es wäre beruhigend wenn ich einfach ein Beispiel zu einem Spiel hätte - doch ich finde nicht so wirklich was.

Und vielen Dank für deine schnelle Antwort.

Holzchopf

Meisterpacker

BeitragSa, Mai 17, 2014 21:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Beim BCC #14 ging's um Kartenspiele. Die Quellcodes gehören jeweils mit zur Abgabe. Allerdings werden wohl die meisten Codes unkommentiert sein, weil beim Wettbewerb die Dateigrösse beschränkt ist. Andere (opensource) Kartenspiele in BlitzBasic sind mir nicht bekannt.

Du kannst dir alle Beiträge hier herunterladen.

Aber ich muss dich vorwarnen und Xeres zustimmen: So lehrreich, wie viele denken, ist es nicht, fremder Leute Code anzuschauen. Oft werden Tricks angewandt, die man nicht versteht und schätzt dann den Aufwand für viele Dinge völlig falsch ein, weil man nicht beachtet, dass gewisse Algorithmen nicht generisch sind und wiederum andere Dinge kaum über das Grundwissen eines Programmierers hinausgehen und man nur seine Zeit verschwendet dabei, durchzublicken, obwohl neu programmieren schneller und effizienter wäre.

MfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

Snowdragon

BeitragSa, Mai 17, 2014 21:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem Durchblicken von fremden Codes ist natürlich richtig. Das kenne ich auch noch gut vom Programmieren des Mikrocontrollers - deshalb habe ich lieber allein programmiert, weil man nicht weiß was sich der andere dabei denkt, wenn man nicht eine ausführliche Kommentierung oder ein Ablaufplan oder ähnliches hat.

Ich werde es mir aber dennoch ansehen, auch wenn es viel Zeit kostet. Vielleicht entspricht es ja auch nicht meinen Vorstellungen oder Elemente, die ich verwenden will. Jedoch vielen vielen Dank für die schnellen Antworten und würde mich freuen wenn ihr mir bei zukünftigen Fragen helfen könntet! Wink

DAK

BeitragSo, Mai 18, 2014 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
@dein konkretes Problem mit den Karten:
Eine Möglichkeit, wie du das machen kannst ist alle Karten in ein Array zu packen, das den ganzen Kartenstapel darstellt. Den mischt du dann, indem du zufällig eine bestimmte Anzahl Karten vertauscht.

Dann gehst du den Stapel von oben nach unten durch und verteilst die Karten:

Code: [AUSKLAPPEN]
Dim stapel(39)
Dim haende(4,7)

;Kartenstapel initialisieren
For i=0 to 39
    stapel(i) = i
Next

;Karten mischen
For i=0 to 200
    a = Rand(0,39)
    b = Rand(0,39)
    tmp = stapel(a)
    stapel(a) = stapel(b)
    stapel(b) = tmp
Next

;Karten zuteilen
For spielerNr=0 To 4
    For i = 0 To 7
        haende(spielerNr,i) = stapel(spielerNr*8 + i)
    Next
Next



Codes aus anderen fertigen Projekten rausholen bringt aber wirklich so gut wie nichts, da die Codes meist nicht auf dein Projekt passen. Der Code, den ich dir geschrieben habe, der würde z.B. ganz gut funktionieren für ein Spiel, wo die Spieler immer maximal 8 Karten auf der Hand haben. Wenn jeder Spieler relativ unbegrenzt viele Karten haben kann (z.B. UNO), dann würde der Code wiederum nicht so gut passen, wegen den Arrays.

Es ist wirklich besser a) dir die Sachen selbst zu überlegen und b) eher nach Konzepten als nach Code zu fragen.

Eine Sache, die doch immer wieder unter kommt ist, dass (relative) Anfänger an Codes von größeren / älteren Programmen kommen (so z.B. den Code von B+ oder Quake oder so), irgendwelche zusammengehackten Stellen (die jedes große Programm hat) finden, und die dann für echten guten Stil halten.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragSo, Mai 18, 2014 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay vielen Dank an euch alle! <3
Ihr seid die Besten!!!
 

Snowdragon

BeitragMo, Mai 19, 2014 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
So da bin ich wieder mit 2 Fragen. Wink


Meine erste Frage ist, gibt es eine Möglichkeit einen Hintergrund permanent festzulegen, ohne das er durch das Cls gelöscht wird? Weil ichs momentan nur so hinbekomme, dass der Hintergrund angezeigt wird.
Code: [AUSKLAPPEN]
Graphics 1920,1080,0,1
SetBuffer BackBuffer()
font=LoadFont("Arial",15)
SetFont font

bild = LoadImage ("Spielfeld.png")
DrawBlock bild, 0, 0


;Custom Cursor
HidePointer
img_cursor = LoadImage("cursor.png")
MidHandle img_cursor

While Not KeyHit(1)
   Cls
   ;Hier wird eben das Hintergrundbild gezeichnet - wie ich finde eine unschöne Lösung
   DrawBlock bild, 0, 0
   DrawImage img_cursor,MouseX(),MouseY()
   Flip
Wend

End


Meine zweite Frage ist folgende:
Ich weiß, das ich den Code selbst schreiben soll, aber ich habe mal an dem Programm versucht die Custom-Maus in das Main-Menu einzubinden jedoch ohne Erfolg (Code ohne mein Versuch):
Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()
font=LoadFont("Arial",15)
SetFont font

While result=0
    result=MainMenu()
    ;put these options inside the menu loop, as these
    ;return 0 - continuing the mainmenu loop.
    If result=2 Then result=Options()
    If result=3 Then result=Credits()
    Wend
If result=1 Then StartGame()
;if the result isn't 1, then it must be 4 - hence QUIT
End

Function MainMenu()
    Cls
    Text 400,50,"My Menu",1,1
    Rect 300,100,200,50,0
    Text 400,125,"Start Game",1,1
    Rect 300,200,200,50,0
    Text 400,225,"Options",1,1
    Rect 300,300,200,50,0
    Text 400,325,"Credits",1,1
    Rect 300,400,200,50,0
    Text 400,425,"Quit",1,1
    Flip
    result=0
    While result=0
        mx=MouseX():my=MouseY()
        If MouseHit(1) Then
            If RectsOverlap(300,100,200,50,mx,my,1,1) Then result = 1
            If RectsOverlap(300,200,200,50,mx,my,1,1) Then result = 2
            If RectsOverlap(300,300,200,50,mx,my,1,1) Then result = 3
            If RectsOverlap(300,400,200,40,mx,my,1,1) Then result = 4
            End If
        Wend
    Return result
    End Function

Function Options()
    Cls
    Text 400,300,"Options Screen! Any key to return to main menu",1,1
    Flip
    WaitKey()
    Return 0
    End Function

Function Credits()
    Cls
    Text 400,300,"Credits!!",1,1
    Text 400,330,"Made by BlackD",1,1
    Text 400,400,"Any key to return",1,1
    Flip
    WaitKey()
    Return 0
    End Function

Function StartGame()
    Cls
    Text 400,300,"AND you're away...",1,1
    Text 400,400,"ESC to exit",1,1
    Flip
    While Not KeyHit(1):Wend
    End
    End Function


Gibt es da etwas, das ich bei den Function berückschichtigen muss?

Xeres

Moderator

BeitragMo, Mai 19, 2014 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
zu 1)
Nein. Wenn du nicht Artefakte von irgendwelchen Objekten im Hintergrund haben willst, musst du den Hintergrund neu zeichnen - komplett.
Selbstverständlich kannst du auf Cls verzichten, wenn du sowieso ein Hintergrund füllendes Bild benutzt.


zu 2)
Dieser Code ist Mist, wirf ihn weg.
Siehe dazu: Wie kann ich Mausklicks richtig abfragen ?
Aber viel wichtiger: Eine Hauptschleife hat sich bewährt und mit mehr als einmal cls/flip macht man - vermutlich - was falsch:

BlitzBasic: [AUSKLAPPEN]
Graphics( ... )
SetBuffer BackBuffer()
Local timer = CreateTimer(60)

Repeat
Cls

;* CODE

Flip(0)
WaitTimer(timer)
Until KeyHit(1)

End


Um den Wechsel zwischen verschiedenen Modi zu machen, würde ich immer diese Konstruktion benutzen:

BlitzBasic: [AUSKLAPPEN]

Const GS_MENU%=0, GS_PLAY%=1, GS_TOD%=2, GS_HIGH%=3, GS_CRED%=4
Global GameState% = GS_MENU

;[...]

Repeat

;[...]

Select GameState
Case GS_MENU
Main_Menu()

Case GS_PLAY
Play_Game()

Case GS_TOD
Show_Death_Screen()

Case GS_HIGH
Show_Highscore()

Case GS_CRED
Show_Credits()

End Select

;[...]

Flip(0)
WaitTimer(FrameTimer)
Forever
End


;[...]

Function GetHit()
;[...]

If PlayerHP =< 0 Then
GameState = GS_TOD
Return
EndIf

;[...]

End Function


Konstanten für die Lesbarkeit, Funktionen für die Übersicht.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Fr, Mai 23, 2014 19:14, insgesamt einmal bearbeitet
 

Snowdragon

BeitragDi, Mai 20, 2014 11:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow ich kann mich wieder nur bedanken! Wink In den kommenden Wochen werde ich mich dann näher damit beschäftigen aber ein zwei Fragen habe ich noch.

Mir ist aufgefallen, dass beim Fulscreen der Mauszeiger verschwindet und ich würde gern ein Custom-Cursor verwenden. Wenn ich den Cursor dann zeichne, muss ja auch der vorherige Ort gelöscht werden.
Wenn ich das also richtig verstanden habe geht das nur über Cls und dann verschwindet auch der Background oder wie?

SpionAtom

BeitragDi, Mai 20, 2014 11:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap,
heutzutage darf man seinem Computer schon zutrauen mit jedem Schleifendurchlauf das gesamte Bild neu zu zeichnen. Auch wenn sich nur der Cursor leicht verschiebt. Immer neuzeichnen!
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

Tritium

BeitragDi, Mai 20, 2014 11:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Weißt Du denn, was SetBuffer BackBuffer(), Cls und Flip jeweils machen? Dann müsste sich die Frage eigentlich von alleine erledigen Wink

Falls nicht, hier nochmal eine kurze Erklärung: Für Spiele benutzt man gerne sog. Double Buffering. Dabei hat man zwei "Buffer" (zu dt. vielleicht Bildpuffer oder so), den Frontbuffer und den Backbuffer. Der Frontbuffer ist das, was Du auf dem Bildschirm siehst, der BackBuffer ist hingegen "versteckt".

Mit
BlitzBasic: [AUSKLAPPEN]
SetBuffer BackBuffer()
weist Du das Programm an, dass alle nachfolgenden Zeichenbefehle auf den BackBuffer angewendet werden sollen. Cls löscht den Inhalt des aktuellen Buffers, hier also des BackBuffers.
Sobald Du Flip aufrufst, wird der Inhalt von Front- und BackBuffer getauscht. Alles, was Du zuvor in den BackBuffer gezeichnet hast, ist jetzt also im Frontbuffer und damit auf dem Bildschirm sichtbar. Dadurch kommt dann auch die Schleife zustande, die Xeres gepostet hat.

Warum sollte man sich denn die Mühe machen, alles erst in den BackBuffer zu zeichnen und dann die Buffer zu tauschen? Weil das zu einem bedeutend ruhigeren Bild führt. Kannst ja testweise mal alles direkt in den Frontbuffer zeichnen, also SetBuffer... und Flip weglassen.
Und warum löscht man generell den kompletten Buffer und zeichnet alles neu? Weil das tatsächlich bedeutend einfacher ist. Rein theoretisch könntest Du auch, wenn man das mal auf den Mauszeiger bezieht, den vorherigen Mauszeiger mit etwas übermalen, und den Mauszeiger dann an einer anderen Stelle zeichnen. Aber wie bestimmst Du denn, mit was man den alten Mauszeiger übermalt? Stell Dir mal vor, dass sich hinter dem alten Mauszeiger 42 animierte Bilder, teilweise mit Transparenz befanden - da kann sich niemand mehr ausrechnen, welche Pixel Du nun zeichnen musst, damit der alte Mauszeiger exakt verschwindet. Mal ganz abgesehen davon, dass das enorm viel Leistung brauchen würde.

DAK

BeitragDi, Mai 20, 2014 12:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du Double Buffering verwendest und jedes Frame den ganzen Bildschirm neu zeichnest, dann kostet dich das einiges an Leistung, allerdings bist du auch mit Double Buffering üblicherweise auf mehreren tausend FPS, wenn du keine FPS-Bremse einbaust.

Das ist eine Sache, die man bei Anfängern oft sieht, das ist die Überoptimierung an den falschen Stellen.Die meisten Optimierungen, die man als Anfänger vornehmen kann, bringen vergleichsweise wenig. Schau besser, dass du schönen, sauberen und funktionierenden Code machst, dann kannst du dich darum kümmern, besonders schnellen Code zu schreiben.

Wir sind nicht mehr zu Amiga- oder C64-Zeiten, wo jedes kleine Bisschen Geschwindigkeit, dass man noch irgendwo rausdrücken kann, etwas bringt.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Snowdragon

BeitragFr, Mai 23, 2014 15:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Ehm ich wollte so langsam anfangen und habe Xeres Konstrukt verwendet, da es wie auch von ihm/ihr beschrieben sehr übersichtlich ist.

Allerdings bekomme ich die Fehlermeldung: Function not found
Select GameState wird dabei gehighlightet - was mich verwundert denn es ist doch eine Variable o.o

Code: [AUSKLAPPEN]

Graphics 1800,1200      ;Graphikmodus setzen
SetBuffer BackBuffer()   ;Doublebuffering vorbereiten
Const GS_MENU%=0, GS_PLAY%=1, GS_TOD%=2, GS_HIGH%=3, GS_CRED%=4

Global GameState% = GS_MENU

;[...]

Repeat
   
   ;[...]
   
   Select GameState
      Case GS_MENU
         Main_Menu()
         
      Case GS_PLAY()
         Play_Game()
         
      Case GS_TOD
         Show_Death_Screen()
         
      Case GS_HIGH
         Show_Highscore()
         
      Case GS_CRED
         Show_Credits()
         
   End Select
   
   ;[...]
   
   Flip(0)
   WaitTimer(FrameTimer)
Forever
End


;[...]

Function GetHit()
   ;[...]
   
   If PlayerHP =< 0 Then
      GameState = GS_TOD
      Return
   EndIf
   
   ;[...]
   
End Function



Function Main_Menu()
   ;[...]
   
   Text "Hier muss das Auswahlmenü rein!"
   
   ;[...]
   
End Function


Function Play_Game()
   ;[...]
   
   Text "Hier muss das eigentliche Spiel rein"
   
   ;[...]
   
End Function



Function Show_Death_Screen()
   ;[...]
   
   Text "Hier kommt man zurück zum Hauptmenü, weil das Spiel zu ende ist"
   
   ;[...]
   
End Function



Function Show_Highscore()
   ;[...]
   
   Text "Hier kommen die Rekorde rein"
   
   ;[...]
   
End Function



Function Show_Credits()
   ;[...]
   
   Text "Hier kommen die SPECIAL THANKS rein"
   
   ;[...]
   
End Function





Und nochmals vielen Dank - eine wahnsinnig nette Community!

BladeRunner

Moderator

BeitragFr, Mai 23, 2014 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Sicher dass Du nicht versehentlich select Gamestate() geschrieben hast ?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

count-doku

BeitragFr, Mai 23, 2014 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Hätte einer von euch den Code auch nur überflogen ( Snowdragon, Blade )
wäre euch sicher das:

BlitzBasic: [AUSKLAPPEN]
Select GameState 

Case GS_PLAY() ''' HIER
Play_Game()

aufgefallen Very Happy

lg,
count-doku

Xeres

Moderator

BeitragFr, Mai 23, 2014 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Darum sollte man sich nicht auf fremde Codes verlassen *räusper* - aber danke fürs finden des Fehlers im Beispielcode.
Die Konstanten sind natürlich keine Funktion (was der der Compiler ganz richtig bemängelt) aber alles, worauf Klammern folgen, wird als solche interpretiert. Darum sind die Konstanten auch so wenig toll mit "GS" für "GameState" abgekürzt: BB unterscheiden nicht zwischen Groß- und Kleinschreibung und man kann nicht eine Funktion und eine Konstante benutzen, die beide gleich heißen.
Oder wenn man es kann, ist es eine ganz, ganz dumme Idee.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Snowdragon

BeitragFr, Mai 23, 2014 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal für dumme - was genau müsste ich denn jetzt im Code ändern?

Gehe zu Seite 1, 2, 3  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group