用什么软件可以制作图片宫格图

您可能在找这些图片素材免费下载,千图网为中国设计师们免费提供包括,,。页面导航:
→ 正文内容 Java制作智能拼图游戏原理及代码
Java制作智能拼图游戏原理及代码
本文给大家分享的是使用Java实现智能拼图游戏的原理,以及实现的源码,推荐给大家,有需要的小伙伴可以参考下。
今天突发奇想,想做一个智能拼图游戏来给哄女友。
需要实现这些功能
第一图片自定义
第二宫格自定义,当然我一开始就想的是3*3 4*4 5*5,没有使用3*5这样的宫格。
第三要实现自动拼图的功能,相信大家知道女人耍游戏都不是很厉害,所以这个自动拼图功能得有。
其他什么暂停、排行就不写了!
现在重点问题出来了
要实现自动拼图功能似乎要求有点高哦!计算机有可不能像人一样只能:
先追究下本质
拼图游戏其实就是排列问题:
排列有这么一个定义:在一个1,2,...,n的排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。
再来一个定义:交换一个排列中的两个数,则排列的奇偶性发生改变。
以上定义都摘自《高等代数》。
拼图排列必须是偶排列。这个在我参考文献中可以找到。
所以我的只能拼图是这样实现的!
自动拼图:
首先自动拼图应该有一定的规则,根据我拼图的经验,要完成拼图,不同区域使用的拼图规则是不同的,所以:
我的宫格图分为了4个区域(假如宫格图是n*n个格子)
第一个区域:x坐标范围 0到n-2,y坐标范围 0到n-3
第二个区域:x坐标n-1,y坐标范围 0到n-3
第三个区域:x坐标范围 0到n-3 ,y坐标范围 n-2和n-1
第四个区域:x坐标范围 n-2到n-1 ,y坐标范围 n-2和n-1;即最后四格
每个区域按照各自区域的规则即可完成
Puzzle.java
import java.io.FileNotFoundE
import java.io.PrintS
import java.io.UnsupportedEncodingE
import java.util.R
public class Puzzle {
private long step = 0;
private int n = 6;// 宫格基数
private int[][]
private int resetBlock = 0;//
//空白块位置
private int whiteBlockX;
private int whiteBlockY;
//当前要准备移动的块的坐标即复位块
private int resetBlockX;
private int resetBlockY;
private boolean isPrint=
public Puzzle() {
public Puzzle(int n) {
private void init() {
puzzle = new int[n][n];
for (int y = 0; y & y++) {
for (int x = 0; x & x++) {
puzzle[y][x] = x + y *
whiteBlockX = n-1;
whiteBlockY = n-1;
int times = 100;// 打乱次数,必须是偶数
Random random = new Random();
while (times & 0) {
int x0 = random.nextInt(n);
int y0 = random.nextInt(n);
int x1 = random.nextInt(n);
int y1 = random.nextInt(n);
if (x0 != x1 && y0!=y1) {// 保证是偶排序
if((x0==n-1&&y0==n-1)||(x1==n-1&&y1==n-1)){//最后一个不调换
int t = puzzle[x0][y0];
puzzle[x0][y0] = puzzle[x1][y1];
puzzle[x1][y1] =
int[][] p = {{22,9 ,1 ,5 ,0 ,25 },{
33,23,20,26,18,21},{
6 ,16,17,10,34,31},{
19,28,32,7 ,3 ,2},{
11,4 ,12,14,27,24},{
15,29,30,8 ,13,35}};
public void sort(){
for (int y = 0; y & y++) {
for (int x = 0; x & x++) {
if (x == n - 1 && y == n - 1) {// 最后一个为空白,
reset(x, y);
//把块复位移动目标位置
private void reset(int targetX, int targetY) {
// 找到复位块当前的位置
initResetBlock(targetX, targetY);
* 复位顺序是从左到右,从上到下
* 移动方式 先上移动,再左移动
* 当前复位块,它要复位的位置可分为 四种情况
* 1、不在最右边一行也不是最下面两行
* 2、最右边一行 x=n-1,但不是下面两行;
* 3、最下面两行 y=n-2,但不是最右边一行;
* 4、即使最右边的一行也是最下面两行
if(targetX & n-1 && targetY & n-2){
if(resetBlockX==targetX&&resetBlockY==targetY){//位置正确不用移动
//退出递归
resetBlockToTarget(targetX, targetY);
}else if(targetX==n-1 && targetY & n-2){//第二种情况
if(resetBlockX==targetX&&resetBlockY==targetY){//位置正确不用移动
//退出递归
reset2(targetX, targetY);
}else if(targetX & n-2 && targetY == n-2){
reset3(targetX);
initResetBlock(n-2, n-2);
resetBlockToTarget(n-2, n-2);
if(whiteBlockX&n-1){
whiteBlockRight();
if(whiteBlockY&n-1){
whiteBlockDown();
if(whiteBlockX==n-1&&whiteBlockY==n-1){
reset(targetX, targetY);//递归
private void initResetBlock(int targetX,int targetY){
resetBlock = targetX + targetY *
for (int y = 0; y & y++) {
for (int x = 0; x & x++) {
if (puzzle[y][x] == resetBlock) {// x,y就是复位块的位置
resetBlockX =
resetBlockY =
private void reset3(int targetX){
if(targetX&=2){
initResetBlock(targetX, n-1);
resetBlockToTarget(targetX, n-2);
initResetBlock(targetX, n-2);
resetBlockToTarget(targetX+1, n-2);
while (!(whiteBlockX==targetX && whiteBlockY==n-1)) {
if(whiteBlockY&n-1){
whiteBlockDown();
if(whiteBlockX&targetX){
whiteBlockLeft();
whiteBlockUp();
swapWhiteBlockAndCurrentBlock();
if(puzzle[n-2][targetX]!=resetBlock||puzzle[n-1][targetX]!=(resetBlock+n)){//没有复位成功
swapWhiteBlockAndCurrentBlock();
reset3_0();
reset3(targetX);
private void reset3_0(){
if(resetBlockX&n-1){
whiteBlockDown();
whiteBlockRight();
whiteBlockRight();
whiteBlockUp();
swapWhiteBlockAndCurrentBlock();
reset3_0();
private void reset2_3(){
if(whiteBlockX==resetBlockX && whiteBlockY==resetBlockY+1){
//满足条件,退出递归
//白块可能在复位块的:左方、左下、下方
if(whiteBlockY==resetBlockY){//左方
whiteBlockDown();
}else if(whiteBlockX & resetBlockX){//左下
whiteBlockRight();
whiteBlockUp();
reset2_3();//递归
private void reset2_2(int targetX, int targetY){
if(resetBlockX==targetX&&resetBlockY==targetY){//2、把复位块移到目标位置正下方
//退出递归
//复位块可能位置,目标位置左方、正下方、左下方
if(resetBlockX==targetX){//正下方 上移
resetBlockUp(targetX, targetY);
}else{//左方或左下方;先右移再上移
resetBlockRight(targetX, targetY);
reset2_2(targetX, targetY);//递归
private void reset2(int targetX, int targetY){
if(resetBlockX==targetX&&resetBlockY==targetY){//位置正确不用移动
//退出递归
/* 1、如果白块正好占了目标位置:如果复位块正好在下方,交换及完成复位,如果下方不是复位块,把白块移开目标位置
* 2、把复位块移到目标位置正下方
* 3、把白块移动复位块下方
* 4、按照规定的步骤复位
if(whiteBlockX==targetX&& whiteBlockY==targetY){
if(whiteBlockX==resetBlockX&&whiteBlockY==resetBlockY+1){//复位块在下方
swapWhiteBlockAndCurrentBlock();
whiteBlockDown();
//第二步 把复位块移到目标位置正下方
reset2_2(targetX, targetY+1);
//第三步 把白块移动复位块下方
reset2_3();
//第四步 按照规定的步骤复位
swapWhiteBlockAndCurrentBlock();
whiteBlockLeft();
whiteBlockUp();
whiteBlockRight();
whiteBlockDown();
whiteBlockLeft();
whiteBlockUp();
whiteBlockRight();
whiteBlockDown();
swapWhiteBlockAndCurrentBlock();
whiteBlockLeft();
whiteBlockUp();
whiteBlockUp();
whiteBlockRight();
swapWhiteBlockAndCurrentBlock();
private void resetBlockToTarget(int targetX, int targetY){
if(resetBlockX==targetX&&resetBlockY==targetY){//位置正确不用移动
//退出递归
if(resetBlockY==targetY){//正左
resetBlockLeft(targetX, targetY);
}else{//左下,下,右下
if(resetBlockX&=targetX){//右下||下;上移
if(resetBlockX==n-1){//复位块在最右边,先左移;方便上移时统一的采用白块逆时针方式
resetBlockLeft(targetX, targetY);
resetBlockUp(targetX, targetY);
}else{//左下;右移
resetBlockRight(targetX, targetY);
resetBlockToTarget(targetX, targetY);//递归
private void resetBlockRight(int targetX, int targetY){
if(resetBlockX==targetX&&resetBlockY==targetY){//位置正确不用移动
//退出递归
if(resetBlockX==n-1){//复位块在最右边了,无法右移,直接退出
System.out.println("resetBlockRight");
if(whiteBlockY&resetBlockY){//上方
if(whiteBlockY&resetBlockY-1){//上方多行
whiteBlockDown();
}else{//上方一行
if(whiteBlockX&resetBlockX+1){//左上和正上
whiteBlockRight();
}else{//右上
whiteBlockDown();
}else if(whiteBlockY==resetBlockY){//同一行
if(whiteBlockX&resetBlockX){//左方
if(whiteBlockY==n-1){//到底了,只能往上
whiteBlockUp();
whiteBlockDown();
}else{//右方
if(whiteBlockX==resetBlockX+1){
swapWhiteBlockAndCurrentBlock();
//退出递归
whiteBlockLeft();
}else{//下方
if(whiteBlockX &= resetBlockX){//左下、下
whiteBlockRight();
}else{//右下
whiteBlockUp();
resetBlockRight(targetX, targetY);//递归
private void resetBlockLeft(int targetX, int targetY){
if(resetBlockX==targetX&&resetBlockY==targetY){//位置正确不用移动
//退出递归
if(resetBlockX==0){//在左边边界 复位块无法左移,直接退出递归
System.out.println("resetBlockLeft");
if(whiteBlockY&resetBlockY){//上方
if(whiteBlockY&resetBlockY-1){//上方多行
whiteBlockDown();
}else{//上方一行
if(whiteBlockX==resetBlockX){//上方
if(whiteBlockX==n-1){//最右边,白块无法右移,只能左移
whiteBlockLeft();
if(resetBlockY==n-1){//复位块在最低端,白块不能顺时针移动
whiteBlockLeft();
whiteBlockRight();
}else if(whiteBlockX&resetBlockX){//右上方
if(resetBlockY==n-1){//复位块在最低端,白块不能顺时针移动
whiteBlockLeft();
whiteBlockDown();
}else{//左上方
whiteBlockDown();
}else if(whiteBlockY==resetBlockY){//左方、右方
if(whiteBlockX&resetBlockX){//左方
if(whiteBlockX==resetBlockX-1){//左边一格
swapWhiteBlockAndCurrentBlock();//退出递归
whiteBlockRight();
}else{//右方
if(whiteBlockY==n-1){//到底了,不能下移。只能上移
whiteBlockUp();
whiteBlockDown();
}else{//左下、下方、右下
if(whiteBlockX&resetBlockX){//左下
if(whiteBlockX==resetBlockX-1){
whiteBlockUp();
whiteBlockRight();
}else{//下方、右下
whiteBlockLeft();
resetBlockLeft(targetX, targetY);//递归
private void resetBlockUp(int targetX, int targetY){
if(resetBlockX==targetX&&resetBlockY==targetY){//位置正确不用移动
//退出递归
if(resetBlockY==0){//复位块到顶了,无法上移
System.out.println("resetBlockUp");
if (whiteBlockY & resetBlockY) {//上方
if(whiteBlockY & resetBlockY - 1){//上方多行
whiteBlockDown();
}else{//上方一行
if(whiteBlockX == resetBlockX){//白块和复位块在同一列(竖列) 白块和复位块直接交换位置
swapWhiteBlockAndCurrentBlock();//退出递归
if(whiteBlockX&resetBlockX){//白块在复位块的左边;白块右移
whiteBlockRight();
}else{//白块在复位块的右边;白块左移
whiteBlockLeft();
} else if (whiteBlockY == resetBlockY) {//白块和复位块同一行;白块上移
if(whiteBlockX&resetBlockX){//正左
if(whiteBlockX&resetBlockX-1){//正左多格
whiteBlockRight();
}else{//正左一格
if(whiteBlockY==n-1){//到底了
whiteBlockUp();
if(resetBlockX==n-1){//复位块在最右边,无法逆时针,只有顺指针移动白块
whiteBlockUp();
whiteBlockDown();
}else{//正右
whiteBlockUp();
}else{//白块在复位块下方,白块需要饶过复位块上移,白块逆时针绕到白块上面
//三种情况:左下,下,右下
if(whiteBlockX&=resetBlockX){//左下,下;白块右移
if(resetBlockX==n-1){//复位块在最右边,无法逆时针,只有顺指针移动白块
if(whiteBlockX==resetBlockX){//正下方
whiteBlockLeft();
}else{//左下方
whiteBlockUp();
whiteBlockRight();
}else{//右下;白块上移
whiteBlockUp();
resetBlockUp(targetX, targetY);//递归
//白块和复位块交换位置
private void swapWhiteBlockAndCurrentBlock(){
int tempX = whiteBlockX,tempY = whiteBlockY;
int temp = puzzle[whiteBlockY][whiteBlockX];
puzzle[whiteBlockY][whiteBlockX] = puzzle[resetBlockY][resetBlockX];
puzzle[resetBlockY][resetBlockX] =
whiteBlockX = resetBlockX;
whiteBlockY = resetBlockY;
resetBlockX = tempX;
resetBlockY = tempY;
println("swap");
private void whiteBlockDown(){
int temp = puzzle[whiteBlockY][whiteBlockX];
puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY+1][whiteBlockX];
puzzle[whiteBlockY+1][whiteBlockX] =
whiteBlockY++;
println("↓");
private void whiteBlockUp(){
int temp = puzzle[whiteBlockY][whiteBlockX];
puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY-1][whiteBlockX];
puzzle[whiteBlockY-1][whiteBlockX] =
whiteBlockY--;
println("↑");
private void whiteBlockLeft(){
int temp = puzzle[whiteBlockY][whiteBlockX];
puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY][whiteBlockX-1];
puzzle[whiteBlockY][whiteBlockX-1] =
whiteBlockX--;
println("←");
private void whiteBlockRight(){
int temp = puzzle[whiteBlockY][whiteBlockX];
puzzle[whiteBlockY][whiteBlockX] = puzzle[whiteBlockY][whiteBlockX+1];
puzzle[whiteBlockY][whiteBlockX+1] =
whiteBlockX++;
println("→");
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("resetBlock=("+resetBlock+","+resetBlockX+","+resetBlockY+")\n");
if(puzzle!=null){
int len = String.valueOf(n*2-1).length();
for (int y = 0; y & y++) {
for (int x = 0; x & x++) {
sb.append(",");
sb.append(_str(String.valueOf(puzzle[y][x]), len));
sb.append("\n");
sb.append("---------------------------------------");
sb.append("puzzle is null");
return sb.toString();
private String _str(String str,int len){
str=str==null?"":
if(str.length()&len){
return _str(str+" ", len);
private void println(String str){
if(isPrint){
System.out.println(str);
System.out.println(this);
public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException {
System.setOut(new PrintStream("e:/puzzle.txt","UTF-8"));
Puzzle p = new Puzzle();
System.out.println(p);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception:");
System.out.println(p);
以上所述就是本文的全部内容了,希望大家能够喜欢。
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910四宫格图有什么美图软件吗?_百度知道
四宫格图有什么美图软件吗?
//g.downxia.jpg" esrc="拼立得InstaMag拼立得安卓手机版.com/zhidao/wh%3D450%2C600/sign=00a695dfd209b3deebeaec6cf98f40b7/3b87ec46d054c4f8f2baab.hiphotos.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http&//zhidao/pic/item/3b87ec46d054c4f8f2baab:///downinfo/48976.html" target="_blank">http.baidu:///zhidao/wh%3D600%2C800/sign=db59cc944ac6b78a268fd31/3b87ec46d054c4f8f2baab.baidu://g:<a href="http.downxia.baidu
来自团队:
其他类似问题
为您推荐:
其他1条回答
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁photoshop怎么把笔刷设置成G笔的效果_百度知道
photoshop怎么把笔刷设置成G笔的效果
画笔设置里面有“压感”选项的,还有画笔形状可以设成椭圆(圆率可以调),只要你的数位板压感级别够高,就是G笔尖的效果了。按照自己喜好调整的,先调成椭圆,然后椭圆在圆周方向的角度(倾斜度)也调一下,我一般调出来的是右倾38度左右
其他类似问题
2人觉得有用
为您推荐:
提问者采纳
画笔设置里面有“压缉鸡光课叱酒癸旬含莫感”选项的,还有画笔形状可以设成椭圆(圆率可以调),只要你的数位板压感级别够高,就是G笔尖的效果了。
请问有没有具体的数值可以参考一下?我好像调不满意……。
这个真没有,我完全是按照自己喜好调整的,先调成椭圆,然后椭圆在圆周方向的角度(倾斜度)也调一下,我一般调出来的是右倾38度左右的,圆率看你喜欢了~?你看G笔尖的特性,主要是金属比较软,弹性大,也就是压力敏感比较大嘛~~~
提问者评价
来自团队:
其他3条回答
画了之后再利用滤镜里的油画效果处理下就OK了5里面还有缉鸡光课叱酒癸旬含莫素描什么的都有那去网站找下看有没有油画方面的画笔我想应该可以找到那样的笔刷的i
看看这个能帮到你不/article/84b4ff6da3291.html
笔刷的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁 |  |  | 
您的位置: >>
>> 桌面宫格 V1.1.0 绿色免费版
桌面宫格 V1.1.0 绿色免费版
软件类别:
软件语言:
相关链接:
软件大小:
软件评级:
运行环境:
Vista/win7/WinXP/Win2000/
更新时间:
热门软件推荐
本类网友推荐排行
本周人气软件推荐
桌面宫格软件简介:关键字:桌面宫格 窗口缩略图 窗口宫格图 宫格图桌面宫格软件主要功能:以缩略图方式罗列所有打开的窗口,然后可以方便的选择打开,关闭,锁定一个窗口。快捷键 alt+z 切换 宫格图。
桌面宫格V1.1.0 绿色免费版图片(1/1)
温馨提示: 您的IP是 220.177.198.53,用的是电信网络,建议您进入中国电信下载点 ,
高速下载器通道:
其他下载通道:
备用下载通道:
,软件? 软件下载后?飞翔小编十二分诚意等待着您的投诉与建议
软件无法下载
下载后无法使用
与描述不一致
1.飞翔下载所有软件均来自程序作者提供和网友推荐收集,仅供学习和研究,如有侵权,请及时通知我们删除。
2.访问飞翔下载的用户必须明白飞翔下载对提供下载的软件等不拥有任何权利,其版权归下载资源的合法拥有者。
3. 根据二零零二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬,请按规定使用。
谈谈您对该软件的看法
综合评价:

我要回帖

更多关于 可以制作动画的软件 的文章

 

随机推荐