אוק.31

איקס עיגול - לכתוב קוד שאף פעם לא הפסיד

איקס עיגול - לכתוב קוד שאף פעם לא הפסיד

יש לכתוב פונקציה שמקבלת לוח עם מצב נתון ומס' שחקן (1 או 2) ותמאלה מקום פנוי ככה שלא תפסיד אף פעם.

  1. public int[] TheMoveCalculation(int[][] board, int player) {
  2. for (int i = 0; i < 3; i++) {
  3. for (int j = 0; j < 3; j++) {
  4. if (board[i][j] == 0) {
  5. board[i][j] = player;
  6. if (move(board, player) >= 0)
  7. return new[] { i, j };
  8. board[i][j] = 0;
  9. }
  10. }
  11. }
  12. return null; // never will be here, because this is always option for win or remis in this game
  13. }
  14.  
  15. private int move(int[][] board, int player) { // 1-win, 0-remis, -1-loose
  16. int free = 0;
  17. for (int i = 0; i < 3; i++) {
  18. /*** start: check if player won ***/
  19. if (board[i][0] == player && board[i][1] == player && board[i][2] == player) return 1;
  20. if (board[0][i] == player && board[1][i] == player && board[2][i] == player) return 1;
  21. if (board[0][0] == player && board[1][1] == player && board[2][2] == player) return 1;
  22. if (board[0][2] == player && board[1][1] == player && board[2][0] == player) return 1;
  23. /*** end: check if player won ***/
  24. for (int j = 0; j < 3; j++)
  25. if (board[i][j] == 0) free++;
  26. }
  27. if (free == 0) return 0; //end of game - remis
  28. /*** start: check for loosing***/
  29. player = player == 1 ? 2 : 1; //switch player to opponent
  30. int best = -1;
  31. for (int i = 0; i < 3; i++) {
  32. for (int j = 0; j < 3; j++) {
  33. if (board[i][j] == 0) {
  34. board[i][j] = player;
  35. var score = move(board, player);
  36. board[i][j] = 0;
  37. if (score == 1) //opponent win - player loose!!!;
  38. return -1;
  39. best = score > best ? score : best;
  40. }
  41. }
  42. }
  43. return -1 * best; //bast can be -1 (not loose) , or 0 remis
  44. /*** end: check for loosing ***/
  45. }


תגיות:
שתף את הסיפור הזה:

תגובות(0)

השאירו תגובה

קפטצ'ה לא מתאימה

תגובה