1. public class Main {
  2.  
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. GameFrame frame = new GameFrame();
  6. frame.setTitle("Game");
  7. }
  8.  
  9. }
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.Random;
  4.  
  5. import javax.swing.*;
  6. import javax.swing.border.LineBorder;
  7.  
  8. public class GameFrame extends JFrame {
  9. /**
  10. * 菜单栏
  11. */
  12. JMenuBar menuBar;
  13. /**
  14. * "菜单"选项
  15. */
  16. JMenu menu;
  17. /**
  18. * "帮助"选项
  19. */
  20. JMenu help;
  21. /**
  22. * "重新开始"选项
  23. */
  24. JMenuItem mItem1;
  25. /**
  26. * "退出"选项
  27. */
  28. JMenuItem mItem2;
  29. /**
  30. * "关于"选项
  31. */
  32. JMenuItem hItem;
  33. /**
  34. * 游戏面板
  35. */
  36. JPanel panel;
  37. /**
  38. * 游戏中的按钮
  39. */
  40. JButton buttons[] = new JButton[16];
  41. /**
  42. * 按钮监听器
  43. */
  44. GameListener listener;
  45. /**
  46. * 背景颜色
  47. */
  48. Color backgruond = Color.DARK_GRAY;
  49. /**
  50. * 前景颜色
  51. */
  52. Color foreground = Color.WHITE;
  53. /**
  54. * 游戏中的字体
  55. */
  56. Font font = new Font("Consolas", Font.PLAIN, 14);
  57.  
  58. public GameFrame() {
  59. // TODO Auto-generated constructor stub
  60. setSize(500, 520);
  61. setLocationRelativeTo(null);
  62. setResizable(false);
  63. setVisible(true);
  64. setDefaultCloseOperation(EXIT_ON_CLOSE);
  65.  
  66. menuBar = new JMenuBar();
  67. menu = new JMenu("Menu");
  68. menu.setForeground(foreground);
  69. menu.setFont(font);
  70. mItem1 = new JMenuItem("Restart");
  71. mItem1.setFont(font);
  72. mItem1.addActionListener(new ActionListener() {
  73. public void actionPerformed(ActionEvent e) {
  74. init();
  75. }
  76. });
  77. mItem2 = new JMenuItem("Exit");
  78. mItem2.setFont(font);
  79. mItem2.addActionListener(new ActionListener() {
  80. public void actionPerformed(ActionEvent e) {
  81. System.exit(0);
  82. }
  83. });
  84. menu.add(mItem1);
  85. menu.add(mItem2);
  86. help = new JMenu("Help");
  87. help.setForeground(foreground);
  88. help.setFont(font);
  89. hItem = new JMenuItem("About");
  90. hItem.setFont(font);
  91. hItem.addActionListener(new ActionListener() {
  92. public void actionPerformed(ActionEvent e) {
  93. JOptionPane.showMessageDialog(null, "Maked by : 胡靖");
  94. }
  95. });
  96. help.add(hItem);
  97. menuBar.add(menu);
  98. menuBar.add(help);
  99. menuBar.setBackground(backgruond);
  100. setJMenuBar(menuBar);
  101.  
  102. panel = new JPanel();
  103. panel.setLayout(new GridLayout(4, 4));
  104. add(panel);
  105.  
  106. setTitle("Loading...");
  107. listener = new GameListener(buttons);
  108. for (int i = 0; i < 16; i++) {
  109. if (i == 15)
  110. buttons[i] = new JButton(" ");
  111. else
  112. buttons[i] = new JButton("" + (i + 1));
  113. buttons[i].setBackground(backgruond);
  114. buttons[i].setForeground(foreground);
  115. buttons[i].setBorder(new LineBorder(Color.GRAY));
  116. buttons[i].setFont(new Font("Consolas", Font.PLAIN, 40));
  117. buttons[i].addActionListener(listener);
  118. panel.add(buttons[i]);
  119. }
  120. gameOn();
  121.  
  122. validate();
  123.  
  124. }
  125. /**
  126. * 初始话第一次游戏,并有动态初始化效果
  127. */
  128. public void gameOn() {
  129. for (int i = 0; i < 16; i++)
  130. buttons[i].setEnabled(false);
  131. menu.setEnabled(false);
  132. help.setEnabled(false);
  133. Random random = new Random();
  134. int d[] = { -4, 1, -1, 4 };
  135. int p = 15;
  136. for (int i = 0; i < 1000; i++) { // 打乱的次数
  137. int tmp = random.nextInt(4);
  138. int next = p + d[tmp];
  139. if (p % 4 == 0 && next % 4 == 3 || p % 4 == 3 && next % 4 == 0)
  140. continue;
  141. if (next >= 0 && next < 16) {
  142. String s = buttons[p].getText();
  143. buttons[p].setText(buttons[next].getText());
  144. buttons[next].setText(s);
  145. p = next;
  146. try {
  147. Thread.sleep(1);
  148. } catch (InterruptedException e) {
  149. e.printStackTrace();
  150. }
  151. }
  152. }
  153. judge();
  154. for (int i = 0; i < 16; i++)
  155. buttons[i].setEnabled(true);
  156. menu.setEnabled(true);
  157. help.setEnabled(true);
  158. }
  159. /**
  160. * 重新开始游戏的初始化,与第一次游戏使用的初始化方式不同
  161. */
  162. public void init() {
  163. for (int i = 0; i < 16; i++)
  164. buttons[i].setEnabled(false);
  165. Random random = new Random();
  166. boolean flag[] = new boolean[16];
  167. for (int i = 0; i < 16; i++) {
  168. int tmp = random.nextInt(16);
  169. while (flag[tmp])
  170. tmp = random.nextInt(16);
  171. if (tmp == 15)
  172. buttons[i].setText(" ");
  173. else
  174. buttons[i].setText("" + (tmp + 1));
  175. flag[tmp] = true;
  176. }
  177. judge();
  178. for (int i = 0; i < 16; i++)
  179. buttons[i].setEnabled(true);
  180. }
  181. /**
  182. * 判断生成的序列是否可行,如果不可行交换任意相邻两个按钮的文本即可
  183. */
  184. public void judge() {
  185. int sum = 0;
  186. int a[] = new int[16];
  187. for (int i = 0; i < 16; i++) {
  188. String s = buttons[i].getText();
  189. if (s.equals(" "))
  190. a[i] = 0;
  191. else
  192. a[i] = Integer.parseInt(s);
  193. }
  194. for (int i = 0; i < 15; i++) {
  195. if (a[i] == 0) {
  196. sum += i % 4;
  197. sum += i / 4;
  198. continue;
  199. }
  200. for (int j = i + 1; j < 16; j++)
  201. if (a[i] > a[j])
  202. sum++;
  203. }
  204. if (sum % 2 == 0) {
  205. String s = buttons[0].getText();
  206. buttons[0].setText(buttons[1].getText());
  207. buttons[1].setText(s);
  208. }
  209. }
  210. }
  1. import java.awt.event.*;
  2.  
  3. import javax.swing.JButton;
  4. import javax.swing.JOptionPane;
  5.  
  6. public class GameListener implements ActionListener {
  7. /**
  8. * 游戏中的按钮,传进来的参数
  9. */
  10. JButton[] button = new JButton[16];
  11. /**
  12. * 四个方向
  13. */
  14. int[] d = { -4, 1, -1, 4 };
  15.  
  16. public GameListener(JButton[] button) {
  17. // TODO Auto-generated constructor stub
  18. this.button = button;
  19. }
  20. /**
  21. * 监听到动作后执行的方法
  22. */
  23. public void actionPerformed(ActionEvent e) {
  24. // TODO Auto-generated method stub
  25. JButton jButton = (JButton) e.getSource();
  26. if (jButton.getText().equals(" "))
  27. return;
  28. int position = 0;
  29. for (int i = 0; i < 16; i++) {
  30. if (jButton == button[i]) {
  31. position = i;
  32. break;
  33. }
  34. }
  35. for (int i = 0; i < 4; i++) {
  36. int next = position + d[i];
  37. if (position % 4 == 0 && next % 4 == 3 || position % 4 == 3 && next % 4 == 0)
  38. continue;
  39. if (next >= 0 && next < 16 && button[next].getText().equals(" ")) {
  40. String s = button[position].getText();
  41. button[position].setText(button[next].getText());
  42. button[next].setText(s);
  43. break;
  44. }
  45. }
  46. boolean win1 = true;
  47. boolean win2 = true;
  48. if (!button[15].getText().equals(" "))
  49. win1 = false;
  50. for (int i = 0; i < 15 && win1; i++)
  51. if (!button[i].getText().equals("" + (i + 1)))
  52. win1 = false;
  53. if (!button[0].getText().equals(" "))
  54. win2 = false;
  55. for (int i = 1; i < 16 && win2; i++)
  56. if (!button[i].getText().equals("" + (16 - i)))
  57. win2 = false;
  58. if (win1 || win2) {
  59. for (int i = 0; i < 16; i++)
  60. button[i].setEnabled(false);
  61. JOptionPane.showMessageDialog(null, "Congratulations!\nYou win.");
  62. }
  63. }
  64.  
  65. }

Java_Class 16方格拼图游戏的更多相关文章

  1. 拼图游戏js

    实现算法: 1. JavaScript动态生成拼图:通过生成16个div,且除最后一个div不使用背景图片以外,其他div都设置拼图图片为背景.然后通过调整background-position来实现 ...

  2. C#实现拼图游戏

    C#实现<拼图游戏> (下) 原理篇   前言:在 http://www.cnblogs.com/labixiaohei/p/6698887.html 程序设计 之 C#实现<拼图游 ...

  3. 利用Vue.js实现拼图游戏

    之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...

  4. atitit.html5 拼图游戏的解决之道.

    atitit.html5 拼图游戏的解决之道. 1. 拼图游戏的操作(点击法and 拖动法) 1 1. 支持键盘上.下.左.右键移动: 1 2. 支持点击空白模块中的上下左右箭头移动: 1 3. 支持 ...

  5. Vue.js实现拼图游戏

    Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...

  6. 程序设计 之 C#实现《拼图游戏》 (下) 原理篇

    前言:在 http://www.cnblogs.com/labixiaohei/p/6698887.html 程序设计 之 C#实现<拼图游戏>(上),上传了各模块代码,而在本文中将详细剖 ...

  7. html+css+js实现网页拼图游戏

    代码地址如下:http://www.demodashi.com/demo/14449.html 项目描述 使用 html+js+css 实现一个网页拼图游戏,可支持简单,中等,困难三种难度. 演示效果 ...

  8. 一款html拼图游戏详解

    本文是爱编程原创翻译,转载请看清文末的转载要求,谢谢合作! 游戏介绍 这篇文章是献给web游戏开发者用简单的开发工具开发一款游戏.此文介绍了用html.css.javascript只需简单和几个步骤开 ...

  9. JavaScript拼图游戏

    今天是2016年最后一天上班了.最近几天都比较休闲,有时间空闲下来写写文档之类的. 2016过得真是快.感觉没做什么就过去了.想到之前想坚持每个月写一写博客都没坚持到.希望2017年可以吧. 无聊之余 ...

随机推荐

  1. 20_学生选课数据库SQL语句练习题1

    25.查询95033班和95031班全体学生的记录. select * from STUDENT t,SCORE s where t.sclass=95033 or t.sclass=95031 26 ...

  2. fir.im Weekly - 揭秘直播移动 APP 技术实现

    2016年直播似乎无处不在,作为一个开发者也许需要补充下关于直播技术点.本期 fir.im Weekly 整理了一些开发者对于直播实践项目中的技术经验与直播技术架构分析等内容,还有一些关于 iOS . ...

  3. jQuery_03之事件、动画、类数组操作

    一.事件: 1.模式触发事件:  ①DOM:elem.onXXX();只能触发直接用onXXX绑定的事件处理函数:用addEventistener添加的事件监听无法模拟出发触发:  ②jQuery:$ ...

  4. ES2005 js =>

    ES2005 js => 不会写js Learn ES2015

  5. js算法之最常用的排序

    引入 大学学习计算机语言的那几年,从c语言,到c++,再到数据结构JAVA..让我印象最深刻的还是最开始老师讲冒泡算法的时候,直到现在大四快毕业了我才渐渐通窍了.刚学前端的时候以为前端就是做出好看很炫 ...

  6. Callable、Future、RunnableFuture、FutureTask的原理及应用

    1. Callable.Future.RunnableFuture.FutureTask的继承关系 在多线程编程中,我们一般通过一个实现了Runnable接口的对象来创建一个线程,这个线程在内部会执行 ...

  7. 关于IIS部署时出现“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本”的问题解决摘要

    系统环境:windows2008 X64 IIS版本:iis7 oracle客户端版本:11g,另外装了32位的客户端. 网站.net framework版本: 4.0 目前状况,IIS可以正常运行, ...

  8. Java多线程系列--“JUC原子类”05之 AtomicLongFieldUpdater原子类

    概要 AtomicIntegerFieldUpdater, AtomicLongFieldUpdater和AtomicReferenceFieldUpdater这3个修改类的成员的原子类型的原理和用法 ...

  9. 你见过吗?9款超炫的复选框(Checkbox)效果

    复选框(Checkbox)在各个浏览器中的效果不一致,因此很多 Web 开发人员会自己重新设计一套界面和使用体验都更佳的复选框功能.下面就给大家分享9款超炫的复选框(Checkbox)效果,纯 CSS ...

  10. SQLServer学习笔记系列5

    一.写在前面的话 转眼又是一年清明节,话说“清明时节雨纷纷”,武汉的天气伴随着这个清明节下了一场暴雨,整个城市如海一样,朋友圈渗透着清明节武汉看海的节奏.今年又没有回老家祭祖,但是心里依然是怀念着那些 ...