「java的拼图」拼图的拼法

博主:adminadmin 2023-01-19 05:54:09 205

今天给各位分享java的拼图的知识,其中也会对拼图的拼法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java拼图游戏不成功为什么

从代码和错误提示来看

button 对象只有声明, 并没有赋值,默认是null .用一个null对象去调用方法,那么就会抛出异常.没有进行异常处理,程序就会崩溃

button.addActionListener(new ImgButtonAction());// 出错...因为button为null

解决办法: button对象先赋值(不能为null)再使用

建议你写代码,添加必要的注释,对每个方法的说明, 以及对每个比较难一眼看懂的算法进行说明.,会比较好.

以前也写过一个拼图,比较简单.思路跟你可能差不多:

1:用按钮去显示图片的一部分.并且每个按钮都有个value属性,从1,2,3,....9,0

(value为0按钮在最后面,并不显示图片) .想要胜利,就需要图片按钮的value属性能满足下面的二维数组

int[][] win = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 0 } };

2: 点击图片按钮,判断是否可以交换位置,如果旁边是value为0的按钮,那么可以交换位置,每次交换后,记得判断是否胜利

3: 打乱的图片按钮,不一定能求解, 如果不能求解,那么重新打乱

效果图大概是

java拼图游戏,怎么要才能让它随机排列图片?

弄一个点类。加上这个类的数组就可以了。。

假如,你的图片的大小是50X50。屏幕的大小为200X200。

定义一个点类,这个点类是描述位置的。大概如下 :

class Point

{

int x,y;

Point(int x, int y)

{

this.x = x;

this.y = y;

}

}

然后,你弄个点类的数组,

int position[] = {new Point(0,0), new Point(50,0),new Point(100,0)......后面你懂得}

然后,设置图片的位置时,生成一个随机。

int p = new Random().nextInt(position.length());

然后用这个p来取position数组的值。。用里面的对象的x,和y来设置图片的位置。。

需要注意的是,要把p保存起来,下次在生随机数的时候比较下,如果之前已经有这个数了,就重新生过。。。

Java实现拼图游戏

偶尔帮同学作一个拼图游戏 要求多加注释 实现后加了这么多注释 直接删掉太可惜了

不如拿出来共享一下 其实有些注释就是废话 不过先讲一下原理 方始读者了然不惑 :)

主要利用了Graphics中的

public abstract boolean drawImage(Image img

int dx

int dy

int dx

int dy

int sx

int sy

int sx

int sy

Color bgcolor

ImageObserver observer)

方法(Draws as much of the specified area of the specified image as is currently available scaling it on the fly tofit inside the specified area of the destination drawable surface )大意是 把 img 中由 (sx sy )(sx sy )指定的矩形区域画到 observer 中由(dx dy )(dx dy )指定的矩形区域内(如果两个指定的大小不同 可能会依目的大小为准进行拉伸或压缩 建议相同)    有了上面的方法就可以进行构思拼图游戏的具体实现了 主要是计算上面的 个值 以下代码注释很详细(或说很罗嗦) 有几点要指出    图片为随机打乱 一个小子说 块图片怎么随机打乱都能拼成 结果有几次拼了多半个小时都不成(我不太擅长拼图) 所以如果拼不出来 请重新开始一下    最后的图片为拼图图片 存为 bg jpg 放至同一文件夹下即可 如要换图 要改变窗口大小 否则会变形    一直另我很郁闷的事情 空白的一块始终颜色是黑色 无论我加多少 setcolor语句 还望各位大虾指教    显示时间未实现 继承Runnable接口 实现并不难 但 显示正确图片 继续游戏 相当于一个暂停按钮 需要线程间的协作 唤醒 等待 恩 不算太难 有需要的就实现 否则就掐表吧

import java awt *;

import java awt event *;

import java awt image BufferedImage;

import java io *;

import javax imageio ImageIO;

import java util *;

import javax swing *;

public class Pintu extends JFrame{

private Image image buff;             //原始图片 缓存图片

private Point point = new Point( );         //记录第九块图片位置

private int[][] map = {{ } { } { }}; //给破碎图片标号

private int sx sy;       // 分割后每一个图片的宽度和高度

private Canvas canvas;    //加载图片容器

private Graphics gs gb;     //gs 画出Canvas gb画出buff图像

private boolean isRunning = false;   //游戏是否正在进行

private JButton start = new JButton( 开始新的游戏 ); // 按钮

private JButton show = new JButton( 显示正确图片 ); //按钮

private JTextArea showTime = new JTextArea( 显示时间 );

private JTextArea showStep = new JTextArea( 显示步骤 );

private JPanel panel = new JPanel(); //装在上面 个按钮

private int steps = ;               // 记录移动的步骤

public Pintu(String title) {   //构造方法

super(title);

try {                     //异常抛出

image = ImageIO read(new File( bg jpg )); //装载图片

} catch (IOException ex) {

ex printStackTrace();

}

initScreen();   //初始化canvas 由于canvas 初始化较复杂 所以单独写一个方法

buff = new BufferedImage( BufferedImage TYPE_INT_BGR);//三原色加载

gb = buff getGraphics();

sx = image getWidth(this) / ;

sy = image getHeight(this) / ;

setLayout(new BorderLayout());

add(panel BorderLayout SOUTH);

add(canvas BorderLayout CENTER);

panel setLayout(new GridLayout( ));

panel add(start);

panel add(show);

panel add(showTime);

panel add(showStep);

showTime setEditable(false);

showStep setEditable(false);

showTime setFont(new Font( 黑体 Font PLAIN ));

showStep setFont(new Font( 黑体 Font PLAIN ));

setSize( );

setResizable(false);

setDefaultCloseOperation(JFrame EXIT_ON_CLOSE);

}

void initScreen() {

canvas = new Canvas() {

public void paint(Graphics g) {     //覆写canvas的paint 方法

gs = getGraphics(); //得到Canvas的Graphics

if (isRunning) {

drawScreen();

} else {

g drawImage(image this);

g setColor(Color gray);

}

}

};

canvas addMouseListener(new MouseAdapter() {

//覆写mousePressed 方法 实现鼠标点击时 图片移动

public void mousePressed(MouseEvent me) {

if (!isRunning) return; // 如果未运行 说明图片未分割 直接返回

int x = me getX() / sx y = me getY() / sy;//判断鼠标点击的图片在map中的编号

int fx = (int) point getX() fy = (int) point getY();//记录第九块图片(未显示图片)的位置

int canMove = Math abs(fx x) + Math abs(fy y); // 如鼠标点击位置与第九块图片(可移动的位置)相邻 则canMove 必为

if (canMove != ) return; // canMove 不为 不能移动图片

map[fx][fy] = map[x][y];    //点击图片坐标 赋给第九块图片

map[x][y] = ;                  //第九块图片给掉 点击图片

point setLocation(x y);   //point 坐标改变

drawScreen();              //重绘屏幕 实现图片移动

showStep setText( 移动步骤 + ++steps);                 //步骤加一

}

});

//为Start按钮添加事件

start addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

initMap();

drawScreen();

isRunning = true;

steps = ;

showStep setText( 移动步骤 + steps);

show setLabel( 显示正确图片 );

}

});

//为show按钮添加事件

show addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent ae) {

if (show getLabel() equals( 继续游戏 )) {

drawScreen();

isRunning = true;

show setLabel( 显示正确图片 );

} else {

gs drawImage(image canvas);

isRunning = false;

show setLabel( 继续游戏 );

}

}

});

}

void initMap() {

long time = System nanoTime();//得到系统当前时间 作为随机数种子

java util Random rnd = new java util Random(time);

int temp x y x y ;

//随机交换图片

for (int i = ; i ; i++) {

x = rnd nextInt( );

x = rnd nextInt( );

y = rnd nextInt( );

y = rnd nextInt( );

temp = map[x ][y ];

map[x ][y ] = map[x ][y ];

map[x ][y ] = temp;

}

//标记 号图片(即空白图片)

outer:

for (int i = ; i ; i++)

for (int j = ; j ; j++)

if (map[i][j] == ) {

point setLocation(i j);

break outer;

}

}

void drawScreen() {

int sx sy sx sy dx dy dx dy ;

int t t ;

gb setColor(Color white);

gb clearRect( sx * sy * );//清空整个缓冲去图片

for (int x = ; x ; x++)

for (int y = ; y ; y++)

if(map[x][y] != ) {

// 目的地址

dx = x * sx;     dy = y * sy;       // 移动的左上角坐标

dx = dx + sx ;   dy = dy + sy ; // 移动的右下角坐标

// 源地址

t = map[x][y] % ; t = map[x][y] / ;

sx = t * sx;    sy = t * sy;   // 移动的左上角图标

sx = sx + sx ;   sy = sy + sy ; // 移动的右下角坐标

gb drawImage(image dx dy dx dy sx sy sx sy Color white canvas);//绘制缓冲区图片

}

gs drawImage(buff canvas);//将缓冲区图片绘制到 canvas 上

}

public static void main(String[] args) {

Pintu pintu = new Pintu( 拼图 );

new Thread(pintu) start();

pintu setVisible(true);

}

lishixinzhi/Article/program/Java/hx/201311/27054

怎么用Java实现拼图游戏,求思维和代码

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.Font;

import java.awt.GridLayout;

import java.awt.Image;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.image.BufferedImage;

import javax.swing.GroupLayout.Alignment;

import javax.swing.Icon;

import javax.swing.ImageIcon;

import javax.swing.JButton;

import javax.swing.JCheckBoxMenuItem;

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;

public class Jigsaw implements ActionListener {

private JFrame frame;

private JPanel panel;

private JButtonx[] button;

private JPanel panel_right;

private int level = 4;

private JMenuBar menubar;

private ImageIcon imageicon;

private Image image;

private BufferedImage bufferedimage;

private BufferedImage[] image_button;

private JLabel label;

private JPanel panel_left;

private ImageIcon[] icon_button;

private JMenu menu1;

private JMenuItem menuitem1_1;

private JMenu menu2;

private JCheckBoxMenuItem menuitem2_1;

private JCheckBoxMenuItem menuitem2_2;

private JCheckBoxMenuItem menuitem2_3;

private int x=400;

private int y=400;

private JMenuItem menuitem1_2;

private JFileChooser jfc;

private String name="src/pic/1.jpg";         //起始图片位置,请自行设置

private JPanel panel_menu;

private JLabel label1_1;

private JLabel label1_2;

private JLabel label1_3;

private JLabel label2_1;

private JLabel label2_2;

private JLabel label2_3;

public void reset() {

frame = new JFrame("拼图");

panel = new JPanel();

panel_left = new JPanel();

panel_right = new JPanel();

panel.setLayout(new GridLayout(0, 2));

menubar = new JMenuBar();

menubar.setLayout(new BorderLayout());

panel_menu=new JPanel();

panel_menu.setLayout(null);

menu1 = new JMenu("开始游戏");

menuitem1_1=new JMenuItem("重新开始");

menuitem1_2=new JMenuItem("选择图片");

menu2=new JMenu("等级选择");

menuitem2_1=new JCheckBoxMenuItem("低级(3)");

menuitem2_2=new JCheckBoxMenuItem("高级(4)");

menuitem2_3=new JCheckBoxMenuItem("自定义");

imageicon = new ImageIcon(name);

image = imageicon.getImage();

bufferedimage=new BufferedImage(252, 405, BufferedImage.TYPE_INT_RGB);

bufferedimage.getGraphics().drawImage(image,0,0,252,405,null);

imageicon.setImage(bufferedimage);

label=new JLabel(imageicon);

panel_left.setLayout(new FlowLayout(FlowLayout.CENTER,0,0));

panel_left.add(label);

panel.add(panel_left);

jfc=new JFileChooser();

label1_1=new JLabel("您已经走了");

label1_1.setBounds(30, 0, 80, 25);

label1_2=new JLabel("0");

label1_2.setForeground(Color.RED);

label1_2.setBounds(120, 0, 40, 25);

label1_2.setFont(new Font("黑体",Font.BOLD,20));

label1_3=new JLabel("步");

label1_3.setBounds(160, 0, 30, 25);

label2_1=new JLabel("时间");

label2_1.setBounds(220, 0, 50, 25);

label2_2=new JLabel("0");

label2_2.setForeground(Color.RED);

label2_2.setBounds(280, 0, 40, 25);

label2_2.setFont(new Font("黑体",Font.BOLD,20));

label2_3=new JLabel("秒");

label2_3.setBounds(330, 0, 30, 25);

panel_right.setLayout(new GridLayout(level, level));

button = new JButtonx[level * level];

image_button=new BufferedImage[level*level];

for (int i = 0; i level*level/*-1*/; i++) {

image_button[i]=new BufferedImage(252/level, 405/level, BufferedImage.TYPE_INT_RGB);

image_button[i].getGraphics().drawImage(bufferedimage, 0,0,252/level,405/level,(i%level)*(252/level), (i/level)*(405/level), (i%level+1)*(252/level), (i/level+1)*(405/level),null);

}

icon_button=new ImageIcon[level * level];

for (int i = 0; i level * level; i++) {

button[i] = new JButtonx();

icon_button[i]=new ImageIcon(image_button[i],i+"");

button[i].setIcon(icon_button[i]);

button[i].num=i;

button[i].addActionListener(this);

panel_right.add(button[i]);

}

button[level*level-1].setVisible(false);

panel.add(panel_right);

menuitem1_1.addActionListener(this);

menuitem1_2.addActionListener(this);

menuitem2_1.addActionListener(this);

menuitem2_2.addActionListener(this);

menuitem2_3.addActionListener(this);

menu1.add(menuitem1_1);

menu1.add(menuitem1_2);

menu2.add(menuitem2_1);

menu2.add(menuitem2_2);

menu2.add(menuitem2_3);

menubar.add(menu1,BorderLayout.WEST);

menubar.add(menu2,BorderLayout.EAST);

menubar.add(panel_menu);

panel_menu.add(label1_1);

panel_menu.add(label1_2);

panel_menu.add(label1_3);

panel_menu.add(label2_1);

panel_menu.add(label2_2);

panel_menu.add(label2_3);

frame.setJMenuBar(menubar);

frame.add(panel);

frame.setBounds(x, y, 508+4, 459+5);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setResizable(false);

frame.setVisible(true);

}

public void actionPerformed(ActionEvent e) {

if(e.getSource()==menuitem1_1)

{

for (int i = 0; i level*level; i++)

button[i].setVisible(true);

int a[]=new int [level*level];

int index=level*level;

for (int i = 0; i level*level; i++) {

a[i]=i;

}

for (int i = 0; i level*level; i++) {

int x=(int)(Math.random()*index);

int temp=a[x];

a[x]=a[index-1];

a[index-1]=temp;

button[i].setIcon(icon_button[a[index-1]]);

if(a[index-1]==level*level-1)button[i].setVisible(false);

index--;

}

win();

}

else if(e.getSource()==menuitem1_2){if(jfc.showOpenDialog(panel)==0)name=jfc.getSelectedFile().getAbsolutePath();frame.setVisible(false);x=frame.getX();y=frame.getY();reset();}

else if(e.getSource()==menuitem2_1){level=4;frame.setVisible(false);x=frame.getX();y=frame.getY();reset();}

else if(e.getSource()==menuitem2_2){level=5;frame.setVisible(false);x=frame.getX();y=frame.getY();reset();}

else if(e.getSource()==menuitem2_3)try {level=Integer.parseInt(JOptionPane.showInputDialog(frame,"请输入行数:"));frame.setVisible(false);x=frame.getX();y=frame.getY();reset();} catch (Exception e2) {}

else

{

JButtonx but=(JButtonx)e.getSource();

if(but.isVisible())

{

if(but.num-level=0)judgemengt(but.num,but.num-level);

if(but.num+level=level*level-1)judgemengt(but.num,but.num+level);

if(but.num%level-1=0)judgemengt(but.num,but.num-1);

if(but.num%level+1=level-1)judgemengt(but.num,but.num+1);

}

win();

}

}

public void judgemengt(int i,int j)

{

if(button[j].isVisible()==false)

{

Icon icontemp_button=button[j].getIcon();

button[j].setIcon(button[i].getIcon());

button[i].setIcon(icontemp_button);

button[j].setVisible(true);

button[i].setVisible(false);

}

}

public void win()

{

int i;

for (i = 0; i level*level-1; i++) {

if(button[i].num!=Integer.parseInt(button[i].getIcon().toString()))break;

}

if(i==level*level-1)

{

JOptionPane.showMessageDialog(frame,"YOU WIN");

}

}

public static void main(String[] args) {

Jigsaw a=new Jigsaw();

a.reset();

}

}

class JButtonx extends JButton

{

int num;

}

如何用JAVA编写一个图片的拼图游戏

说说思路:

1 本身他不是一个完整的图片,应该被切分成数组,该数组为拼图成功的标准

2 将该数组复制,然后打散元素的顺序

3 初始化一个二维数组方格矩阵

4 允许用户通过鼠标事件将 备选图案中的某个元素放置到二维数组方格矩阵中,并记载其顺序

5 直到所有的方格被填满,与答案数组的元素顺序比较,给出结果

以上是实现拼图的关键思路,其他情况还要考虑,如允许从方格中撤出图像或者与其他图像调整位置,仅代表个人不成熟的想法,希望对你能有所帮助,祝你好运!

java程序问题 是有关拼图游戏的代码

从这个代码分析,你的拼图游戏是用3*3个按钮实现的,这个类就是处理点击按钮事件。

首先,actionPerformed第一行用reorder方法将图片根据点击重新排列,然后是一个二重循环,将9个按钮上的图片重新加载,之后判断如果是空图片,就把emptyButton设置为该按钮的引用。

个人见解:这个方法比较笨,每次点击按钮都要全部加载所有按钮,不理想。应该只给空按钮上下左右四个按钮加监听;处理点击事件也不需要全部重新绘制,只需要重新绘制点击的按钮和空按钮。

关于java的拼图和拼图的拼法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。