JAVA: Vier gewinnt

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

  • JAVA: Vier gewinnt

    Quellcode

    1. /**
    2. * @author Torben Brodt
    3. * @version 1.1
    4. *
    5. * <p />Spiel: Vier gewinnt
    6. * <p />Funktioniert mit Java < 1.5
    7. *
    8. */
    9. public class A07_Vier_gewinnt {
    10. static String SPIELER; // der aktuelle Spielername -> für die Gewinner Ausgabe
    11. /**
    12. * @param args -> unbenutzt
    13. */
    14. public static void main(String[] args) {
    15. int columns, rows, zaehler = 0, eingabe;
    16. String player1, player2;
    17. char zeichen;
    18. char[][] spielfeld;
    19. //Abfragen des Spielernamens
    20. player1 = eingabeString("Name von SpielerIn A\t\t\t: ");
    21. do {
    22. player2 = eingabeString("Name von SpielerIn B\t\t\t: ");
    23. } while(player1.equals(player2)); //Frage erneut, wenn die Spielernamen gleich sind
    24. //Abfragen der Maße
    25. do {
    26. columns = eingabeInt("Breite des Spielfeldes (mindestens 4)\t: ");
    27. } while (columns < 4); //Frage erneut, wenn die Breite zu klein gewählt wurde
    28. do {
    29. rows = eingabeInt("Hoehe des Spielfeldes (mindestens 4)\t: ");
    30. } while (rows < 4); //Frage erneut, wenn die Höhe zu klein gewählt wurde
    31. spielfeld = new char[rows][columns];
    32. while (zaehler < columns*rows) {
    33. zeichen = (zaehler % 2 == 0) ? 'o' : '+';
    34. SPIELER = (zaehler % 2 == 0) ? player1 : player2;
    35. showSpielfeld(spielfeld);
    36. eingabe = eingabeInt("\n" + SPIELER + "(" + zeichen
    37. + ") ist am Zug. Bitte gib die Spalte ein: ");
    38. if (eingabe > columns || eingabe < 1)
    39. System.err.println("Feld existriert nicht.. Bitte versuch es nochmal!");
    40. else {
    41. zaehler++; // naechster Bitte
    42. setzeFeld(spielfeld, eingabe, zeichen);
    43. }
    44. }
    45. showSpielfeld(spielfeld);
    46. System.err.println("Unentschieden!");
    47. }
    48. /**
    49. * @param text -> Bildschirmausgabe
    50. * @return -> Tastatureingabe
    51. */
    52. static int eingabeInt(String text) {
    53. System.out.print(text);
    54. java.util.Scanner input = new java.util.Scanner(System.in);
    55. return input.nextInt();
    56. }
    57. /**
    58. * @param text -> Bildschirmausgabe
    59. * @return -> Tastatureingabe
    60. */
    61. static String eingabeString(String text) {
    62. System.out.print(text);
    63. java.util.Scanner input = new java.util.Scanner(System.in);
    64. return input.next();
    65. }
    66. /**
    67. * Spalte wird übergeben und das Feld wird gesetzt
    68. * @param spielfeld -> Das Spielfeld mit allen benötigten Daten
    69. * @param column -> eingegebene Spalte
    70. * @param zeichen -> jeder Spieler hat ein Zeichen (*) oder (+)
    71. */
    72. static void setzeFeld(char[][] spielfeld, int column, char zeichen) {
    73. column--; // Weil der gemeine Mensch denkt, der Zahlenbereich würde sich von 1 bis 4 erstrecken
    74. int pos2check;
    75. if (spielfeld[0][column] != '\0')
    76. System.err.println("Die Reihe ist voll.. Pech!");
    77. else
    78. for (int i = 0; i < spielfeld.length; i++) { //Iteriere durch die Zeilen
    79. if (i + 1 == spielfeld.length) {
    80. // Nach der letzten Zeile kommt nichts mehr..
    81. // also darf in das aktuelle Kästchen geschrieben werden, obwohl im
    82. // nächsten nichts steht
    83. pos2check = i;
    84. if (spielfeld[pos2check][column] == '\0') {
    85. spielfeld[i][column] = zeichen;
    86. if(IsGameOver(spielfeld, i, column, zeichen)) {// Hat jmd gewonnen?
    87. System.out.println("Spieler mit "+zeichen+"hat gewonnen");
    88. System.exit(0);
    89. }
    90. break;
    91. }
    92. } else {
    93. //Überprüfe immer das folgende Feld
    94. pos2check = i+1;
    95. if (spielfeld[pos2check][column] != '\0') {
    96. spielfeld[i][column] = zeichen;
    97. if(IsGameOver(spielfeld, i, column, zeichen)) {// Hat jmd gewonnen?
    98. System.out.println("Spieler mit "+zeichen+"hat gewonnen");
    99. System.exit(0);
    100. }
    101. break;
    102. }
    103. }
    104. }
    105. }
    106. /**
    107. * Sammelstelle für die Funktionen, die überprüfen ob jmd. gewonnen hat
    108. * @param spielfeld -> Das Spielfeld mit allen benötigten Daten
    109. * @param column -> die Spalte an der das Zeichen gesetzt wurde
    110. * @param row -> die Reihe an der das Zeichen gesetzt wurde
    111. * @param zeichen -> das Zeichen
    112. */
    113. static boolean IsGameOver(char[][] spielfeld, int column, int row, char zeichen) {
    114. boolean b1 = GameIsOver_row(spielfeld, column, row, zeichen);
    115. boolean b2 = GameIsOver_column(spielfeld, column, row, zeichen);
    116. boolean b3 = GameIsOver_straight1(spielfeld, column, row, zeichen);
    117. boolean b4 = GameIsOver_straight2(spielfeld, column, row, zeichen);
    118. return (b1||b2||b3||b4);
    119. }
    120. static boolean GameIsOver_row(char[][] spielfeld, int column, int row, char zeichen) {
    121. // nach links
    122. int go = row - 1; // mit dem Punkt links neber dem gesetzten beginne
    123. // ich
    124. int i = 1; // der gesetzte Punkt = 1 Treffer
    125. while (go >= 0) {
    126. if (spielfeld[column][go] != zeichen)
    127. break;
    128. go--;
    129. i++;
    130. }
    131. // nach rechts
    132. go = row + 1;
    133. while (go < spielfeld.length) {
    134. if (spielfeld[column][go] != zeichen)
    135. break;
    136. go++;
    137. i++;
    138. }
    139. return (i > 3);
    140. }
    141. static boolean GameIsOver_column(char[][] spielfeld, int column, int row, char zeichen) {
    142. // nach oben
    143. int go = column - 1;
    144. int i = 1;
    145. while (go >= 0) {
    146. if (spielfeld[go][row] != zeichen)
    147. break;
    148. go--;
    149. i++;
    150. }
    151. // nach unten
    152. go = column + 1;
    153. while (go < spielfeld.length) {
    154. if (spielfeld[go][row] != zeichen)
    155. break;
    156. go++;
    157. i++;
    158. }
    159. return (i > 3);
    160. }
    161. static boolean GameIsOver_straight1(char[][] spielfeld, int column, int row, char zeichen) {
    162. // nach links oben
    163. int go = row - 1;
    164. int go2 = column - 1;
    165. int i = 1;
    166. while (go >= 0 && go2 >= 0) {
    167. if (spielfeld[go2][go] != zeichen)
    168. break;
    169. go--;
    170. go2--;
    171. i++;
    172. }
    173. // nach rechts unten
    174. go = row + 1;
    175. go2 = column + 1;
    176. while (go < spielfeld[0].length && go2 < spielfeld.length) {
    177. if (spielfeld[go2][go] != zeichen)
    178. break;
    179. go++;
    180. go2++;
    181. i++;
    182. }
    183. return (i > 3);
    184. }
    185. static boolean GameIsOver_straight2(char[][] spielfeld, int column, int row, char zeichen) {
    186. // nach links unten
    187. int go = row - 1;
    188. int go2 = column + 1;
    189. int i = 1;
    190. while (go >= 0 && go2 < spielfeld.length) {
    191. if (spielfeld[go2][go] != zeichen)
    192. break;
    193. go--;
    194. go2++;
    195. i++;
    196. }
    197. // nach rechts oben
    198. go = row + 1;
    199. go2 = column - 1;
    200. while (go < spielfeld[0].length && go2 >= 0) {
    201. if (spielfeld[go2][go] != zeichen)
    202. break;
    203. go++;
    204. go2--;
    205. i++;
    206. }
    207. return (i > 3);
    208. }
    209. /**
    210. * Bricht das Programm ab und liefert den Gewinner
    211. * @param spielfeld -> Das Spielfeld mit allen benötigten Daten
    212. */
    213. static void spielFertig(char[][] spielfeld) {
    214. showSpielfeld(spielfeld);
    215. System.out.println(SPIELER + " hat gewonnen\n");
    216. System.exit(1);
    217. }
    218. /**
    219. * Zeigt das komplette Spielfeld auf dem Bildschirm
    220. * @param spielfeld -> Das Spielfeld mit allen benötigten Daten
    221. */
    222. static void showSpielfeld(char[][] spielfeld) {
    223. StringBuffer Geruest = new StringBuffer();
    224. StringBuffer row_start = new StringBuffer(" "); // erste Zeile 1 2 3 4
    225. StringBuffer row_divide = new StringBuffer("|"); // Trennzeile |-----|
    226. StringBuffer row_end = new StringBuffer("-"); // letzte Zeile -------
    227. if (spielfeld[0].length > 9) {
    228. for (int i = 1; i <= spielfeld[0].length; i++)
    229. row_start.append((i/10==0) ? " " : i/10).append(" ");
    230. row_start.append("\n ");
    231. }
    232. for (int i = 1; i <= spielfeld[0].length; i++) {
    233. row_start.append(i%10).append(" ");
    234. row_divide.append((i==spielfeld[0].length)? "-|" : "--");
    235. row_end.append("--");
    236. }
    237. System.out.println(row_start);
    238. System.out.println(row_divide);
    239. for (char[] arrZeile : spielfeld) { //iteriere durch alle Zeilen
    240. for (char arrSpalte : arrZeile) { //iteriere durch alle Spalten
    241. Geruest.append("|");
    242. Geruest.append((arrSpalte == '\0') ? ' ' : arrSpalte);
    243. }
    244. Geruest.append("|\n");
    245. }
    246. Geruest.append(row_end).append("\n");
    247. System.out.println(Geruest);
    248. }
    249. }
    Alles anzeigen
  • UML machen wir jetzt im dritten Semester auch.

    Das "Vier gewinnt" hab ich einfach runtergetippt. Das war noch zu Anfang des ersten Semesters.

    Wie ich dabei vorgegangen bin...
    * Als erstes kam die Ausgabefunktion, die ein leeres Array ausgeben musste
    * Dann das endlose Abwechseln zwischen den Spielern in der main()
    * Dann die setzeFeld()
    * am Anfang wurde das Zeichen einfach mal in [spalte][0] geschrieben
    * im nächsten Schritt war dann Ziel das Zeichen in der richtigen Höhe zu platzieren
    * am Ende noch die Gewinnabfragen ergänzen
    * fertig

    Das Herangehen an ein Problem hat jetzt allerdings nichts mit UML zu tun.