偶尔帮同学作一个拼图游戏 要求多加注释 实现后加了这么多注释 直接删掉太可惜了
不如拿出来共享一下 其实有些注释就是废话 不过先讲一下原理 方始读者了然不惑 :)
主要利用了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一个拼图游戏可以旋转可以提示叫什么
适合大人玩的拼图游戏:拼图大玩家。
拼图大玩家是一款拼图玩法的休闲益智类型游戏,游戏内有着诸多,玩家需要根据关卡给出的不同拼图任务,去还原原貌。每通过一个关卡就有几率获取红包奖励,通关越多获得的红包数量也就越多。游戏玩法简易上手,每天仅需几分钟就能收获红包奖励。还有每日更新的全新拼图挑战任务,超多趣味内容等你体验。
拼图大玩家亮点:
1.点击拼图,自由通关,快乐玩耍,体验精彩拼图。
2.很多玩法,在时间限制下,不断解锁新关卡,极具挑战性。
3.任务多,随意尝试,享受拼图快速完成,高分。
拼图大玩家优势:
1.超级经典的拼图游戏都是用红包玩的,精彩的内容丰富好玩。
2.各个年龄段的玩家都可以挑战,每次体验都很过瘾。
3.必须完成不同难度系数的任务,才能让游戏进步。
拼图大玩家测评:
1.这款游戏可以让玩家在取得突破。
2.它给玩家带来了非常丰富的画面,玩家需要快速搜索更多的碎片。
3.将完整的放在一起,每完成一级都会获得相应的奖励。时间越短,奖励越高。
一个拼图游戏可以旋转可以提示叫立体碎片。立体碎片是一款全新的3D益智解谜拼图游戏,玩法非常简单和放松,只要通过旋转3D拼图碎片,就能合并出一幅漂亮的图案,在拼图的过程中游戏可以给出提示。