Гомоку (аналог шашек), рандомное расположение шашек - Java

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите, пожалуйста, переделать код так, чтобы шашки появлялись не по щелчку, а рандомно (т.е. чтобы программа сама выбирала место)
Листинг программы
  1. import java.awt.Dimension;
  2. import java.awt.Graphics;
  3. import java.awt.Graphics2D;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.awt.event.MouseEvent;
  7. import java.awt.event.MouseListener;
  8. import javax.swing.JFrame;
  9. import javax.swing.JMenu;
  10. import javax.swing.JMenuBar;
  11. import javax.swing.JMenuItem;
  12. import javax.swing.JOptionPane;
  13. import javax.swing.JPanel;
  14. @SuppressWarnings("serial")
  15. public class gomoku extends JPanel
  16. implements ActionListener, MouseListener {
  17. private enum Pieces {
  18. WHITE,
  19. BLACK,
  20. NOT_USED;
  21. }
  22. private final static int ROWS = 10;
  23. private final static int COLUMNS = 10;
  24. private final static int SIDE = 32;
  25. private boolean isBlack;
  26. private Graphics2D g2d;
  27. private Pieces[][] pieces;
  28. private static JFrame frame;
  29. private static JMenuBar menuBar;
  30. public gomoku () {
  31. isBlack = true;
  32. pieces = new Pieces[COLUMNS - 1][ROWS - 1];
  33. frame = new JFrame();
  34. menuBar = new JMenuBar();
  35. JMenu menu = new JMenu("Game");
  36. JMenuItem resetAction = new JMenuItem("Reset");
  37. JMenuItem exitAction = new JMenuItem("Exit");
  38. resetAction.addActionListener(this);
  39. exitAction.addActionListener(this);
  40. menu.add(resetAction);
  41. menu.add(exitAction);
  42. menuBar.add(menu);
  43. resetBoard();
  44. setPreferredSize(new Dimension(COLUMNS * SIDE, ROWS * SIDE));
  45. addMouseListener(this);
  46. }
  47. @Override
  48. public void paintComponent(Graphics g) {
  49. super.paintComponent(g);
  50. g2d = (Graphics2D) g;
  51. drawBoard(g2d);
  52. drawPieces(g2d);
  53. }
  54. @Override
  55. public void actionPerformed(ActionEvent e) {
  56. if (e.getActionCommand().equals("Reset")) {
  57. resetBoard();
  58. this.repaint();
  59. }
  60. else
  61. frame.dispose();
  62. }
  63. @Override
  64. public void mouseClicked(MouseEvent e) {
  65. updateBoard(e.getX(), e.getY());
  66. this.repaint();
  67. }
  68. @Override
  69. public void mouseEntered(MouseEvent e) {
  70. }
  71. @Override
  72. public void mouseExited(MouseEvent e) {
  73. }
  74. @Override
  75. public void mousePressed(MouseEvent e) {
  76. }
  77. @Override
  78. public void mouseReleased(MouseEvent e) {
  79. }
  80. private void drawBoard(Graphics2D g) {
  81. g.drawLine(0, 0, COLUMNS * SIDE, 0);
  82. g.drawLine(0, ROWS * SIDE, COLUMNS * SIDE, ROWS * SIDE);
  83. g.drawLine(0, 0, 0, ROWS * SIDE);
  84. g.drawLine(COLUMNS * SIDE, 0 * SIDE, COLUMNS * SIDE, ROWS * SIDE);
  85. for (int i = 1; i < ROWS; i++) {
  86. g.drawLine(0, SIDE * i, SIDE / 2, SIDE * i);
  87. g.drawLine(COLUMNS * SIDE - (SIDE / 2), SIDE * i,
  88. COLUMNS * SIDE, SIDE * i);
  89. }
  90. for (int j = 1; j < COLUMNS; j++) {
  91. g.drawLine(SIDE * j, 0, SIDE * j, SIDE / 2);
  92. g.drawLine(SIDE * j, SIDE * ROWS - (SIDE / 2),
  93. j * SIDE, ROWS * SIDE);
  94. }
  95. for (int i = 0; i < COLUMNS - 1; i++) {
  96. for (int j = 0; j < ROWS - 1; j++) {
  97. if (pieces[i][j] == Pieces.NOT_USED) {
  98. g.drawLine((SIDE / 2) + (i * SIDE),
  99. (j + 1) * SIDE,
  100. ((SIDE / 2) + ((i + 1) * SIDE)),
  101. (j + 1) * SIDE);
  102. g.drawLine((i + 1) * SIDE,
  103. (SIDE / 2) + (j * SIDE),
  104. (i + 1) * SIDE,
  105. (SIDE / 2) + ((j + 1) * SIDE));
  106. }
  107. }
  108. }
  109. }
  110. private void drawPieces(Graphics2D g) {
  111. for (int i = 0; i < COLUMNS - 1; i++) {
  112. for (int j = 0; j < ROWS - 1; j++) {
  113. if (pieces[i][j] != Pieces.NOT_USED) {
  114. int x = i * SIDE;
  115. int y = j * SIDE;
  116. if (pieces[i][j] == Pieces.BLACK) {
  117. g.fillOval(x + (SIDE / 2), y + (SIDE / 2), SIDE, SIDE);
  118. }
  119. if (pieces[i][j] == Pieces.WHITE) {
  120. g.drawOval(x + (SIDE / 2), y + (SIDE / 2), SIDE, SIDE);
  121. }
  122. }
  123. }
  124. }
  125. }
  126. private void updateBoard(int x, int y) {
  127. int centreX, centreY;
  128. if (x % SIDE <= SIDE / 2) {
  129. centreX = x / SIDE - 1;
  130. }
  131. else {
  132. centreX = x / SIDE;
  133. }
  134. if (y % SIDE <= SIDE / 2) {
  135. centreY = y / SIDE - 1;
  136. }
  137. else {
  138. centreY = y / SIDE;
  139. }
  140. if (centreX < 0 || centreY < 0 || centreX > (COLUMNS - 2)
  141. || centreY > (ROWS - 2)) {
  142. JOptionPane.showMessageDialog(null,
  143. "You cannot place a piece here.");
  144. }
  145. else {
  146. if (pieces[centreX][centreY] != Pieces.NOT_USED) {
  147. JOptionPane.showMessageDialog(null,
  148. "You cannot place a piece above another one.");
  149. }
  150. else {
  151. pieces[centreX][centreY] =
  152. (isBlack) ? Pieces.BLACK : Pieces.WHITE;
  153. isBlack = !isBlack;
  154. this.repaint();
  155. }
  156. }
  157. }
  158. private void resetBoard() {
  159. for (int i = 0; i < COLUMNS - 1; i++) {
  160. for (int j = 0; j < ROWS - 1; j++) {
  161. pieces[i][j] = Pieces.NOT_USED;
  162. }
  163. }
  164. }
  165. private static void createAndShowGUI() {
  166. JPanel panel = new gomoku();
  167. frame.setTitle("Connect Five");
  168. frame.setJMenuBar(menuBar);
  169. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  170. frame.add(panel);
  171. frame.pack();
  172. frame.setResizable(false);
  173. frame.setVisible(true);
  174. }
  175. public static void main(String[] args) {
  176. javax.swing.SwingUtilities.invokeLater(new Runnable() {
  177. public void run() {
  178. createAndShowGUI();
  179. }
  180. });
  181. }
  182. }

Решение задачи: «Гомоку (аналог шашек), рандомное расположение шашек»

textual
Листинг программы
  1. import javax.swing.*;
  2. import java.awt.*;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.awt.event.MouseEvent;
  6. import java.awt.event.MouseListener;
  7. import java.util.Random;
  8.  
  9.  
  10. @SuppressWarnings("serial")
  11. public class gomoku extends JPanel
  12.         implements ActionListener, MouseListener {
  13.     private enum Pieces {
  14.         WHITE,
  15.         BLACK,
  16.         NOT_USED;
  17.     }
  18.  
  19.     private final static int ROWS = 10;
  20.     private final static int COLUMNS = 10;
  21.     private final static int SIDE = 32;
  22.     private boolean isBlack;
  23.     private Graphics2D g2d;
  24.     private Pieces[][] pieces;
  25.     private static JFrame frame;
  26.     private static JMenuBar menuBar;
  27.  
  28.     public gomoku() {
  29.         isBlack = true;
  30.         pieces = new Pieces[COLUMNS - 1][ROWS - 1];
  31.         frame = new JFrame();
  32.         menuBar = new JMenuBar();
  33.         JMenu menu = new JMenu("Game");
  34.         JMenuItem resetAction = new JMenuItem("Reset");
  35.         JMenuItem exitAction = new JMenuItem("Exit");
  36.         resetAction.addActionListener(this);
  37.         exitAction.addActionListener(this);
  38.         menu.add(resetAction);
  39.         menu.add(exitAction);
  40.         menuBar.add(menu);
  41.  
  42.         resetBoard();
  43.         setPreferredSize(new Dimension(COLUMNS * SIDE, ROWS * SIDE));
  44.         addMouseListener(this);
  45.     }
  46.  
  47.     @Override
  48.     public void paintComponent(Graphics g) {
  49.         super.paintComponent(g);
  50.         g2d = (Graphics2D) g;
  51.         drawBoard(g2d);
  52.         drawPieces(g2d);
  53.     }
  54.  
  55.     @Override
  56.     public void actionPerformed(ActionEvent e) {
  57.         if (e.getActionCommand().equals("Reset")) {
  58.             resetBoard();
  59.             this.repaint();
  60.         } else
  61.             frame.dispose();
  62.     }
  63.  
  64.     @Override
  65.     public void mouseClicked(MouseEvent e) {
  66.         updateBoard(e.getX(), e.getY());
  67.         this.repaint();
  68.     }
  69.  
  70.     @Override
  71.     public void mouseEntered(MouseEvent e) {
  72.     }
  73.  
  74.     @Override
  75.     public void mouseExited(MouseEvent e) {
  76.     }
  77.  
  78.     @Override
  79.     public void mousePressed(MouseEvent e) {
  80.     }
  81.  
  82.     @Override
  83.     public void mouseReleased(MouseEvent e) {
  84.     }
  85.  
  86.     private void drawBoard(Graphics2D g) {
  87.         g.drawLine(0, 0, COLUMNS * SIDE, 0);
  88.         g.drawLine(0, ROWS * SIDE, COLUMNS * SIDE, ROWS * SIDE);
  89.         g.drawLine(0, 0, 0, ROWS * SIDE);
  90.         g.drawLine(COLUMNS * SIDE, 0 * SIDE, COLUMNS * SIDE, ROWS * SIDE);
  91.         for (int i = 1; i < ROWS; i++) {
  92.             g.drawLine(0, SIDE * i, SIDE / 2, SIDE * i);
  93.             g.drawLine(COLUMNS * SIDE - (SIDE / 2), SIDE * i,
  94.                     COLUMNS * SIDE, SIDE * i);
  95.         }
  96.         for (int j = 1; j < COLUMNS; j++) {
  97.             g.drawLine(SIDE * j, 0, SIDE * j, SIDE / 2);
  98.             g.drawLine(SIDE * j, SIDE * ROWS - (SIDE / 2),
  99.                     j * SIDE, ROWS * SIDE);
  100.         }
  101.         for (int i = 0; i < COLUMNS - 1; i++) {
  102.             for (int j = 0; j < ROWS - 1; j++) {
  103.                 if (pieces[i][j] == Pieces.NOT_USED) {
  104.                     g.drawLine((SIDE / 2) + (i * SIDE),
  105.                             (j + 1) * SIDE,
  106.                             ((SIDE / 2) + ((i + 1) * SIDE)),
  107.                             (j + 1) * SIDE);
  108.                     g.drawLine((i + 1) * SIDE,
  109.                             (SIDE / 2) + (j * SIDE),
  110.                             (i + 1) * SIDE,
  111.                             (SIDE / 2) + ((j + 1) * SIDE));
  112.                 }
  113.             }
  114.         }
  115.     }
  116.  
  117.     private void drawPieces(Graphics2D g) {
  118.         for (int i = 0; i < COLUMNS - 1; i++) {
  119.             for (int j = 0; j < ROWS - 1; j++) {
  120.                 if (pieces[i][j] != Pieces.NOT_USED) {
  121.                     int x = i * SIDE;
  122.                     int y = j * SIDE;
  123.                     if (pieces[i][j] == Pieces.BLACK) {
  124.                         g.fillOval(x + (SIDE / 2), y + (SIDE / 2), SIDE, SIDE);
  125.                     }
  126.                     if (pieces[i][j] == Pieces.WHITE) {
  127.                         g.drawOval(x + (SIDE / 2), y + (SIDE / 2), SIDE, SIDE);
  128.                     }
  129.                 }
  130.             }
  131.         }
  132.     }
  133.  
  134.     private void nextMove() {
  135.         Random rnd = new Random();
  136.         int x;
  137.         int y;
  138.         int centreX = 0;
  139.         int centreY = 0;
  140.  
  141.         for (int i = 0; i < 100; i++) {  // trying to set chess
  142.             x = rnd.nextInt(280) + 20;
  143.             y = rnd.nextInt(280) + 20;
  144.  
  145.             if (x % SIDE <= SIDE / 2) {
  146.                 centreX = x / SIDE - 1;
  147.             } else {
  148.                 centreX = x / SIDE;
  149.             }
  150.             if (y % SIDE <= SIDE / 2) {
  151.                 centreY = y / SIDE - 1;
  152.             } else {
  153.                 centreY = y / SIDE;
  154.             }
  155.             try {
  156.                 if (pieces[centreX][centreY] != Pieces.NOT_USED) {  // занято
  157.                     continue;
  158.                 }
  159.             } catch (ArrayIndexOutOfBoundsException e) {
  160.                 continue;
  161.             }
  162.  
  163.             updateBoard(x, y);  // successful return;
  164.             return;
  165.         }
  166.  
  167.         JOptionPane.showMessageDialog(null,
  168.                 "You Win!");
  169.     }
  170.  
  171.     private void updateBoard(int x, int y) {
  172.         int centreX, centreY;
  173.         if (x % SIDE <= SIDE / 2) {
  174.             centreX = x / SIDE - 1;
  175.         } else {
  176.             centreX = x / SIDE;
  177.         }
  178.         if (y % SIDE <= SIDE / 2) {
  179.             centreY = y / SIDE - 1;
  180.         } else {
  181.             centreY = y / SIDE;
  182.         }
  183.         if (centreX < 0 || centreY < 0 || centreX > (COLUMNS - 2)
  184.                 || centreY > (ROWS - 2)) {
  185.             JOptionPane.showMessageDialog(null,
  186.                     "You cannot place a piece here.");
  187.         } else {
  188.             if (pieces[centreX][centreY] != Pieces.NOT_USED) {
  189.                 JOptionPane.showMessageDialog(null,
  190.                         "You cannot place a piece above another one.");
  191.             } else {
  192.                 pieces[centreX][centreY] =
  193.                         (isBlack) ? Pieces.BLACK : Pieces.WHITE;
  194.                 isBlack = !isBlack;
  195.                 this.repaint();
  196. //
  197.                 if (!isBlack) {
  198.                     nextMove();
  199.                 }
  200.             }
  201.         }
  202.     }
  203.  
  204.     private void resetBoard() {
  205.         for (int i = 0; i < COLUMNS - 1; i++) {
  206.             for (int j = 0; j < ROWS - 1; j++) {
  207.                 pieces[i][j] = Pieces.NOT_USED;
  208.             }
  209.         }
  210.     }
  211.  
  212.     private static void createAndShowGUI() {
  213.         JPanel panel = new gomoku();
  214.  
  215.         frame.setTitle("Connect Five");
  216.         frame.setJMenuBar(menuBar);
  217.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  218.         frame.add(panel);
  219.         frame.pack();
  220.         frame.setResizable(false);
  221.         frame.setVisible(true);
  222.     }
  223.  
  224.     public static void main(String[] args) {
  225.         javax.swing.SwingUtilities.invokeLater(new Runnable() {
  226.             public void run() {
  227.                 createAndShowGUI();
  228.             }
  229.         });
  230.     }
  231. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут