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方格拼图游戏的更多相关文章

  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. ECMAScript5中数组的方法

    1.forEach()方法 遍历数组,为每个数组元素调用指定函数,三个参数分别为:数组元素 item.元素索引 index.数组本身 arr,无返回值 例: 2.map()方法 调用数组的每个元素传递 ...

  2. Atitit  深入理解命名空间namespace  java c# php js

    Atitit  深入理解命名空间namespace  java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3 ...

  3. 更新日志 - fir.im 新版优化上线

    经过这段时间的用户反馈收集和新版本的功能调研,我们对 fir.im Rio 上传下载.应用管理再次做了调整优化.感谢之前内测用户的反馈与建议.目前 fir.im Rio 新版已正式上线,主要优化有以下 ...

  4. 常用 sql

    一. sql 多个字段拼接 mysql:     1. concat函数  如果连接串中存在NULL,则返回结果为NULL:        例如: select concat('1','2','3') ...

  5. maven+svn忽略提交到svn的文件

  6. Android入门(八)广播

    原文链接:http://www.orlion.ga/572/ 一.广播机制 Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广 播可能是 ...

  7. NYOJ995硬币找零(简单dp)

    /* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成 ...

  8. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括:1. 线程优先级的介绍2. 线程优先级的示例3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/skyw ...

  9. prototype.js 和 jQuery.js中 ajax 的使用

    这次还是prototype.js 和 jQuery.js冲突的问题,前面说到过解决办法http://www.cnblogs.com/Joanna-Yan/p/4836252.html,以及上网说的大部 ...

  10. Hadoop阅读笔记(六)——洞悉Hadoop序列化机制Writable

    酒,是个好东西,前提要适量.今天参加了公司的年会,主题就是吃.喝.吹,除了那些天生话唠外,大部分人需要加点酒来作催化剂,让一个平时沉默寡言的码农也能成为一个喷子!在大家推杯换盏之际,难免一些画面浮现脑 ...