视觉asp网站源码,郴州新网二手车信息,wordpress metro,做设计最好的参考网站1、了解拼图游戏基本功能#xff1a;
拼图游戏内容由若干小图像块组成的#xff0c;通过鼠标点击图像块上下左右移动#xff0c;完成图像的拼凑。
2、拼图游戏交互界面设计与开发#xff1a;
通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 #xff…1、了解拼图游戏基本功能
拼图游戏内容由若干小图像块组成的通过鼠标点击图像块上下左右移动完成图像的拼凑。
2、拼图游戏交互界面设计与开发
通过创建窗体类、菜单、中间面板和左右面板完成设计拼图的交互界面 实现拼图游戏的基本功能。
3、图片的加载与分割
使用Image类实现图片的缩放ImageIO类实现图片的读写加载通过接口类IconBufferedImage类获取BufferedImage类的对象实现图片分割。
4、图片随机打乱和交换
产生随机数
Random randnew Random(); rand.nextInt(hs*ls)------[0,8]
具体操作生成两个随机数表示数组下标互换两个数组元素的位置按钮的方法getX和getY可以获取按钮的坐标利用按钮的单击事件的处理ActionListener可以使其图片交换。
5、判赢
当用户移动按钮后进行判断代码写在监听器的actionPerformed方法中判断拼图是否成功主要取决于每一个按钮通过索引下标获取的位置值与当前按钮的位置值是否相同。
6、计时和计数功能的实现
计时功能的实现主要是线程的设计线程的定义方法第一继承Thread类第二实现Runnable接口创建带实现接口的子类对象的Thread对象MainJFrame实现Runnable接口重写run方法而计数则在主窗体中通过rp.times实现对变量的使用来计数。
7、游戏记录的保存
当用户拼图成功后记录当前信息到文件中FileWriter追加写信息FileReader完成读取数据。
实现代码 import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.Random;import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;import jdk.jfr.events.FileWriteEvent;
//右面板实现ActionListener接口右面板也就成为了监听器
public class RightJPanel extends JPanel implements ActionListener{//面板的大小int width700;int height700;//定义按钮数组JButton[] jbs;//设置分割的行列数int hs2,ls2;//按钮的宽度和高度指定是小图图片缩放的尺寸int widthbut,heightbut;//图片原始高度宽度int widthtp,heighttp;//小图的原始宽度高度int widthxt,heightxt;//实现步数计算的变量int times;//空白按钮JButton kb;public RightJPanel(){//面板布局是空布局setLayout(null);setSize(width,height);//init();}//创建按钮并放置到右面板public void init(URL url) {//面板组件初始化前先清除所有已有的组件this.removeAll();//创建按钮数组jbsnew JButton[hs*ls];//为每一个按钮实现初始化//计算按钮的宽度和高度//面板是700*700拆分成3*3的9个区域//每一块区域的宽度 700/3//每一块区域的高度 700/3widthbutwidth/ls;heightbutheight/hs;BufferedImage bufnull;try {buf ImageIO.read(url);//获取原图的宽度、高度widthtpbuf.getWidth();heighttpbuf.getHeight();//获取小图的宽度和高度widthxtwidthtp/ls;heightxtheighttp/hs;//每一块按钮的坐标位置确定for(int i0;ijbs.length;i){jbs[i]new JButton();jbs[i].setSize(widthbut,heightbut);//jbs[i].setText(i);//添加按钮前要确定坐标位置//横坐标 i0 0 i1 233 i2 466//i3 0 i4 233//纵坐标 i3jbs[i].setLocation((i%ls)*widthbut, i/ls*heightbut);//jbs[i].setIcon(null);//小图的获取BufferedImage subimage buf.getSubimage(i%ls*widthxt, i/ls*heightxt, widthxt, heightxt);//小图的缩放Image image subimage.getScaledInstance(widthbut, heightbut, 1);//将小图图片放置到按钮上jbs[i].setIcon(new ImageIcon(image));//添加按钮到右面板add(jbs[i]);//设置按钮不可用jbs[i].setEnabled(false);//设置按钮的监听,当按钮被单击会到右面板中找actionPerformed方法执行jbs[i].addActionListener(this);}jbs[hs*ls-1].setIcon(null);kbjbs[hs*ls-1];} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//打乱按钮在面板中显示的顺序public void randomOrder(){//创建随机数对象Random randnew Random();//打乱多次for(int i0;ihs*ls;i){//随机索引int index1rand.nextInt(hs*ls);int index2rand.nextInt(hs*ls);int x1jbs[index1].getX();int y1jbs[index1].getY();int x2jbs[index2].getX();int y2jbs[index2].getY();jbs[index1].setLocation(x2, y2);jbs[index2].setLocation(x1, y1);jbs[i].setEnabled(true);}}//按钮的单击事件执行的代码Overridepublic void actionPerformed(ActionEvent e) {// 判断单击按钮和空白按钮是否相邻如果相邻则位置互换//获取用户单击的按钮 ,通过ActionEvent e的方法gerSource获取事件源JButton jb(JButton)(e.getSource());//获取单击按钮和空白按钮的坐标int x1jb.getX();int y1jb.getY();int x2kb.getX();int y2kb.getY();//判断是否可以移动//Math.abs(x1-x2)/widthbut Math.abs(y1-y2)/heightbut1if (Math.abs(x1-x2)/widthbut Math.abs(y1-y2)/heightbut1){jb.setLocation(x2, y2);kb.setLocation(x1, y1);times;}//判断是否拼图成功if (isWin()){JOptionPane.showMessageDialog(null, 恭喜你拼图成功);//使得按钮不可用for(int i0;ijbs.length;i){jbs[i].setEnabled(false);}//提示用户输入名称//使用输入对话框String name JOptionPane.showInputDialog(请输入你的姓名);String info hs*ls拼图记录name的步数是times\r\n;JOptionPane.showMessageDialog(null, hs*ls拼图记录name的步数是times\r\n);try {FileWriter fw new FileWriter(D:\\游戏记录.dat,true);fw.write(info);fw.close();}catch (IOException e1) {e1.printStackTrace();}}}//判断是否拼图成功public boolean isWin() {//获取每一个按钮的坐标for(int i0;ijbs.length;i){//jbs[i].setLocation((i%ls)*widthbut, i/ls*heightbut);由之前坐标设置给出下面的xyint xjbs[i].getX()/widthbut;int yjbs[i].getY()/heightbut;//判断通过下标值也可以获取按钮的坐标 横坐标 i%ls 纵坐标 i/lsif (i%ls!x || i/ls!y ){return false;}}return true;}}
右面版 import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.Random;import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;import jdk.jfr.events.FileWriteEvent;
//右面板实现ActionListener接口右面板也就成为了监听器
public class RightJPanel extends JPanel implements ActionListener{//面板的大小int width700;int height700;//定义按钮数组JButton[] jbs;//设置分割的行列数int hs2,ls2;//按钮的宽度和高度指定是小图图片缩放的尺寸int widthbut,heightbut;//图片原始高度宽度int widthtp,heighttp;//小图的原始宽度高度int widthxt,heightxt;//实现步数计算的变量int times;//空白按钮JButton kb;public RightJPanel(){//面板布局是空布局setLayout(null);setSize(width,height);//init();}//创建按钮并放置到右面板public void init(URL url) {//面板组件初始化前先清除所有已有的组件this.removeAll();//创建按钮数组jbsnew JButton[hs*ls];//为每一个按钮实现初始化//计算按钮的宽度和高度//面板是700*700拆分成3*3的9个区域//每一块区域的宽度 700/3//每一块区域的高度 700/3widthbutwidth/ls;heightbutheight/hs;BufferedImage bufnull;try {buf ImageIO.read(url);//获取原图的宽度、高度widthtpbuf.getWidth();heighttpbuf.getHeight();//获取小图的宽度和高度widthxtwidthtp/ls;heightxtheighttp/hs;//每一块按钮的坐标位置确定for(int i0;ijbs.length;i){jbs[i]new JButton();jbs[i].setSize(widthbut,heightbut);//jbs[i].setText(i);//添加按钮前要确定坐标位置//横坐标 i0 0 i1 233 i2 466//i3 0 i4 233//纵坐标 i3jbs[i].setLocation((i%ls)*widthbut, i/ls*heightbut);//jbs[i].setIcon(null);//小图的获取BufferedImage subimage buf.getSubimage(i%ls*widthxt, i/ls*heightxt, widthxt, heightxt);//小图的缩放Image image subimage.getScaledInstance(widthbut, heightbut, 1);//将小图图片放置到按钮上jbs[i].setIcon(new ImageIcon(image));//添加按钮到右面板add(jbs[i]);//设置按钮不可用jbs[i].setEnabled(false);//设置按钮的监听,当按钮被单击会到右面板中找actionPerformed方法执行jbs[i].addActionListener(this);}jbs[hs*ls-1].setIcon(null);kbjbs[hs*ls-1];} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//打乱按钮在面板中显示的顺序public void randomOrder(){//创建随机数对象Random randnew Random();//打乱多次for(int i0;ihs*ls;i){//随机索引int index1rand.nextInt(hs*ls);int index2rand.nextInt(hs*ls);int x1jbs[index1].getX();int y1jbs[index1].getY();int x2jbs[index2].getX();int y2jbs[index2].getY();jbs[index1].setLocation(x2, y2);jbs[index2].setLocation(x1, y1);jbs[i].setEnabled(true);}}//按钮的单击事件执行的代码Overridepublic void actionPerformed(ActionEvent e) {// 判断单击按钮和空白按钮是否相邻如果相邻则位置互换//获取用户单击的按钮 ,通过ActionEvent e的方法gerSource获取事件源JButton jb(JButton)(e.getSource());//获取单击按钮和空白按钮的坐标int x1jb.getX();int y1jb.getY();int x2kb.getX();int y2kb.getY();//判断是否可以移动//Math.abs(x1-x2)/widthbut Math.abs(y1-y2)/heightbut1if (Math.abs(x1-x2)/widthbut Math.abs(y1-y2)/heightbut1){jb.setLocation(x2, y2);kb.setLocation(x1, y1);times;}//判断是否拼图成功if (isWin()){JOptionPane.showMessageDialog(null, 恭喜你拼图成功);//使得按钮不可用for(int i0;ijbs.length;i){jbs[i].setEnabled(false);}//提示用户输入名称//使用输入对话框String name JOptionPane.showInputDialog(请输入你的姓名);String info hs*ls拼图记录name的步数是times\r\n;JOptionPane.showMessageDialog(null, hs*ls拼图记录name的步数是times\r\n);try {FileWriter fw new FileWriter(D:\\游戏记录.dat,true);fw.write(info);fw.close();}catch (IOException e1) {e1.printStackTrace();}}}//判断是否拼图成功public boolean isWin() {//获取每一个按钮的坐标for(int i0;ijbs.length;i){//jbs[i].setLocation((i%ls)*widthbut, i/ls*heightbut);由之前坐标设置给出下面的xyint xjbs[i].getX()/widthbut;int yjbs[i].getY()/heightbut;//判断通过下标值也可以获取按钮的坐标 横坐标 i%ls 纵坐标 i/lsif (i%ls!x || i/ls!y ){return false;}}return true;}} 游戏功能
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.filechooser.FileNameExtensionFilter;public class MainJFrame extends JFrame implements Runnable{//菜单//菜单栏JMenuBar jmenubar;//菜单 菜单、等级、帮助JMenu menu,menuclass,menuhelp;//菜单项 开始、退出、图片更换、关于游戏、游戏记录、清空记录JMenuItem itembegin,itemend,itemchange,itemabout,itemrecord,itemclear;//单选菜单项 简单、一般、困难JRadioButtonMenuItem itemeasy,itemnormal,itemhard;//中间面板JPanel jp;//左面板LeftJPanel lp;//右面板RightJPanel rp;//访问的图片URL url;//显示计时标签JLabel total_time;//起止时间long startTime,endTime;//创建线程对象实现计时功能Thread th;//显示步数的标签JLabel total_count;//构造方法public MainJFrame(){//标题设置setTitle(拼图游戏);//窗体大小setSize(1440, 780);//窗体位置在容器/屏幕的正中间setLocationRelativeTo(null);//窗体大小不可变setResizable(false);//实现界面菜单初始化//创建一个线程对象thnew Thread(this);//界面菜单初始化menuinit();//各面板的初始化init();setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true);//开始菜单itembegin.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {//启动线程//如果线程没有启动则调用start方法启动if(!th.isAlive()) th.start();startTimeSystem.currentTimeMillis();rp.times0;rp.randomOrder();}});//结束游戏itemend.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {System.exit(1);}});//选择难易度itemeasy,itemnormal,itemharditemeasy.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {//第一传递2*2到右面板rp.hs2;rp.ls2;//第二调用右面板组件初始化的方法rp.init(url);}});itemnormal.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {//第一传递3*3到右面板rp.hs3;rp.ls3;//第二调用右面板组件初始化的方法rp.init(url);}});itemhard.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {//第一传递4*4到右面板rp.hs4;rp.ls4;//第二调用右面板组件初始化的方法rp.init(url);}});//游戏记录显示itemrecord.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {//info存储要显示的内容String info;try {//判断文件是否存在File f new File(D:\\游戏记录.dat);if(f.exists()) {//创建指向***的文件字符输入流对象FileReader fr new FileReader(D:\\游戏记录.dat);//读取数据char[] chs new char[1024];int len;while((lenfr.read(chs))!-1) {//读取的结果放在info中infonew String(chs,0,len);}fr.close();//通过消息框显示结果JOptionPane.showMessageDialog(null, info);}else {JOptionPane.showMessageDialog(null, 游戏记录为空);}}catch (IOException e1) {e1.printStackTrace();}}});//关于游戏itemabout.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(null, 关于拼图游戏\r\n版本v2.0\r\n作者LWL\r\n欢迎进入游戏);}});//清空记录itemclear.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {File f new File(D:\\游戏记录.dat);if(f.exists()) {f.delete();}}});//实现图片的更换itemchange.addActionListener(new ActionListener() {Overridepublic void actionPerformed(ActionEvent e) {//显示一个打开对话框选择一个图片文件将文件转换成url对象调用左右面板的相应方法JFileChooser jfcnew JFileChooser();//设置文件的扩展名jfc.setFileFilter(new FileNameExtensionFilter(图片格式(jpg|png|gif|jpeg), jpg,png,gif,jpeg));//弹出打开对话框int sd jfc.showOpenDialog(MainJFrame.this);if (sdjfc.APPROVE_OPTION)//如果用户选择了打开按钮{//获取用户选择的文件完整名称String filejfc.getSelectedFile().getAbsolutePath();try {urlnew URL(file:\\file);//更新两个面板的图片lp.init(url);rp.init(url);} catch (MalformedURLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}});}public void init() {jpnew JPanel();//设置中间面板的布局方式jp.setLayout(new GridLayout(1,2));//提供左右面板的图片urlthis.getClass().getResource(小狗.jpg);//创建左面板lpnew LeftJPanel();//对标签初始化lp.init(url);//将左面板添加到中间面板jp.add(lp);//创建右面板rpnew RightJPanel();//右面板的按钮初始化rp.init(url);//将右面板添加到中间面板jp.add(rp);//将中间面板添加到窗体add(jp);}public void menuinit() {jmenubarnew JMenuBar();menunew JMenu(菜单);menuclassnew JMenu(等级);menuhelpnew JMenu(帮助);itembeginnew JMenuItem(开始游戏);itemendnew JMenuItem(结束游戏);itemchangenew JMenuItem(更换图片);itemaboutnew JMenuItem(关于游戏);itemrecordnew JMenuItem(游戏记录);itemclearnew JMenuItem(清空记录);itemeasynew JRadioButtonMenuItem(简单);itemnormalnew JRadioButtonMenuItem(一般);itemhardnew JRadioButtonMenuItem(困难);//为单选菜单分组实现多选一ButtonGroup bgnew ButtonGroup();bg.add(itemeasy);bg.add(itemnormal);bg.add(itemhard);//添加菜单menu.add(itembegin);menu.add(itemend);menu.add(itemchange);menuclass.add(itemeasy);menuclass.add(itemnormal);menuclass.add(itemhard);menuhelp.add(itemabout);menuhelp.add(itemrecord);menuhelp.add(itemclear);jmenubar.add(menu);jmenubar.add(menuclass);jmenubar.add(menuhelp);//菜单栏添加到窗体this.setJMenuBar(jmenubar);itemeasy.setSelected(true);//创建一个线程对象thnew Thread(this);total_timenew JLabel(用时:);total_time.setForeground(Color.red);jmenubar.add(new JLabel( ));jmenubar.add(total_time);total_countnew JLabel(步数:);total_count.setForeground(Color.red);jmenubar.add(new JLabel( ));jmenubar.add(total_count);}public static void main(String[] args) {new MainJFrame();}//实现计时并定时显示的run方法Overridepublic void run() {while(true) {endTimeSystem.currentTimeMillis();total_time.setText(用时(endTime-startTime)/1000秒);total_count.setText(步数:第rp.times步);try {Thread.sleep(500);}catch (InterruptedException e) {e.printStackTrace();}}}
}}
效果展示