[Hilfe] Card Game
Übersicht BlitzBasic Beginners-Corner
SnowdragonBetreff: [Hilfe] Card Game |
Sa, Mai 17, 2014 17:18 Antworten mit Zitat |
|
---|---|---|
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! |
||
XeresModerator |
Sa, Mai 17, 2014 20:51 Antworten mit Zitat |
|
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Snowdragon |
Sa, Mai 17, 2014 21:09 Antworten mit Zitat |
|
---|---|---|
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). |
||
XeresModerator |
Sa, Mai 17, 2014 21:19 Antworten mit Zitat |
|
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Snowdragon |
Sa, Mai 17, 2014 21:35 Antworten mit Zitat |
|
---|---|---|
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. |
||
HolzchopfMeisterpacker |
Sa, Mai 17, 2014 21:40 Antworten mit Zitat |
|
---|---|---|
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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Snowdragon |
Sa, Mai 17, 2014 21:49 Antworten mit Zitat |
|
---|---|---|
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! |
||
DAK |
So, Mai 18, 2014 19:25 Antworten mit Zitat |
|
---|---|---|
@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 |
So, Mai 18, 2014 21:57 Antworten mit Zitat |
|
---|---|---|
Okay vielen Dank an euch alle! <3
Ihr seid die Besten!!! |
||
Snowdragon |
Mo, Mai 19, 2014 21:17 Antworten mit Zitat |
|
---|---|---|
So da bin ich wieder mit 2 Fragen.
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? |
||
XeresModerator |
Mo, Mai 19, 2014 23:31 Antworten mit Zitat |
|
---|---|---|
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( ... ) Um den Wechsel zwischen verschiedenen Modi zu machen, würde ich immer diese Konstruktion benutzen: BlitzBasic: [AUSKLAPPEN]
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 THERE 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 |
Di, Mai 20, 2014 11:06 Antworten mit Zitat |
|
---|---|---|
Wow ich kann mich wieder nur bedanken! 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 |
Di, Mai 20, 2014 11:24 Antworten mit Zitat |
|
---|---|---|
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 |
Di, Mai 20, 2014 11:39 Antworten mit Zitat |
|
---|---|---|
Weißt Du denn, was SetBuffer BackBuffer(), Cls und Flip jeweils machen? Dann müsste sich die Frage eigentlich von alleine erledigen
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 |
Di, Mai 20, 2014 12:18 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Mai 23, 2014 15:02 Antworten mit Zitat |
|
---|---|---|
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! |
||
BladeRunnerModerator |
Fr, Mai 23, 2014 18:43 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Mai 23, 2014 18:52 Antworten mit Zitat |
|
---|---|---|
Hätte einer von euch den Code auch nur überflogen ( Snowdragon, Blade )
wäre euch sicher das: BlitzBasic: [AUSKLAPPEN] Select GameState aufgefallen lg, count-doku |
||
XeresModerator |
Fr, Mai 23, 2014 19:21 Antworten mit Zitat |
|
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Snowdragon |
Fr, Mai 23, 2014 19:27 Antworten mit Zitat |
|
---|---|---|
Nochmal für dumme - was genau müsste ich denn jetzt im Code ändern? | ||
Übersicht BlitzBasic Beginners-Corner
Powered by phpBB © 2001 - 2006, phpBB Group