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年可以吧. 无聊之余 ...
随机推荐
- JS 操作 DOM
定义:文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式 节点:(例如:< ...
- draggable属性设置元素是否可拖动。
设置标签属性draggable="true"将一个标签内的元素拖动到另外一个标签进行显示: <!DOCTYPE HTML> <html> <head& ...
- Java-集合=第五题 (Map)设计Account 对象如下: private long id; private double balance; private String password; 要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下: List list = new ArrayList(); list.add(new A
第五题 (Map)设计Account 对象如下: private long id; private double balance; private String password; 要求完善设计,使得 ...
- SQL Server中关于跟踪(Trace)那点事
前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简 ...
- jQuery事件流的顺序
<div id="aaron"> <div id='test'> <ul> <p>点击p被委托,ul被阻止了,因为内部重写了事件对象 ...
- JS网页顶部弹出可关闭广告图层
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [Java 基础]接口
抽象类和抽象方法 抽象方法 在面向对象编程语言中抽象方法指一些只有方法声明而没有具体方法体的方法抽象方法一般存在于抽象类或接口中. java中,抽象方法就是以 abstract 修饰的方法,只需要声明 ...
- caffe中的props
VS .props解析 在VS 2010项目文件夹中属性表文件的新的格式(.props).Visual Studio 2010引入了用户设置文件(Microsoft.cpp.<Platfor ...
- .net 使用Json(),maxJsonLength属性设置的值问题
“使用JSON JavaScriptSerializer进行序列化或反序列化时出错.字符串的长度超过了为maxJsonLength属性设置的值” 今天业务找我说线上的国家地区都显示数字(地区ID),而 ...
- 实现winform DataGridView控件判断滚动条是否滚动到当前已加载的数据行底部
判断 DataGridView控件滚动条是否滚动到当前已加载的数据行底部,其实方法很简单,就是为DataGridView控件添加Scroll事件,然后写入以下代码就可以了,应用范围:可实现分部加载数据 ...