1. package com.zjh.game;
  2. import java.awt.Color;
  3. import java.awt.Dimension;
  4. import java.awt.Graphics;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.MouseAdapter;
  8. import java.awt.event.MouseEvent;
  9. import java.awt.event.WindowAdapter;
  10. import java.awt.event.WindowEvent;
  11. import javax.swing.JFrame;
  12. import javax.swing.JMenu;
  13. import javax.swing.JMenuBar;
  14. import javax.swing.JMenuItem;
  15. import javax.swing.JOptionPane;
  16. import javax.swing.JPanel;
  17. /**
  18. *
  19. * @author sky
  20. *
  21. */
  22. public class FiveChessGame {
  23. /**
  24. * 控件属性
  25. */
  26. private JFrame frame; // 五子棋游戏的窗口框架
  27. private GameMap map; // 五子棋游戏的窗口容器
  28. private JMenuBar bar; // 菜单
  29. private JMenu game; // 菜单项
  30. private JMenuItem[] items; // 菜单下拉项
  31. /**
  32. * 静态数据属性
  33. */
  34. private static final int BOARD_SIZE = 15; // 棋盘大小(15 * 15)
  35. private static final int ROW_WIDTH = 36; // 间距
  36. private static final int SPACE = ROW_WIDTH / 2; // 上下边间距
  37. /**
  38. * 数据属性
  39. */
  40. private boolean player; // true黑,false白
  41. private char[][] board; // 后台虚拟棋盘
  42. public FiveChessGame() {
  43. player = true; // 游戏先黑子下
  44. board = new char[BOARD_SIZE][BOARD_SIZE]; // 建立后台虚拟棋盘
  45. clearMap();
  46. createGUI();
  47. }
  48. /**
  49. * 对GUI控件的创建
  50. */
  51. private void createGUI() {
  52. frame = new JFrame("五子棋"); // 实现五子棋游戏窗口框架
  53. bar = new JMenuBar(); // 建立菜单栏
  54. game = new JMenu("游戏"); // 建立名为“游戏”的菜单
  55. items = new JMenuItem[2]; // game菜单下创建2个子菜单项
  56. game.add(items[0] = new JMenuItem("重新开始"));// 第一个子菜单为“重新开始”
  57. game.add(items[1] = new JMenuItem("退出")); // 第二个子菜单为“退出”
  58. bar.add(game); // 菜单项加入菜单栏
  59. map = new GameMap(); // 实现五子棋游戏窗口容器
  60. map.setPreferredSize(new Dimension(ROW_WIDTH * (BOARD_SIZE - 1)
  61. SPACE* 2, ROW_WIDTH * (BOARD_SIZE - 1) SPACE * 2)); // 设置容器大小
  62. frame.setJMenuBar(bar);
  63. frame.add(map);
  64. frame.pack();
  65. frame.setLocation(1200, 200);
  66. frame.setResizable(false);
  67. frame.setVisible(true);
  68. frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  69. }
  70. /**
  71. * 清空棋子
  72. */
  73. protected void clearMap() {
  74. for (int i = 0; i < BOARD_SIZE; i ) {
  75. for (int j = 0; j < BOARD_SIZE; j ) {
  76. board[i][j] = ' ';
  77. }
  78. }
  79. }
  80. /**
  81. * 运行游戏
  82. */
  83. public void start() {
  84. map.addMouseListener(new MouseAdapter() {
  85. // 鼠标点击事件
  86. public void mouseClicked(MouseEvent e) {
  87. // 将用户鼠标事件的座标转换成棋子数组的座标。
  88. int xPos = (int) (e.getX() / ROW_WIDTH);
  89. int yPos = (int) (e.getY() / ROW_WIDTH);
  90. if (board[xPos][yPos] == ' ') {// 判断是否下过棋
  91. board[xPos][yPos] = player ? 'b' : 'w'; // 给虚拟键盘赋值
  92. map.repaint(); // 通过读取board数组进行贴图
  93. if (isWin(xPos, yPos)) {// 如果有满足胜利条件的玩家了
  94. map.repaint(); // 刷新图像
  95. String str = player ? "黑方胜利" : "白方胜利";
  96. JOptionPane.showMessageDialog(null, str, "游戏结束",
  97. JOptionPane.PLAIN_MESSAGE); // 弹出消息框
  98. clearMap(); // 清空棋盘
  99. map.repaint(); // 刷新棋盘
  100. player = true; // 新一局继续黑子先下
  101. } else {
  102. player = player ? false : true; // 切换玩家
  103. }
  104. }
  105. }
  106. });
  107. // 点击重新开始事件
  108. items[0].addActionListener(new ActionListener() {
  109. public void actionPerformed(ActionEvent e) {
  110. String str = "是否要重新开始游戏?";
  111. // 添加消息对话框
  112. if (JOptionPane.showConfirmDialog(null, str, "重新开始",
  113. JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
  114. clearMap(); // 清空棋盘
  115. map.repaint(); // 刷新棋盘
  116. player = true; // 玩家为黑棋
  117. }
  118. }
  119. });
  120. // 点击退出事件
  121. items[1].addActionListener(new ActionListener() {
  122. public void actionPerformed(ActionEvent e) {
  123. String str = "是否要退出游戏?";
  124. // 添加消息对话框
  125. if (JOptionPane.showConfirmDialog(null, str, "重新开始",
  126. JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
  127. System.exit(0); // 退出
  128. }
  129. }
  130. });
  131. // 点关闭按钮事件
  132. frame.addWindowListener(new WindowAdapter() {
  133. public void windowClosing(WindowEvent e) {
  134. String str = "是否要退出游戏?";
  135. // 添加消息对话框
  136. if (JOptionPane.showConfirmDialog(null, str, "退出游戏",
  137. JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
  138. System.exit(0); // 退出
  139. }
  140. }
  141. });
  142. }
  143. /**
  144. * 纵向找
  145. */
  146. protected boolean find(int x, int y) {
  147. int i, num = 1;
  148. char temp = player ? 'b' : 'w';
  149. for (i = x 1; i < 15; i ) {// 向下找
  150. if (board[i][y] == temp) {
  151. num ;
  152. if (num == 5) {
  153. return true;
  154. }
  155. } else {
  156. break;
  157. }
  158. }
  159. for (i = x - 1; i >= 0; i--) {// 向上找
  160. if (board[i][y] == temp) {
  161. num ;
  162. if (num == 5) {
  163. return true;
  164. }
  165. } else {
  166. break;
  167. }
  168. }
  169. return false;
  170. }
  171. /**
  172. * 横向找
  173. */
  174. protected boolean find2(int x, int y) {
  175. int i, num = 1;
  176. char temp = player ? 'b' : 'w';
  177. for (i = y 1; i < 15; i ) { // 向右找
  178. if (board[x][i] == temp) {
  179. num ;
  180. if (num == 5) {
  181. return true;
  182. }
  183. } else {
  184. break;
  185. }
  186. }
  187. for (i = y - 1; i >= 0; i--) {// 向左找
  188. if (board[x][i] == temp) {
  189. num ;
  190. if (num == 5) {
  191. return true;
  192. }
  193. } else {
  194. break;
  195. }
  196. }
  197. return false;
  198. }
  199. /**
  200. * \方向
  201. */
  202. protected boolean find3(int x, int y) {
  203. int i, j, num = 1;
  204. char temp = player ? 'b' : 'w';
  205. for (i = x 1, j = y 1; i < 15 && j < 15; i , j ) {// 向下方
  206. if (board[i][j] == temp) {
  207. num ;
  208. if (num == 5) {
  209. return true;
  210. }
  211. } else {
  212. break;
  213. }
  214. }
  215. for (i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {// 向上方
  216. if (board[i][j] == temp) {
  217. num ;
  218. if (num == 5) {
  219. return true;
  220. }
  221. } else {
  222. break;
  223. }
  224. }
  225. return false;
  226. }
  227. /**
  228. * /方向
  229. */
  230. protected boolean find4(int x, int y) {
  231. int i, j, num = 1;
  232. char temp = player ? 'b' : 'w';
  233. for (i = x 1, j = y - 1; i < 15 && j >= 0; i , j--) {// 向下
  234. if (board[i][j] == temp) {
  235. num ;
  236. if (num == 5) {
  237. return true;
  238. }
  239. } else {
  240. break;
  241. }
  242. }
  243. for (i = x - 1, j = y 1; i >= 0 && j < 15; i--, j ) { // 向上
  244. if (board[i][j] == temp) {
  245. num ;
  246. if (num == 5) {
  247. return true;
  248. }
  249. } else {
  250. break;
  251. }
  252. }
  253. return false;
  254. }
  255. /**
  256. *判断胜负
  257. */
  258. protected boolean isWin(int x, int y) {
  259. return (find(x, y) || find2(x, y) || find3(x, y) || find4(x, y));
  260. }
  261. /**
  262. * 内部容器类,用于实现图像处理
  263. */
  264. private class GameMap extends JPanel {
  265. private static final long serialVersionUID = 16578987565248L;
  266. public void paintComponent(Graphics g) {
  267. super.paintComponent(g);
  268. // 棋盘
  269. g.setColor(new Color(200, 100, 50)); // 设为桔黄色
  270. g.fillRect(0, 0, ROW_WIDTH * (BOARD_SIZE 1), ROW_WIDTH
  271. * (BOARD_SIZE 1)); // 填充棋盘
  272. g.setColor(Color.black); // 设为黑色
  273. for (int i = 0; i < BOARD_SIZE; i ) {// 画竖线
  274. g.drawLine(SPACE ROW_WIDTH * i, SPACE, SPACE ROW_WIDTH * i,
  275. SPACE ROW_WIDTH * (BOARD_SIZE - 1));
  276. }
  277. for (int i = 0; i < BOARD_SIZE; i ) {// 画横线
  278. g.drawLine(SPACE, SPACE ROW_WIDTH * i, SPACE ROW_WIDTH
  279. * (BOARD_SIZE - 1), SPACE ROW_WIDTH * i);
  280. }
  281. // 画点
  282. g.fillOval(SPACE 3 * ROW_WIDTH - 3, SPACE 3 * ROW_WIDTH - 3, 7, 7);
  283. g.fillOval(SPACE 11 * ROW_WIDTH - 3, SPACE 3 * ROW_WIDTH - 3, 7, 7);
  284. g.fillOval(SPACE 3 * ROW_WIDTH - 3, SPACE 11 * ROW_WIDTH - 3, 7, 7);
  285. g.fillOval(SPACE 7 * ROW_WIDTH - 3, SPACE 7 * ROW_WIDTH - 3, 7, 7);
  286. g.fillOval(SPACE 11 * ROW_WIDTH - 3, SPACE 11 * ROW_WIDTH - 3, 7, 7);
  287. // 棋子
  288. // 遍历数组,绘制棋子。
  289. for (int i = 0; i < BOARD_SIZE; i ) {
  290. for (int j = 0; j < BOARD_SIZE; j ) {
  291. if (board[i][j] == 'b') {// 绘制黑棋
  292. g.setColor(Color.black);
  293. g.fillOval(SPACE i * ROW_WIDTH - ROW_WIDTH / 2, SPACE
  294. j * ROW_WIDTH - ROW_WIDTH / 2, ROW_WIDTH,
  295. ROW_WIDTH);
  296. }
  297. if (board[i][j] == 'w') {// 绘制白棋
  298. g.setColor(Color.white);
  299. g.fillOval(SPACE i * ROW_WIDTH - ROW_WIDTH / 2, SPACE
  300. j * ROW_WIDTH - ROW_WIDTH / 2, ROW_WIDTH,
  301. ROW_WIDTH);
  302. }
  303. }
  304. }
  305. }
  306. }
  307. public static void main(String[] args) {
  308. FiveChessGame game = new FiveChessGame();
  309. game.start();
  310. System.out.println("测试成功");
  311. }
  312. }

运行效果:

java做五子棋(Java实现小游戏五子棋)(1)

,