Java_Class 16方格拼图游戏
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
GameFrame frame = new GameFrame();
frame.setTitle("Game");
}
}
import java.awt.*;
import java.awt.event.*;
import java.util.Random; import javax.swing.*;
import javax.swing.border.LineBorder; public class GameFrame extends JFrame {
/**
* 菜单栏
*/
JMenuBar menuBar;
/**
* "菜单"选项
*/
JMenu menu;
/**
* "帮助"选项
*/
JMenu help;
/**
* "重新开始"选项
*/
JMenuItem mItem1;
/**
* "退出"选项
*/
JMenuItem mItem2;
/**
* "关于"选项
*/
JMenuItem hItem;
/**
* 游戏面板
*/
JPanel panel;
/**
* 游戏中的按钮
*/
JButton buttons[] = new JButton[16];
/**
* 按钮监听器
*/
GameListener listener;
/**
* 背景颜色
*/
Color backgruond = Color.DARK_GRAY;
/**
* 前景颜色
*/
Color foreground = Color.WHITE;
/**
* 游戏中的字体
*/
Font font = new Font("Consolas", Font.PLAIN, 14); public GameFrame() {
// TODO Auto-generated constructor stub
setSize(500, 520);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE); menuBar = new JMenuBar();
menu = new JMenu("Menu");
menu.setForeground(foreground);
menu.setFont(font);
mItem1 = new JMenuItem("Restart");
mItem1.setFont(font);
mItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
init();
}
});
mItem2 = new JMenuItem("Exit");
mItem2.setFont(font);
mItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(mItem1);
menu.add(mItem2);
help = new JMenu("Help");
help.setForeground(foreground);
help.setFont(font);
hItem = new JMenuItem("About");
hItem.setFont(font);
hItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Maked by : 胡靖");
}
});
help.add(hItem);
menuBar.add(menu);
menuBar.add(help);
menuBar.setBackground(backgruond);
setJMenuBar(menuBar); panel = new JPanel();
panel.setLayout(new GridLayout(4, 4));
add(panel); setTitle("Loading...");
listener = new GameListener(buttons);
for (int i = 0; i < 16; i++) {
if (i == 15)
buttons[i] = new JButton(" ");
else
buttons[i] = new JButton("" + (i + 1));
buttons[i].setBackground(backgruond);
buttons[i].setForeground(foreground);
buttons[i].setBorder(new LineBorder(Color.GRAY));
buttons[i].setFont(new Font("Consolas", Font.PLAIN, 40));
buttons[i].addActionListener(listener);
panel.add(buttons[i]);
}
gameOn(); validate(); }
/**
* 初始话第一次游戏,并有动态初始化效果
*/
public void gameOn() {
for (int i = 0; i < 16; i++)
buttons[i].setEnabled(false);
menu.setEnabled(false);
help.setEnabled(false);
Random random = new Random();
int d[] = { -4, 1, -1, 4 };
int p = 15;
for (int i = 0; i < 1000; i++) { // 打乱的次数
int tmp = random.nextInt(4);
int next = p + d[tmp];
if (p % 4 == 0 && next % 4 == 3 || p % 4 == 3 && next % 4 == 0)
continue;
if (next >= 0 && next < 16) {
String s = buttons[p].getText();
buttons[p].setText(buttons[next].getText());
buttons[next].setText(s);
p = next;
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
judge();
for (int i = 0; i < 16; i++)
buttons[i].setEnabled(true);
menu.setEnabled(true);
help.setEnabled(true);
}
/**
* 重新开始游戏的初始化,与第一次游戏使用的初始化方式不同
*/
public void init() {
for (int i = 0; i < 16; i++)
buttons[i].setEnabled(false);
Random random = new Random();
boolean flag[] = new boolean[16];
for (int i = 0; i < 16; i++) {
int tmp = random.nextInt(16);
while (flag[tmp])
tmp = random.nextInt(16);
if (tmp == 15)
buttons[i].setText(" ");
else
buttons[i].setText("" + (tmp + 1));
flag[tmp] = true;
}
judge();
for (int i = 0; i < 16; i++)
buttons[i].setEnabled(true);
}
/**
* 判断生成的序列是否可行,如果不可行交换任意相邻两个按钮的文本即可
*/
public void judge() {
int sum = 0;
int a[] = new int[16];
for (int i = 0; i < 16; i++) {
String s = buttons[i].getText();
if (s.equals(" "))
a[i] = 0;
else
a[i] = Integer.parseInt(s);
}
for (int i = 0; i < 15; i++) {
if (a[i] == 0) {
sum += i % 4;
sum += i / 4;
continue;
}
for (int j = i + 1; j < 16; j++)
if (a[i] > a[j])
sum++;
}
if (sum % 2 == 0) {
String s = buttons[0].getText();
buttons[0].setText(buttons[1].getText());
buttons[1].setText(s);
}
}
}
import java.awt.event.*; import javax.swing.JButton;
import javax.swing.JOptionPane; public class GameListener implements ActionListener {
/**
* 游戏中的按钮,传进来的参数
*/
JButton[] button = new JButton[16];
/**
* 四个方向
*/
int[] d = { -4, 1, -1, 4 }; public GameListener(JButton[] button) {
// TODO Auto-generated constructor stub
this.button = button;
}
/**
* 监听到动作后执行的方法
*/
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton jButton = (JButton) e.getSource();
if (jButton.getText().equals(" "))
return;
int position = 0;
for (int i = 0; i < 16; i++) {
if (jButton == button[i]) {
position = i;
break;
}
}
for (int i = 0; i < 4; i++) {
int next = position + d[i];
if (position % 4 == 0 && next % 4 == 3 || position % 4 == 3 && next % 4 == 0)
continue;
if (next >= 0 && next < 16 && button[next].getText().equals(" ")) {
String s = button[position].getText();
button[position].setText(button[next].getText());
button[next].setText(s);
break;
}
}
boolean win1 = true;
boolean win2 = true;
if (!button[15].getText().equals(" "))
win1 = false;
for (int i = 0; i < 15 && win1; i++)
if (!button[i].getText().equals("" + (i + 1)))
win1 = false;
if (!button[0].getText().equals(" "))
win2 = false;
for (int i = 1; i < 16 && win2; i++)
if (!button[i].getText().equals("" + (16 - i)))
win2 = false;
if (win1 || win2) {
for (int i = 0; i < 16; i++)
button[i].setEnabled(false);
JOptionPane.showMessageDialog(null, "Congratulations!\nYou win.");
}
} }
Java_Class 16方格拼图游戏的更多相关文章
- 拼图游戏js
实现算法: 1. JavaScript动态生成拼图:通过生成16个div,且除最后一个div不使用背景图片以外,其他div都设置拼图图片为背景.然后通过调整background-position来实现 ...
- C#实现拼图游戏
C#实现<拼图游戏> (下) 原理篇 前言:在 http://www.cnblogs.com/labixiaohei/p/6698887.html 程序设计 之 C#实现<拼图游 ...
- 利用Vue.js实现拼图游戏
之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/luozhihao/p/5 ...
- atitit.html5 拼图游戏的解决之道.
atitit.html5 拼图游戏的解决之道. 1. 拼图游戏的操作(点击法and 拖动法) 1 1. 支持键盘上.下.左.右键移动: 1 2. 支持点击空白模块中的上下左右箭头移动: 1 3. 支持 ...
- Vue.js实现拼图游戏
Vue.js实现拼图游戏 之前写过一篇<基于Vue.js的表格分页组件>的文章,主要介绍了Vue组件的编写方法,有兴趣的可以访问这里进行阅读:http://www.cnblogs.com/ ...
- 程序设计 之 C#实现《拼图游戏》 (下) 原理篇
前言:在 http://www.cnblogs.com/labixiaohei/p/6698887.html 程序设计 之 C#实现<拼图游戏>(上),上传了各模块代码,而在本文中将详细剖 ...
- html+css+js实现网页拼图游戏
代码地址如下:http://www.demodashi.com/demo/14449.html 项目描述 使用 html+js+css 实现一个网页拼图游戏,可支持简单,中等,困难三种难度. 演示效果 ...
- 一款html拼图游戏详解
本文是爱编程原创翻译,转载请看清文末的转载要求,谢谢合作! 游戏介绍 这篇文章是献给web游戏开发者用简单的开发工具开发一款游戏.此文介绍了用html.css.javascript只需简单和几个步骤开 ...
- JavaScript拼图游戏
今天是2016年最后一天上班了.最近几天都比较休闲,有时间空闲下来写写文档之类的. 2016过得真是快.感觉没做什么就过去了.想到之前想坚持每个月写一写博客都没坚持到.希望2017年可以吧. 无聊之余 ...
随机推荐
- Atitit J2EE平台相关规范--39个 3.J2SE平台相关规范--42个
Atitit J2EE平台相关规范--39个 3.J2SE平台相关规范--42个 2.J2EE平台相关规范--39个5 XML Parsing Specification16 J2EE Conne ...
- Atitit 图像处理之理解卷积attilax总结
Atitit 图像处理之理解卷积attilax总结 卷积的运算可以分为反转.平移,相乘,求和. 在图像处理中,图像是一个大矩阵,卷积模板是一个小矩阵.按照上述过程,就是先把小矩阵反转,然 ...
- Java Annotation 总结
Annotation 被称为注解,在Java开发中是相当常见的,通过注解,我们可以简化代码提高开发效率.例如Override Annotation,这个应该算是在开发过程中使用最多的注解了.下面这个例 ...
- 通过Class获取标签,兼容的几种思路
在js中通过document.getElementsByClassName()在低版本IE浏览器中不兼容.然后我写了几种方案,大家可以参考参考. html代码 <!DOCTYPE html> ...
- CSS实战中经常出现的问题。
如果你把这些当做文章来看,那你始终是学不会,而是应该当做手册来看,这些也是自己在写网站遇到的问题.转载请出处. 追梦子前端博客. 1. logo添加内容给h1设置text-index:-9999px的 ...
- Android入门(九)文件存储与SharedPreferences存储
原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然, ...
- 理解CSS中的数学表达式calc()
前面的话 数学表达式calc()是CSS中的函数,主要用于数学运算.使用calc()为页面元素布局提供了便利和新的思路.本文将介绍calc()的相关内容 定义 数学表达式calc()是calculat ...
- CSS光标cursor
前面的话 在浏览器中,光标对于提供交互反馈很有用.通过在不同的场景中改变光标,就能赋予其不同的含义 定义 cursor光标 值: [<uri>,]*[auto | default | po ...
- 【原创】.NET读写Excel工具Spire.Xls使用(5)重量级的Excel图表功能
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html .NET读写Excel工具Spire.Xls使用文章 ...
- iOS_UIImage_图片旋转
一.目的: 有时候我们获得到的图片我们不是我们想要的方向,需要对图片进行旋转.比如:图片旋转90度180度等. 二.实现过程. 1.获取到该UIImage. 2.开启上下文. 3.上下文的具体操作. ...