Brauche Hilfe mit Kartenspiel

  • GM 7

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Brauche Hilfe mit Kartenspiel

    Hallo Leute!

    Ich kam mal auf die Idee ein Kartenspiel wie MauMau oder Skat zu erstellen!

    Mit den Animationen bekomme ich das ja gut hin aber mein Problem ist:

    Wenn man eine Runde gespielt hat sollen neue Karten aufgedeckt werden!

    Ich habe leider keine Idee wie man das coden könnte, das wenn man die erste Runde

    Kreuz 7, Herz 9, Karo 10, Kreuz Bube und Karo Dame hat und in der nächsten Runde

    die Karten neu aufgedeckt werden und du hast andere Karten als die der letzten Runde!

    Nochmal im Klartext: Wenn man Karten hat, die Runde vorbei ist und eine neue Runde anfängt,

    soll man andere Karten als die der letzten Runde haben!

    Vielleicht könnt ihr mit da ja helfen!



    Danke im Vorraus! MFG Pancake Games
  • Wobei ich ja eigentlich immer nach ner Runde die Karten mische und neuverteile (alle)^^ könntest du die Karten die es gibt in einer Liste speichern und beim verteilen einfach da rausnehmen. Heißt in der nächsten "Runde" werden nur die Karten verteilt, die dann noch in der Liste sind.
  • Bei sowas ist es sinnvoll, abstrakt zu denken. Das heißt, dass du dich vorerst von allen überflüssigen Vorstellungen trennst und dein Kartenspiel auf eine einfache Struktur zurückführst.

    Bei den meisten Kartenspielen benutzt du dafür sinnvollerweise die Datenstruktur von Stacks, da die sich schon wie ein Kartenstapel verhalten.
    Verschiedene Karten repräsentierst du mit entsprechenden Zahlenwerten. Karo1 könnte z.b. 1 sein (und hoch bis 10), Karo Bube dann die 11, Dame 12, König 13 und Ass 14. Bei Herz könntest du dann mit 101 anfangen und so weiter.

    Auf all diese Datenstrukturen kannst du dann Funktionen schreiben, die Mischen, Austeilen und ähnliches simulieren. Durch Auslesen der Daten kannst du dann entsprechend das Spielgeschehen visualisieren.
    Um den Spielablauf zu managen, ist dabei meist eine Statusvariable ganz sinnvoll, die die Phasen des Spiels abarbeitet (wenn diese Variable z.b. 1 ist, kann nur der Ablagestapel angeklickt werden, die Karte wird gezogen beim Anklicken, die Variable geht einen Zähler weiter hoch und der Stapel kann vorerst nicht wieder angeklickt werden).

    Aber anstatt jetzt weiter ins Detail zu gehen, liefer ich dir mal ein Beispiel. Es ist nur eine Konsolenanwendung, aber immerhin.

    Es ist ein Kartenspiel, das ich in Java als Hausaufgabe fürs Studium geschrieben habe. Es handelt sich dabei um "17 und 4" - man zieht abwechselnd Karten und muss dabei so nah wie möglich an 21 Punkte rankommen. Wer die 21 überschreitet, verliert die Runde. Ziel des Spiels ist es also, mehr Punkte als der Gegner in einer Runde zu haben aber 21 nicht zu überschreiten.
    Auch wenn es Java ist, solltees mit GML-Kenntnissen gut verständlich sein.
    Spoiler anzeigen

    Quellcode

    1. public class Vingt{
    2. public static void main(String[] args){
    3. // Allgemeine Initialisierung
    4. int runden = 12;
    5. int taler_com = 20, taler_p = 5;
    6. int einsatz, karte, punkte_com, punkte_p, karten_com, karten_p;
    7. boolean zug_com, ausstieg_com, ausstieg_p;
    8. System.out.print("\n\n\nWillkommen bei 17 und 4!\n\n");
    9. // Rundenschleife
    10. do {
    11. // Rundeninitalisierung
    12. punkte_com = 0;
    13. punkte_p = 0;
    14. karten_com = 1;
    15. karten_p = 1;
    16. zug_com = false;
    17. ausstieg_com = false;
    18. ausstieg_p = false;
    19. System.out.print("============================\nRunde "+(13-runden)+" beginnt.\n\n");
    20. System.out.print("Das Guthaben des Computers betraegt "+taler_com+" Schokotaler.\n");
    21. System.out.print("Ihr Guthaben betraegt "+taler_p+" Schokotaler.\n\n");
    22. // 1. Computerkarte
    23. karte = Zufall.zufallszahl(13);
    24. punkte_com += kartenWert(karte);
    25. System.out.print("Der Computer bekommt die Karte: "+kartenName(karte)+"\n");
    26. System.out.print("Der Computer hat 1 Karte mit insgesamt "+punkte_com+" Punkt(en) auf der Hand.\n\n");
    27. // 1. Spielerkarte
    28. karte = Zufall.zufallszahl(13);
    29. punkte_p += kartenWert(karte);
    30. System.out.print("Sie bekommen die Karte: "+kartenName(karte)+"\n");
    31. System.out.print("Sie haben 1 Karte mit insgesamt "+punkte_p+" Punkt(en) auf der Hand.\n\n");
    32. // Setzen
    33. einsatz = 0;
    34. while (einsatz <= 0 || einsatz > taler_com || einsatz > taler_p){
    35. System.out.print("\nBitte geben Sie eine positive Anzahl an Schokotalern als Einsatz fuer\ndiese Runde ein, die weder Ihr Guthaben noch das Guthaben des\nComputers ueberschreiten darf:\n");
    36. einsatz = IO.readInt();
    37. }
    38. taler_p -= einsatz;
    39. taler_com -= einsatz;
    40. // Ziehschleife
    41. do{
    42. zug_com = ausstieg_com || ausstieg_p ? ausstieg_p : !zug_com; // Bestimme, wer dran ist
    43. if (ausstieg_p) {
    44. zug_com = true; // Wenn der Spieler ausgestiegen ist, ist immer der Computer dran
    45. }
    46. if (ausstieg_com) {
    47. zug_com = false; // Wenn der Computer ausgestiegen ist, ist immer der Spieler dran
    48. }
    49. if (zug_com || ausstieg_p){
    50. // Computer ist am Zug
    51. if (punkte_com >= 17){
    52. ausstieg_com = true;
    53. System.out.print("Der Computer zieht keine weitere Karte mehr.\n\n");
    54. continue;
    55. }
    56. }
    57. else{
    58. // Spieler ist am Zug
    59. if (!frage("Moechten Sie eine neue Karte ziehen?")){
    60. ausstieg_p = true;
    61. System.out.print("\nSie ziehen keine weitere Karten mehr.\n\n");
    62. continue;
    63. }
    64. }
    65. // Karte ziehen und Punkte anrechnen
    66. karte = Zufall.zufallszahl(13);
    67. if (zug_com){
    68. // Computerkarte
    69. punkte_com += kartenWert(karte);
    70. karten_com += 1;
    71. System.out.print("\nDer Computer bekommt die Karte: "+kartenName(karte)+"\n");
    72. System.out.print("Der Computer hat "+karten_com+" Karten mit insgesamt "+punkte_com+" Punkten auf der Hand.\n\n");
    73. if (punkte_com > 21){
    74. System.out.print("Der Computer hat mehr als 21 Punkte auf der Hand!\n\n");
    75. punkte_com = -1;
    76. break;
    77. }
    78. }
    79. else{
    80. // Spielerkarte
    81. punkte_p += kartenWert(karte);
    82. karten_p += 1;
    83. System.out.print("\nSie bekommen die Karte: "+kartenName(karte)+"\n");
    84. System.out.print("Sie haben "+karten_p+" Karten mit insgesamt "+punkte_p+" Punkten auf der Hand.\n\n");
    85. if (punkte_p > 21){
    86. System.out.print("Sie haben mehr als 21 Punkte auf der Hand!\n\n");
    87. punkte_p = -1;
    88. break;
    89. }
    90. }
    91. }while (!ausstieg_p || !ausstieg_com);
    92. // Gewinnausgabe
    93. if (punkte_p >= punkte_com && punkte_p <= 21){
    94. // Spieler gewinnt
    95. taler_p += einsatz*2;
    96. System.out.print("Sie haben gewonnen!\n");
    97. System.out.print("Sie bekommen "+(einsatz*2)+" Schokotaler.\n\n");
    98. }
    99. if (punkte_com > punkte_p && punkte_com <= 21){
    100. // Computer gewinnt
    101. taler_com += einsatz*2;
    102. System.out.print("Sie haben leider verloren.\n");
    103. System.out.print("Der Computer bekommt "+(einsatz*2)+" Schokotaler.\n\n");
    104. }
    105. // Überprüfe, ob Computer vorzeitig verloren hat
    106. if (taler_com <= 0){
    107. System.out.print("Sie haben die Bank gesprengt!\n\n");
    108. break;
    109. }
    110. // Überprüfe, ob Spieler hat vorzeitig verloren hat
    111. if (taler_p <= 0){
    112. System.out.print("Sie sind pleite... oder:\nYou just lost the game!\n\n");
    113. break;
    114. }
    115. // Noch eine Runde
    116. if (!frage("Noch eine Runde spielen?")){
    117. break;
    118. }
    119. runden -= 1;
    120. } while (runden > 0);
    121. // Spielende
    122. if (runden == 12){
    123. System.out.print("\n\nSpielende (es wurde 1 Runde gespielt) - Ergebnisse:\n");
    124. }
    125. else{
    126. System.out.print("\n\nSpielende (es wurden " + (13-runden) + " Runden gespielt) - Ergebnisse:\n");
    127. }
    128. System.out.print(" Computer: "+taler_com+" Schokotaler.\n Sie: "+taler_p+" Schokotaler.\n\n");
    129. if (taler_com > taler_p || taler_p <= 5) {
    130. System.out.print("\nTja, das hat sich ja nicht wirklich gelohnt.\n");
    131. }
    132. else{
    133. System.out.print("Gar nicht schlecht. Ist Ihr Ego schon ein bischen gewachsen?\n");
    134. }
    135. }
    136. public static boolean frage(String q){
    137. int input = -1;;
    138. while (input != 0 && input != 1) {
    139. System.out.print(q+"\n 1 Ja\n 0 Nein\n");
    140. input = IO.readInt();
    141. }
    142. if (input == 1){
    143. return true;
    144. }
    145. else{
    146. return false;
    147. }
    148. }
    149. public static String kartenName(int ind){
    150. switch(ind) {
    151. case 10:
    152. return "Bube";
    153. case 11:
    154. return "Dame";
    155. case 12:
    156. return "Koenig";
    157. case 13:
    158. return "Ass";
    159. default:
    160. return ""+(ind+1); // ein kleines Workaround, da (String) uns nicht zur Verfügung steht
    161. }
    162. }
    163. public static int kartenWert(int ind){
    164. if (ind == 13){
    165. return 11;
    166. }
    167. if (ind > 9){
    168. return 10;
    169. }
    170. return ind+1;
    171. }
    172. }
    Alles anzeigen
  • Von mir zumindest nicht. Lies dich aber einfach in den Code ein, es ist als GM-Nutzer sehr leicht verständlich - nur z.B. "do while" ist im Game Maker "do until", wobei dann die Endbedingung entsprechend verneint werden müsste (zu Deutsch: "tue ... solange" bzw. "tue ... bis").
  • MewX schrieb:

    nur z.B. "do while" ist im Game Maker "do until"

    Stimmt nicht. In GML gibt es ebenfalls die "while-Schleife":
    A while statement has the form
    while (<expression>) <statement>
    As long as the expression is true, the statement (which can also be a block) is executed. Be careful with your while loops. You can easily make them loop forever, in which case your game will hang and not react to any user input anymore.

    Example
    The following program tries to place the current object at a free position (this is about the same as the action to move an object to a random position).
    { while (!place_free(x,y)) { x = random(room_width); y = random(room_height); } }
    Sogar das lässt sich also ziemlich genau aus dem Beispiel übernehmen und man muss das Statement in GML somit auch nicht umkehren.
  • Benutzer online 1

    1 Besucher