4 gewinnt

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

  • hi bin student an der uni darmstadt und wir haben gerade mit java angefangen
    nun habe ich folgende hausübung abzugeben das spiel 4 gewinnt

    code:
    in diesem code soll noch nun putInColumn erstellen sowie prüfen ob hasfor vertically und so weiter zutrifft. ich habe keinen plan welcher code da rein muss , hilfe erwünscht :)

    Quellcode

    1. public class ConnectFour extends ConsoleProgram /* DialogProgram */{
    2. // state variables of this object
    3. int width = 7;
    4. int height = 6;
    5. char[][] board = new char[width][height];
    6. /**
    7. * Main loop of the program. Let players take turns entering moves until one
    8. * player wins or the board is full, in which case the game is a draw.
    9. */
    10. public void run() {
    11. int player = 1;
    12. println("---- 4 GEWINNT -----");
    13. // no winner yet.
    14. int winner = 0;
    15. while (winner == 0 && !isFull()) {
    16. // print the current board
    17. printBoard();
    18. // prompt the current player to enter a move
    19. promptPlayerMessage(player);
    20. // read the move from the player
    21. int x = readInt();
    22. // terminate when -1 is entered
    23. if (x == -1)
    24. System.exit(0);
    25. // players count from 1, Java from 0
    26. x--;
    27. // is input in correct range?
    28. if (x >= 0 && x < width) {
    29. // valid move, perform it
    30. int y = putInColumn(x, player);
    31. if (y == -1)
    32. // output row is full message
    33. rowFullMessage(x);
    34. else if (hasWon(x, y))
    35. winner = player;
    36. else
    37. // next player
    38. player = 3 - player;
    39. } else
    40. // invalid move
    41. errorMessage();
    42. }
    43. // game has ended, either we have a winner or a draw
    44. if (winner == 0)
    45. drawMessage();
    46. else
    47. winMessage(winner);
    48. }
    49. /**
    50. * Initializes the Connect Four Game
    51. *
    52. */
    53. public ConnectFour() {
    54. init();
    55. }
    56. /**
    57. * Returns the char that represents a player (i.e. x or o)
    58. *
    59. * @param playerNo
    60. * number of the player, i.e. 1 or 2
    61. * @return the char for the player
    62. */
    63. public char getPlayerChar(int playerNo) {
    64. char[] playerChars = { 'x', 'o' };
    65. return playerChars[playerNo - 1];
    66. }
    67. /**
    68. * Prints the current board For example:
    69. * |
    70. * |
    71. * |
    72. * | o x
    73. * | o x x
    74. * |o x x o x
    75. * -------------
    76. * 1 2 3 4 5 6 7
    77. *
    78. */
    79. public void printBoard() {
    80. StringBuffer sb = new StringBuffer();
    81. for (int i = 0; i < height; i++) {
    82. // start of a line
    83. sb.append("|");
    84. for (int j = 0; j < width; j++) {
    85. sb.append(board[j][i]).append(' ');
    86. }
    87. // end of a line
    88. sb.append('\n');
    89. }
    90. sb.append(" -------------\n");
    91. sb.append(" 1 2 3 4 5 6 7");
    92. println(sb.toString());
    93. }
    94. /**
    95. * Checks whether the game is won and who won the game
    96. *
    97. * @return the number of the winner (i.e. 1 or 2) or 0 if no one has yet won
    98. * the game
    99. */
    100. public boolean hasWon(int x, int y) {
    101. return (hasFourHorizontally(x, y) || hasFourVertically(x, y)
    102. || hasFourDiagonally(x, y));
    103. }
    104. /**
    105. * Checks whether another game piece can be added
    106. *
    107. * @return true if the board is full
    108. */
    109. public boolean isFull() {
    110. for (int x = 0; x < width; x++)
    111. if (board[x][0] == '_')
    112. return false;
    113. return true;
    114. }
    115. /**
    116. * Test whether there are four gaming pieces with the given char above each
    117. * other. Only checking column x needed as this is the only column a vertical
    118. * four-in-a-row could have been created in this turn.
    119. *
    120. * @param x
    121. * column of the last added piece
    122. * @param y
    123. * row of the last added piece
    124. * @return whether their are four gaming pieces above each other
    125. */
    126. public boolean hasFourVertically(int x, int y) {
    127. //TODO implement
    128. return false;
    129. }
    130. /**
    131. * Test whether there are four gaming pieces with the given char next to each
    132. * other. Only checking column x needed as this is the only column a horizontal
    133. * four-in-a-row could have been created in this turn.
    134. *
    135. * @param x
    136. * column of the last added piece
    137. * @param y
    138. * row of the last added piece
    139. * @return whether their are four gaming pieces next to each other
    140. */
    141. public boolean hasFourHorizontally(int x, int y) {
    142. //TODO implement
    143. return false;
    144. }
    145. /**
    146. * Test whether there are 4 gaming pieces next to each other on a diagonal.
    147. * Only checking column x needed as this is the only column a horizontal
    148. * four-in-a-row could have been created in this turn.
    149. *
    150. * @param x
    151. * column of the last added piece
    152. * @param y
    153. * row of the last added piece
    154. * @return whether there are 4 gaming pieces next to each other on a diagonal
    155. */
    156. public boolean hasFourDiagonally(int x, int y) {
    157. //TODO implement
    158. return false;
    159. }
    160. /**
    161. * Initialize the board with blanks
    162. *
    163. */
    164. public void init() {
    165. //TODO implement
    166. board[6][5] = '_';
    167. }
    168. /* messages */
    169. private void promptPlayerMessage(int p) {
    170. //TODO implement
    171. println("Spielerszug "+p);
    172. }
    173. private void rowFullMessage(int x) {
    174. //TODO implement
    175. println("Die Reihe ist voll");
    176. }
    177. private void winMessage(int p) {
    178. //TODO implement
    179. println("Es gewinnt Spieler" +p);
    180. }
    181. private void drawMessage() {
    182. //TODO implement
    183. println("unentschieden keiner gewinnt ihr Affen");
    184. }
    185. private void errorMessage() {
    186. //TODO implement
    187. showErrorMessage("Eingabe falsch etwas stimmt nicht!!!");
    188. }
    189. /**
    190. * Put a gaming piece on top of the gaming pieces in the given column by the
    191. */
    192. public int putInColumn(int column, int playerNo) {
    193. //TODO put piece of player in column
    194. return -1;
    195. }
    196. /**
    197. * Main method. This is automatically called by the environment when your
    198. * program starts.
    199. *
    200. * @param args
    201. */
    202. public static void main(String[] args) {
    203. new ConnectFour().run();
    204. }
    205. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von danny_k ()

  • Der JavaDOC-Kommentar für putInColumn() scheint nicht vollständig zu sein. Entweder du hast nicht alles hier ein gepostet, oder es wurde etwas vergessen. Dann solltest du den Aufgabensteller einmal nach dem vollständigen Java-DOC Kommentar fragen. Die drei hasFour-Methoden sind so deutlich beschrieben, dass du sie auch allein lösen kannst.

    Edit:
    ich habe mit das Programm mal näher angeschaut und weiß nun was du in putInColumn tun musst. Einen neuen Spielstein des übergebenen Spielers in der übergebenen Spalte platzieren. Wenn die Spalte schon voll ist, dann gibst du -1 zurück, ansonsten 0.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Hafner ()

  • danny_k schrieb:

    Sorry Wie funktioniert das mit den tags

    Du hast unter deinem Edit Feld, wenn du einen Beitrag erstellst, eine Reihen bunter Symbole, welche zum Reiter Syntax gehören. da gibt es unter anderem Bash, D und C++, C#, etc. Da drauf klicken und dann zwischen syntax="***"] und [/syntax deinen code einfügen.
    Open Source --> Programmieren aus Leidenschaft :!:

    Ich stehe weder für privaten Support per PM noch über einen IM zur Verfügung. Danke.
  • danny_k schrieb:


    leider bin ich noch ziemicher anfänger und habe noch nicht so wirklich plan was ich für die hasFour funktion genau implementieren soll bsp. wäre sehr gut

    Aber was über den Funktionen steht hast du dir durchgelesen, oder? Ich weiß nicht was ich da noch mehr dazu sagen soll. Die Typen int und boolean sind dir bekannt oder? Wo liegt den dein Problem konkret? Fällt dir keine algorithmische Lösung ein? Bezüglich der Syntax hast du ja in dem von dir geposteten Code selbst genug Beispiele.

    Die fertige Lösung wirst du von mir hier nicht pressentiert bekommen. Bei konkteten Problemen helfe ich dagegen gern.
  • ja es geht um die algorythmsche lösung. int arrays char ok, aber wie prüfe ich ob nun eine diagonale oder verticale auf irgendeiner position besteht . es fällt mir etwas schwer da die die genaue lösung für die funktionen zu verstehen.

    wie prüfe ich also ob 4 steine übereinstimmen auf irgendeinem platz in reihe. for schleife ? while? eventuell . spielernummer dazu?
  • Also, du hast ja bei z.B. hasFourHorizontally die 2 Koordinaten. Mittels x und y und dem board Array kannst du ja raus finden was für ein Stein das ist (also von welchem Spieler), denn der Stein ist ja schon gesetzt. Wenn du also den char aus dem Board ausgelesen hast, musst du also nur noch prüfen ob auf der selben Reihe vier gleiche chars sind.
    Was in deinem Array Reihen und was Spalten sind, solltest du eigentlich in der printBoard()-Methode am besten nachvollziehen können. Allerdings scheint die Methode nicht völlig richtig zu sein. Hast du die implementiert oder wurde die so vorgegeben?
    Das

    Quellcode

    1. sb.append(board[j]).append(' ');

    sieht nicht ganz richtig aus. Ich würde eher sowas

    Quellcode

    1. sb.append(board[j][i]).append(' ');

    erwarten.

    Edit:
    Da das board so initialisiert wird:

    Quellcode

    1. char[][] board = new char[width][height];

    sollte klar sein was Zeilen und was Spalten sind.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Hafner ()

  • wir studenten haben eine package bekommen das bsp. println beeinhaltet

    es is alles vorgegebn bis auf

    System.out.println Ausgabe die durch das println hier angeben sind. Sprich die meldung gewinner unentschieden etc. das kommt von mir

    die init prozedur ebenfalls von mir der rest ist vorgegeben

    sb.append ist mir auch nicht so klar was das macht append fügt doch mehrere Felder zusammen oder?

    so mein code für FourHorizontally der kann nicht stimmen denk ich aber bewge ich mich auf die richtige lösung zu??

    Quellcode

    1. public boolean hasFourHorizontally(int x, int y) {
    2. // TODO implement
    3. for (x = 0; x < 4; x++)
    4. if (board[x][y] == 'x')
    5. return true;
    6. return false;


    ok wie lese ich mit char den letzt gelegenen stein aus? erstmal das :-<
    ja das mit dem stringbuffer ist von der uni vorgegeben

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von danny_k ()

  • Ja, append hängt nur etwas am ende des StringBuffers an. Warum man überhaupt StringBuffer und nicht String verwendet und dann nicht einfach den plus-Operator ist mir schleierhaft. Das ist aber nicht das, was ich meinte. Ich meinte die Adressierung der Zelle im Array, die meiner Meinung nach unvollständig ist.

    Was deinen Code-Ausschnitt angeht:
    Du weißt wie eine for-Scheife funktioniert? "x = 0;" überschreibst erst einmal die dir übergebene x-Variable mit 0 (damit verlierst du schon mal die Spalte des aktuell gelegten Steins). Dann gehst du für 0, 1, 2, 3, 4 (warum für 5 Werte?) die for-Scheife durch. Jetzt prüfst du ob ob die Zelle den char 'x' enthält. Warum x? Es könnte ja auch der andere Spieler gewesen sein. Lese doch erst mal den char des zuletzt gelegten Steins aus dem board aus, damit du weist wer zuletzt dran war. Zudem gibst du 0 als Wert für die Zeile des boards an. Wie kommst du auf 0? Ich denke es wäre hier sinnvoll die Zeilennummer des zuletzt gelegten Steines zu verwenden, also y. Nun wird es noch kurioser, wenn "board[x][0] == 'x'" wirklich wahr sein sollte, dann prüfst du noch "board[x][0] == 'o'". Beides zusammen kann gar nicht wahr sein. Deine Methode gibst also immer false zurück.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Hafner ()

  • board[x][0] == y ???
    Das compiliert doch nicht oder? Warum sollte der char von board[x][0] der selbe sein wie die int-y-Koordinate des zuletzt gelegten Steins? Bist du dir bewusst, dass bei einem return die Methode verlassen wird, völlig egal ob du noch in Schleifen bist oder nicht?

    Also, ich formuliere es mal in Worten:
    1. Den char des zuletzt gelegten Steines mit Hilfe der x und y Koordinaten aus dem board-Array holen.
    2. Zählen, wie viele Steine nacheinander (!) links und rechts von dem aktuellen Stein den selben char im board-Array haben.
    3. Wenn die Summe der gezählten Steine links, der gezählten Steine rechts größer/gleich als 3 ist, dann gibst du true zurück ansonsten false (3 deshalb, da der gerade gelegte Stein ja auch einer ist).
  • So leut ich hab das jetzt so gelöst

    Quellcode

    1. import acm.program.ConsoleProgram;
    2. import acm.program.DialogProgram;
    3. public class ConnectFour extends ConsoleProgram /* DialogProgram */{
    4. // state variables of this object
    5. int width = 7;
    6. int height = 6;
    7. char[][] board = new char[width][height];
    8. /**
    9. * Main loop of the program. Let players take turns entering moves until one
    10. * player wins or the board is full, in which case the game is a draw.
    11. */
    12. public void run() {
    13. int player = 1;
    14. println("---- 4 GEWINNT -----");
    15. // no winner yet.
    16. int winner = 0;
    17. while (winner == 0 && !isFull()) {
    18. // print the current board
    19. printBoard();
    20. // prompt the current player to enter a move
    21. promptPlayerMessage(player);
    22. // read the move from the player
    23. int x = readInt();
    24. // terminate when -1 is entered
    25. if (x == -1)
    26. System.exit(0);
    27. // players count from 1, Java from 0
    28. x--;
    29. // is input in correct range?
    30. if (x >= 0 && x < width) {
    31. // valid move, perform it
    32. int y = putInColumn(x, player);
    33. if (y == -1)
    34. // output row is full message
    35. rowFullMessage(x);
    36. else if (hasWon(x, y))
    37. winner = player;
    38. else
    39. // next player
    40. player = 3 - player;
    41. } else
    42. // invalid move
    43. errorMessage();
    44. }
    45. // game has ended, either we have a winner or a draw
    46. if (winner == 0)
    47. drawMessage();
    48. else
    49. winMessage(winner);
    50. }
    51. /**
    52. * Initializes the Connect Four Game
    53. *
    54. */
    55. public ConnectFour() {
    56. init();
    57. }
    58. /**
    59. * Returns the char that represents a player (i.e. x or o)
    60. *
    61. * @param playerNo
    62. * number of the player, i.e. 1 or 2
    63. * @return the char for the player
    64. */
    65. public char getPlayerChar(int playerNo) {
    66. char[] playerChars = { 'x', 'o' };
    67. return playerChars[playerNo - 1];
    68. }
    69. /**
    70. * Prints the current board For example: | | | |o x |o x x |o x x o x
    71. * ------------- 1 2 3 4 5 6 7
    72. *
    73. */
    74. public void printBoard() {
    75. StringBuffer sb = new StringBuffer();
    76. for (int i = 0; i < height; i++) {
    77. // start of a line
    78. sb.append("|");
    79. for (int j = 0; j < width; j++) {
    80. sb.append(board[j][i]).append(' ');
    81. }
    82. // end of a line
    83. sb.append('\n');
    84. }
    85. sb.append(" -------------\n");
    86. sb.append(" 1 2 3 4 5 6 7");
    87. println(sb.toString());
    88. }
    89. /**
    90. * Checks whether the game is won and who won the game
    91. *
    92. * @return the number of the winner (i.e. 1 or 2) or 0 if no one has yet won
    93. * the game
    94. */
    95. public boolean hasWon(int x, int y) {
    96. return (hasFourHorizontally(x, y) || hasFourVertically(x, y) || hasFourDiagonally (x, y));}
    97. /**
    98. * Checks whether another game piece can be added
    99. *
    100. * @return true if the board is full
    101. */
    102. public boolean isFull() {
    103. for (int x = 0; x < width; x++)
    104. if (board[x][0] == '_')
    105. return false;
    106. return true;
    107. }
    108. /**
    109. * Test whether there are four gaming pieces with the given char above each
    110. * other. Only checking column x needed as this is the only column a
    111. * vertical four-in-a-row could have been created in this turn.
    112. *
    113. * @param x
    114. * column of the last added piece
    115. * @param y
    116. * row of the last added piece
    117. * @return whether their are four gaming pieces above each other
    118. */
    119. public boolean hasFourVertically(int x, int y) {
    120. int win = 0;
    121. for (int i = 0; i < height; i++) {
    122. if (board[x][i] == board[x][y])
    123. win++;
    124. else
    125. win = 0;
    126. if (win == 4)
    127. return true;
    128. }
    129. return false;
    130. }
    131. /**
    132. * Test whether there are four gaming pieces with the given char next to
    133. * each other. Only checking column x needed as this is the only column a
    134. * horizontal four-in-a-row could have been created in this turn.
    135. *
    136. * @param x
    137. * column of the last added piece
    138. * @param y
    139. * row of the last added piece
    140. * @return whether their are four gaming pieces next to each other
    141. */
    142. public boolean hasFourHorizontally(int x, int y) {
    143. // TODO implement
    144. // int playersymbol = board [x][y];
    145. int win = 0;
    146. for (int i = 0; i < width; i++) {
    147. if (board[i][y] == board[x][y])
    148. win++;
    149. else
    150. win = 0;
    151. if (win == 4)
    152. return true;
    153. }
    154. return false;
    155. }
    156. /**
    157. * Test whether there are 4 gaming pieces next to each other on a diagonal.
    158. * Only checking column x needed as this is the only column a horizontal
    159. * four-in-a-row could have been created in this turn.
    160. *
    161. * @param i
    162. * column of the last added piece
    163. * @param j
    164. * row of the last added piece
    165. * @return whether there are 4 gaming pieces next to each other on a
    166. * diagonal
    167. */
    168. public boolean hasFourDiagonally(int x, int y) {
    169. int playerSymbol = board[x][y];
    170. int i = x;
    171. int j = y;
    172. int count = 0;
    173. while ((i > 0) && (j > 0)) {
    174. i--;
    175. j--;
    176. }
    177. while ((i <= 6) && (j <= 5)) {
    178. if (board[i][j] == playerSymbol)
    179. count++;
    180. else
    181. count = 0;
    182. i++;
    183. j++;
    184. }
    185. if (count == 4)
    186. return true;
    187. return false;
    188. }
    189. /**
    190. * Initialize the board with blanks
    191. *
    192. */
    193. public void init() {
    194. for (int i = 0; i < width; i++) { // i = höhe
    195. for (int j = 0; j < height; j++) { // j = breite
    196. board[i][j] = '_';
    197. }
    198. }
    199. }
    200. /* messages */
    201. private void promptPlayerMessage(int p) {
    202. // TODO implement
    203. println("Spielerszug " + p);
    204. }
    205. private void rowFullMessage(int x) {
    206. // TODO implement
    207. println("Die Reihe ist voll");
    208. }
    209. private void winMessage(int p) {
    210. printBoard();
    211. // TODO implement
    212. println("Es gewinnt Spieler " + p);
    213. }
    214. private void drawMessage() {
    215. // TODO implement
    216. println("unentschieden keiner gewinnt ihr Affen");
    217. }
    218. private void errorMessage() {
    219. // TODO implement
    220. showErrorMessage("Eingabe falsch etwas stimmt nicht!!!");
    221. }
    222. /**
    223. * Put a gaming piece on top of the gaming pieces in the given column by the
    224. */
    225. public int putInColumn(int column, int playerNo) {
    226. // Zählt die höhe herunter bis auf 0
    227. for (int y = height - 1; y >= 0; y--) {
    228. // Wenn array '_' das entspricht
    229. if (board[column][y] == '_') {
    230. board[column][y] = getPlayerChar(playerNo);
    231. return y;
    232. }
    233. }
    234. return -1;
    235. }
    236. /**
    237. * Main method. This is automatically called by the environment when your
    238. * program starts.
    239. *
    240. * @param args
    241. */
    242. public static void main(String[] args) {
    243. new ConnectFour().start();
    244. }
    245. }
    Alles anzeigen
  • und weiter 4 Gewinnt

    Hi Leute ich mal für dieses 4 Gewinnt eine prozedur geschrieben die 4 Vertikale also von links unten nach rechts oben einen sieg bringen soll.

    Geht aber nicht schaut euch bitte mal den code an und erklärt mir mal bitte wo der fehler liegt ich weiß es echt nicht. Danke

    Quellcode

    1. public boolean hasFourDiagonally(int x, int y) {
    2. int playerSymbol = board[x][y];
    3. int Spalte = x;
    4. int Hoehe = y;
    5. int count = 0;
    6. while ((Spalte >= 0) && (Hoehe <= 5)) {
    7. Spalte--;
    8. Hoehe++;
    9. }
    10. while ((Spalte < 6) && (Hoehe >= 5)) {
    11. if (board[Spalte][Hoehe] == playerSymbol)
    12. count++;
    13. else
    14. count = 0;
    15. Spalte++;
    16. Hoehe--;
    17. }
    18. if (count == 4)
    19. return true;
    20. return false;
    21. }
    Alles anzeigen


    Also meine Überlegung ist halt mit der ersten while Schleife setze ich den start der prozedur fest, dass wäre dann in dem graph links unten.
    dann soll er halt prüfen ob es vier diagonale überseisntimmen. wenn ja true also sieg wenn nicht dann halt false