📄 myjpanel.java
字号:
//package PinTu;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.*;
import javax.swing.*;
public class MyJPanel extends JPanel {
Image img;
BufferedImage bimg, subimg, imgs;
int[][] num;
int dx, dy;
// --------
Graphics gs, gs2;
int a, b;
int no=3;
// ---------
boolean running = false,shengli=false,jixu=true,move=false;
// ---------------
int bs=0;
//-------------------------------------
JPanel jp_bs=new JPanel();
JLabel jl_bs=new JLabel("步数");
JTextField jtf_bs=new JTextField("0",4);
//--------------------------------
public void init(int n,String s) {
setLayout(new BorderLayout());
jp_bs.add(jl_bs);
jp_bs.add(jtf_bs);
add(jp_bs,"South");
img = getToolkit().getImage(s);
MediaTracker mt = new MediaTracker(this);
mt.addImage(img, 0);
try {
mt.waitForAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
dx = img.getWidth(this) /n;
dy = img.getHeight(this) /n;
bimg = new BufferedImage(img.getWidth(this), img.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
imgs = new BufferedImage(img.getWidth(this), img.getHeight(this),
BufferedImage.TYPE_INT_ARGB);
gs = bimg.getGraphics();
gs.drawImage(img, 0, 0, this);
gs2 = imgs.getGraphics();
no=n;
drawMap(n);
addMouseListener(new MoveMap());
}
public void paintComponent(Graphics g) {
if (running) {
g.drawImage(imgs, 0, 0, this);
}
else{
g.drawImage(img,0,0,this);
//running=true;
}
if(shengli){
Font font=new Font("宋体",1,50);
g.setFont(font);
g.setColor(Color.red);
g.drawImage(img,0,0,this);
g.drawString("恭喜您获胜!", 90, 150);
shengli=false;
/*try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}*/
}
}
public void initMap(int n) {
java.util.Random rnd = new java.util.Random(); // 创建随机发生器
int temp, x, y, x2, y2;
a=n-1;b=n-1;
num = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
num[i][j] = i * n + j;
}
}
for (int i = 0; i < 1000; i++) { // 循环100次
// 选中任意位置的图像数组下标,即选中任意位置的两个图像块
x = rnd.nextInt(n); // 产生0-n之间的随机数
y = rnd.nextInt(n);
/*y1 = rnd.nextInt(n);
y2 = rnd.nextInt(n);*/
// 交换两个图像块的位置
if (Math.abs(a - x) + Math.abs(b - y) <2){
temp = num[a][b];
num[a][b] = num[x][y];
num[x][y] = temp;
a=x;
b=y;
}
System.out.println(a+","+b);
}
}
public void drawMap(int n) {
initMap(n);
drawMap2(n);
}
public void drawMap2(int n) {
gs2.clearRect(0, 0, dx * n, dy * n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (num[i][j] == n * n - 1) {
a = i;
b = j;
//gs2.set(Color.blue);
continue;
} else {
subimg = bimg.getSubimage(dx * (num[i][j] % n), dy* (num[i][j] / n), dx - 1, dy - 1);
// subimg=bimg.getSubimage(0,0,dx-1,dy-1);
gs2.drawImage(subimg, dx * j, dy * i, this);
}
}
}
}
// -------------------------------
class MoveMap implements MouseListener {
public void mouseClicked(MouseEvent arg0) {
// TODO 自动生成方法存根
}
public void mouseEntered(MouseEvent arg0) {
// TODO 自动生成方法存根
}
public void mouseExited(MouseEvent arg0) {
// TODO 自动生成方法存根
}
public void mousePressed(MouseEvent me) {
if(move){
int x = me.getX() / dx; // x,y wei shu zu xia biao yu zuoshangjiao
// zuobiao guanxi buduiying
int y = me.getY() / dy;
if (Math.abs(b - x) + Math.abs(a - y) >= 2)
return;
else if (num[y][x] ==no*no-1)
return;
else {
int m = num[a][b];
num[a][b] = num[y][x];
num[y][x] = m;
// a = x;
// b = y;
// a=x;b=y;
// getGraphics().drawImage(imgs,0,0,new MyJPanel());
// System.out.println("123");
drawMap2(no);
repaint();
shengFu(no);
}
bs++;
jtf_bs.setText(""+bs);}
}
public void mouseReleased(MouseEvent arg0) {
// TODO 自动生成方法存根
}
}
// -------------------------------------
public void shengFu(int n){
int pd=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(num[i][j]==i*n+j){
pd++;
}
// System.out.println(i*n+j);
}
}
if(pd==n*n){
System.out.println("胜利");
shengli=true;
jixu=false;
move=false;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -