拼图游戏 java_Java实现拼图游戏

news/2024/11/23 4:04:57/

Java实现拼图游戏以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

91703e6ccf4cc9240927cbb9d6b0a4bd.png

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

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

主要利用了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

分页:123


http://www.ppmy.cn/news/840806.html

相关文章

php 画拼图,jQuery和php图像旋转拼图

我有一个PHP脚本,从文件夹中返回随机jpg图像的名称.这很好,因为我根本不需要重命名图像;我只是把它们放在文件夹中,随机发生器工作.现在,我调用这样的脚本 – http://mydomain.com/images/rotate.php – 并在一个简单的网页重新加载,它交换图像. 但是我想让它与jQuery一起工作,…

android拼图游戏报告,拼图游戏报告分析报告.doc

南京邮电大学计算机学院 2014&#xff0f;2015学年第1学期 《JAVA语言》课程报告 课题代号(单选)□课题1 □课题2 □课题3 课题名称&#xff1a; 拼图游戏 小组成员人数(单选)□1人 □2人 □3人 □4人 小组成员名单(学号和姓名)&#xff1a; (1)学号 姓名 (2)学号 姓名 (3)学号…

MISC 拼图 工具 linux下使用

https://github.com/nemanja-m/gaps 下载后将文件夹解压放入虚拟机 进入目录 安装这几个 pip install matplotlib pip install numpy pip install opencv-python pip install pytest pip install pillow 每个装完后 记录对应的版本后 然后在requirement.txt里改成自己的…

C语言数组制作拼图游戏,C语言例子自制拼图游戏

#include "resource.h" HINSTANCE hInst; HBITMAP pic,empty,compare_pic,pict[8],compare_pict[8],other; //所有图的变量名 HDC hdc,mdc; //DC名 int mouse_x,mouse_y,n0,line3,high3100,high4200,high5300…

【python拼图】遍历文件夹后,自动拼接图像成正方形图,或者指定行数显示

功能说明 def image_combines(img_dir,fw1,fh1,cols1,flag_sortTrue,IMAGES_FORMAT [.jpg, .JPG, PNG, .png, .jpeg]):img_dir 表示需要遍历文件夹 fw&#xff0c;fh 分别表示图像宽、高统一放缩的比例&#xff0c;1表示1倍 cols 表示拼接后的图片的每行多少张小图片&#xf…

Python案例分析|基于模块的库存管理系统

本案例是通过一个多模块的库存管理系统案例&#xff0c;帮助大家深入了解基于模块的Python应用程序的开发流程。 01、库存管理系统API设计 本文实现一个简单的基于模块的库存管理系统。系统采用JSON文件来保存数据。产品信息设计为字典&#xff0c;键为sku_id&#xff08;产品…

矩阵的范数和特征值之间的关系

参考&#xff1a; linear algebra - Why is the norm of a matrix larger than its eigenvalue? - Mathematics Stack Exchange

web信息收集----网站指纹识别

文章目录 一、网站指纹&#xff08;web指纹&#xff09;二、CMS简介三、指纹识别方法3.1 在线网站识别3.2 工具识别3.3 手动识别3.4 Wappalyzer插件识别 一、网站指纹&#xff08;web指纹&#xff09; Web指纹定义&#xff1a;Web指纹是一种对目标网站的识别技术&#xff0c;通…