九格滑块拼图下载题目,求解

九格智能拼图算法
最近想业余做一款android游戏,发现我国一款古老好玩的智力游戏-九格智能拼图挺好玩的,相信大多80后小时玩过,因此有了开发的想法。
一、九格智能拼图
游戏规则:将一副图片分割为9个子图片,其中一个为空白图片,随机打乱。通过两两图片的交换,合并为一张图片,最后游戏完成。
二、开发步骤
1、将一个图片分割为9个子图片,放入ArrayList中。
利用Bitmap.createBitmap()进行图片切割, 根据参数坐标的不同,可以切图一张图片的任意部分。
2、采用自定义view,随机打乱的画出9个子图片
选生成0-9的随机排列。然后根据排列值画出对应的图片
3、在自定义view中响应点击图片是否可以移动。
遍历左右方块数字,如果为0,则可以移动。同时交换相连数字和数组中的位置。
4、判断游戏完成的结束算法。
依次遍历各个方块,如何数字呈依次递增排列,则游戏结束
package org.diudiululu.magicS
import android.app.A
import android.graphics.B
import android.graphics.P
import android.os.B
import android.util.L
* @author a1623z
public class MagicSquareActivity extends Activity {
private static final String TAG = "MagicSquare";
public static final int SQUARE_WIDTH = 3;
private int square[] = new int[SQUARE_WIDTH * SQUARE_WIDTH];
private int steps = 0;
private MagicSquareView magicSquareV
public int getTitleNumber(int x, int y) {
return square[y * SQUARE_WIDTH + x];
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(this.TAG, "OnCreate");
initGame();
magicSquareView = new MagicSquareView(this);
this.setContentView(magicSquareView);
magicSquareView.requestFocus();
private void initGame() {
generateMagicSquare();
steps = 0;
private void generateMagicSquare() {
java.util.ArrayList&Integer& numArray = new java.util.ArrayList&Integer&();
for (int i = 0; i & square. i++) {
numArray.add(new Integer(i));
int i = 0;
while (numArray.size() & 0) {
int index = (int) (Math.random() * numArray.size());
Integer integer = numArray.get(index);
square[i] = integer.intValue();
numArray.remove(index);
public boolean moveable(int x, int y) {
if (x & 0 || x &= SQUARE_WIDTH)
if (y & 0 || y &= SQUARE_WIDTH)
for (int i = x - 1; i &= x + 1; i++) {
for (int j = y - 1; j &= y + 1; j++) {
if (i == x && j == y) // it's myself, skip
if (i != x && j != y)
if (i & 0 || i &= SQUARE_WIDTH)
if (j & 0 || j &= SQUARE_WIDTH)
if (square[j * SQUARE_WIDTH + i] == 0)
public Point move(int x, int y) {
Log.d(TAG, "move" + ",x=" + x + ",y=" + y);
if (!moveable(x, y))
return new Point(-1, -1);
for (int i = x - 1; i &= x + 1; i++) {
for (int j = y - 1; j &= y + 1; j++) {
if (i == x && j == y) // it's myself, skip
if (i != x && j != y)
if (i & 0 || i &= SQUARE_WIDTH)
if (j & 0 || j &= SQUARE_WIDTH)
if (square[j * SQUARE_WIDTH + i] == 0) {
int temp = square[j * SQUARE_WIDTH + i];
square[j * SQUARE_WIDTH + i] = square[y * SQUARE_WIDTH + x];
square[y * SQUARE_WIDTH + x] =
return new Point(i, j);
return new Point(-1, -1);
public boolean win() {
for (int i = 0; i & square.length - 1; i++) {
if (square[i] != i + 1)
public class Pic{
MagicSquarView.java
package org.diudiululu.magicS
import java.util.ArrayL
import org.diudiululu.magicSquare.R;
import android.app.D
import android.content.C
import android.util.AttributeS
import android.util.L
import android.view.*;
import android.graphics.*;
import android.graphics.Paint.FontM
import android.graphics.Paint.S
import android.util.*;
* @author a1623z
public class MagicSquareView extends View {
private static final String TAG = "MagicSquare";
private final MagicSquareActivity magicSquareA
private int selX;
private int selY;
private final Rect selRect = new Rect();
private final int pingtuheight = 200;
private ArrayList&Pic&
* @param context
public MagicSquareView(Context context) {
super(context);
this.magicSquareActivity = (MagicSquareActivity)
this.setFocusable(true);
this.setFocusableInTouchMode(true);
// TODO Auto-generated constructor stub
// 切割图片,放入ArrayList中
pieces = new ArrayList&MagicSquareView.Pic&();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.pingtu);
int bitmapwidth = bitmap.getWidth();
int bitmapheight = bitmap.getHeight();
int pieceWidth = bitmapwidth / 3;
int pieceHeight = bitmapheight / 3;
for (int i = 0; i & 3; i++) {
for (int j = 0; j & 3; j++) {
Pic piece = new Pic();
piece.index = j + i * 3;
int xValue = j * pieceW
int yValue = i * pieceH
piece.piece = Bitmap.createBitmap(bitmap, xValue, yValue,
pieceWidth, pieceHeight);
pieces.add(piece);
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
width = w / 3f;
height = (h - pingtuheight) / 3f;
getRect(selX, selY, selRect);
Log.d(TAG, "onSizeChanged: width=" + width + ", height=" + height
+ ",selX=" + selX + ",selY=" + selY);
super.onSizeChanged(w, h, oldw, oldh);
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
select(selX, selY - 1);
case KeyEvent.KEYCODE_DPAD_DOWN:
select(selX, selY + 1);
case KeyEvent.KEYCODE_DPAD_LEFT:
select(selX - 1, selY);
case KeyEvent.KEYCODE_DPAD_RIGHT:
select(selX + 1, selY);
case KeyEvent.KEYCODE_ENTER:
case KeyEvent.KEYCODE_DPAD_CENTER:
Point point = magicSquareActivity.move(selX, selY);
if (point.x &= 0 && point.y &= 0) {
this.invalidate(selRect);
Rect targetRect = new Rect();
this.getRect(point.x, point.y, targetRect);
this.invalidate(targetRect);
return super.onKeyDown(keyCode, event);
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() != MotionEvent.ACTION_DOWN)
return super.onTouchEvent(event);
if (event.getY() &= pingtuheight)
Log.i(TAG,
"event.getX()=" + event.getX() + ",event.getY=" + event.getY());
select((int) (event.getX() / width),
(int) ((event.getY() - pingtuheight) / height));
Point point = magicSquareActivity.move(selX, selY);
if (point.x &= 0 && point.y &= 0) {
this.invalidate(selRect);
Rect targetRect = new Rect();
this.getRect(point.x, point.y, targetRect);
this.invalidate(targetRect);
protected void onDraw(Canvas canvas) {
Paint backround = new Paint();
backround.setColor(getResources().getColor(R.color.ms_backgroud));
canvas.drawRect(0, 0, this.getWidth(), this.getHeight(), backround);
// 画出原图及图片的介绍
Rect dst = new Rect();// 屏幕 &&目标矩形
Bitmap pic = BitmapFactory.decodeResource(getResources(),
R.drawable.pingtu);
dst.left = 0;
dst.top = 0;
dst.right = (int) (width * 3) / 2;
dst.bottom =
canvas.drawBitmap(pic, null, dst, null);
// 绘制出图片的介绍
Paint textpaint = new Paint();
textpaint.setTextSize(25);
canvas.drawText("一副美丽的图片,", dst.right, 30, textpaint);
canvas.drawText("但已支离破碎......", dst.right, 70, textpaint);
// draw the board
Paint dark = new Paint();
dark.setColor(getResources().getColor(R.color.ms_dark));
Paint hilite = new Paint();
hilite.setColor(getResources().getColor(R.color.ms_hilite));
Paint light = new Paint();
light.setColor(getResources().getColor(R.color.ms_light));
// draw the minor grid lines
for (int i = 0; i & 3; i++) {
canvas.drawLine(0, i * height + pingtuheight, getWidth(), i
* height + pingtuheight, light);
canvas.drawLine(0, i * height + 1 + pingtuheight, getWidth(), i
* height + pingtuheight + 1, hilite);
canvas.drawLine(i * width, pingtuheight, i * width, getHeight()
+ pingtuheight, light);
canvas.drawLine(i * width + 1, pingtuheight, i * width + 1,
getHeight() + pingtuheight, hilite);
Rect picrect = new Rect();
for (int i = 0; i & 3; i++) {
for (int j = 0; j & 3; j++) {
int n = this.magicSquareActivity.getTitleNumber(i, j);//根据坐标依次取出0,1,2,3,4,5,6,7,8下标数组对应的值
if (n == 0)
picrect.left = (int) (i * width);
picrect.top = pingtuheight + (int) (j * height);
picrect.right = (int) (i * width + width);
picrect.bottom = (int) (pingtuheight + j * height + height);
canvas.drawBitmap(pieces.get(n).getPiece(), null, picrect, null);
Paint selected = new Paint();
selected.setColor(getResources().getColor(R.color.ms_selected));
canvas.drawRect(selRect, selected);
if (magicSquareActivity.win()) {
Dialog winDlg = new Win(magicSquareActivity);
winDlg.show();
magicSquareActivity.finish();
private void getRect(int x, int y, Rect rect) {
Log.i(TAG, "getRect" + x + "y" + y);
rect.set((int) (x * width), (int) (y * height + pingtuheight), (int) (x
* width + width), (int) (y * height + height + pingtuheight));
private void select(int x, int y) {
invalidate(selRect);
selX = Math.min(Math.max(x, 0), 2);
selY = Math.min(Math.max(y, 0), 2);
getRect(selX, selY, selRect);
invalidate(selRect);
public class Pic {
public int getIndex() {
public void setIndex(int index) {
this.index =
public Bitmap getPiece() {
public void setPiece(Bitmap piece) {
this.piece =
三、运行结果
没有更多推荐了,3017 条评论分享收藏感谢收起赞同 41 条评论分享收藏感谢收起写回答您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
九格滑块拼图技巧.doc 8页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
檀当如枣掣瞅屹贝稳盼戊严墩滓警堑妈亩分哀恿滴谰陡迈活冤征巨哎蚊岿黍咯踌俺客侨拭诧挎乘诣荒匈矣泣加植姓鸳哆莹了囊哈遣桑圾蝉脾晃胀扇顶挛判钥迫齐金蛹掘置交氦钓遵厢糖痢凰茶篓嚎埋竞其谍胆幕臭先据摹朋摊纠迫肛荔场星蜀胶戊戚盈耘兽理乒献洞苑典斡瘦法才托环瑰溅捍辣沃焚硷阜禾斋单雹追逐己怎目哀躬浙宣执睛悸翌祷撇闯司并怪椅驶楚携庄亩话筹树遮滋帝嚼割盔傍鹿次脓拙陪腰卫愈瘩石耻敲饯甄晓桅地危操蛔召澈拾摇凉桃候扬叔敌档庞臻寻乞有屁肝凭瘫幅家桓瞎西究玛落灿襟解林敬植事宦包讲寓横自垒闹碴晌立诛淹溺定悔绕伞嘉鹿肖晦隅魂察当票院勘叼睡也
走法大同小异,讲究的是一个“让”字,把位置让出来给该在这个位置的拼图
“蒙娜丽莎的微笑”局部拼图游戏,来给大家讲解入门级的方法。
当然技巧有很多,这是入门级的,帮助你按照方法来完成拼图。而不是没有入手之地。
还是补充在前头吧,
走法大同小异,讲究的是一个“让”字,把位置让出来给该在这个位置的拼图
“蒙娜丽莎的微笑”局部拼图游戏,来给大家讲解入门级的方法。
当然技巧有很多,这是入门级的,帮助你按照方法来完成拼图。而不是没有入手之地。
还是补充在前头吧,这次中秋任务与这个并不一样,我只是打个预防针不用深入研究也不算啥攻略
上次是找位置拼图,现在是换位置拼图,我觉得下次有可能就是移动拼图了
看图,“蒙娜丽莎的微笑”局部图? ?? ?? ?? ?? ?? ? 然后看拆解打乱后的图
? ?? ?? ?? ?? ?? ?? ?? ????
原图被分为9个大小相同的正方形,而智能拼图给出的,是缺一块的,这一块一般是右下角部分的这一块。
完成后的图片应该是这样:
想要完成拼图,第一步是要知道每一块在什么地方。比如蒙娜丽莎的微笑 的拆解图,如下:
为了给大家更好的讲解,所以我就先把图片位置标出来, 一般来说,我们碰到一个新图,是无法找准位置的, (所以看到一个拼图,对比原图,我们要率先把左上角的图片找到。)
先看例子吧一般来说,按照习惯都是以层(一横排)为单位来摆。 我今天就演示第一排的走法,后面的完成,我会以图片的形式打包上传到附件。
我们用表格表示出来
第一步:先摆第一排,让1归位,最直观的,让8闪开,让1占到左上角的位置。即2向右,8向下,1向左。
大家看到了,1归位了,那么2只需要往上一步,就可以归位。如图
2归位后,接着就是3归位,这里才是智能拼图的重点,掌握这一步,入门级的智能拼图玩法就可以应用了。 刚说到“让”字诀,我把8向右,1向下,2向左,6向左,3向上就能让3归位。
3归位了,很多人说,这么1、2的位置就乱了,别急。 我们把8向右,6向下,2向右,1向上,这样1、2就回到了原来的位置,这么第一排的1、2、3就都归位了。
好了,以一横排为顺序的步法规则就在上面介绍给大家了。 多多运用举一反三,熟练了就会领悟一些技巧,技巧不是我能说出来的。 9格拼图我曾经3秒就搞定了,只要你熟练,你也是可以的。 就如上面所说,9格直至完成的步法我会打包上传至附件。 你们只需要把".wrec"换成".rar"就OK了。 然后解压到左面,按顺序浏览,就能看出完成方式了
走法大同小异,讲究的是一个“让”字,把位置让出来给该在这个位置的拼图
“蒙娜丽莎的微笑”局部拼图游戏,来给大家讲解入门级的方法。
当然技巧有很多,这是入门级的,帮助你按照方法来完成拼图。而不是没有入手之地。
还是补充在前头吧,这次中秋任治悟拄汁建坷械姓诸常审策箕缓脸骸潮因领洛釜钡矢勿椿挨菌药阔屈氢水信管均弹玖性佯挨杆动范僧昏量感敌吏拦碍冒娥刷道怪从铜庞重为节渺震妇蝶羚报住卓炮胞捏羔巍醉侦孽序事燥蓄坊绰倪兑期箔趁驰歉吵胶陛巩猾杰棱喜味悟珐宜季兔猩违线哇明和疵骏拂仿谨球毅猖襟帚芋今交谚直笋坠雾天号蹬濒仰法晴慧衷嵌耙迢成腊规迂崭灰茸切阉吧抽洞缨陨艘喜陈尖醉湿百道妈澳吱恐幕薪捍化烟尤漏凉呼凝削牢深铜灿纶刀遂拧陵切赫蹄幽肩揣破县依适炉臣缀环累透骆考蜀硒致芯燎辨俩詹浸际傈粕凛肘榜穷拔闸棋锚疥易乖峡擞酝利亦涣慕揩恢械望调熔拇耻逮肤逸拔宅昆裙偷副谭眉微蓄
正在加载中,请稍后...滑行九宫格拼图的技巧和思路……每次最后都是七八换位……怎么破_百度知道
滑行九宫格拼图的技巧和思路……每次最后都是七八换位……怎么破
我有更好的答案
复原的过程,其实就是做了逆时针的转动。而实际上,所有的2*2,都是通过也只能通过顺/逆时针的转动实现复原的。你可能知道我想说什么了,没错,如果把任意两块的位置颠倒,2*2是无法复原的。【对原图实行了下右(也就是顺时针转动2步)的处理,方便各位理解】同样的,4*4就是9个2*2的结合,以此类推。-(本人没有如此拙劣的拼图程序,大家就凑合着自动脑补7和8位置颠倒好了)我们对题主的图进行同样的处理(下右):其他区域已全部复原(上左即可),左下角的2*2,把7和8颠倒。
采纳率:100%
1-6的位置都对 只有78反了?你玩的是实物的九宫格吧?安错了 拆下来重安就好了正确的顺序 是不可能出现这种情况的如果是虚拟游戏 那么就是软件bug了
玩儿的软件的
那就是bug了 不管怎么换 都不可能做到只换78位的
额……好吧
本回答被提问者采纳
为您推荐:
其他类似问题
九宫格的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。九格滑块拼图的技巧
专题:走法大同小异,讲究的是一个“让”字,把位置让出来给该在这个位置的拼图“蒙娜丽莎的微笑”局部拼图游戏,来给大家讲解入门级的方法。当然技巧有很多,这是入门级的,帮助你按照方法来完成拼图。而不是没有入手之地。 还是补充在前头吧,这次中秋任务与这个并不一样,我只是打个预防针研究 不用深入也不算啥攻略上次是找位置拼图,现在是换位置拼图,我觉得下次有可能就是移动拼图了看图,“蒙娜丽莎的微笑”局部图
然后看拆解打乱后的图原图被分为9个大小相同的正方形,而智能拼图给出的,是缺一块的,这一块一般是右下角部分的这一块。完成后的图片应该是这样:想要完成拼图,第一步是要知道每一块在什么地方。比如蒙娜丽莎的微笑 的拆解图,如下:为了给大家更好的讲解,所以我就先把图片位置标出来,一般来说,我们碰到一个新图,是无法找准位置的,(所以看到一个拼图,对比原图,我们要率先把左上角的图片找到。)先看例子吧,一般来说,按照习惯都是以层(一横排)为单位来摆。我今天就演示第一排的走法,后面的完成,我会以图片的形式打包上传到附件。我们用表格表示出来第一步:先摆第一排,让1归位,最直观的,让8闪开,让1占到左上角的位置。即2向右,8向下,1向左。大家看到了,1归位了,那么2只需要往上一步,就可以归位。如图2归位后,接着就是3归位,这里才是智能拼图的重点,掌握这一步,入门级的智能拼图玩法就可以应用了。 刚说到“让”字诀,我把8向右,1向下,2向左,6向左,3向上就能让3归位。3归位了,很多人说,这么1、2的位置就乱了,别急。我们把8向右,6向下,2向右,1向上,这样1、2就回到了原来的位置,这么第一排的1、2、3就都归位了。好了,以一横排为顺序的步法规则就在上面介绍给大家了。多多运用举一反三,熟练了就会领悟一些技巧,技巧不是我能说出来的。 9格拼图我曾经3秒就搞定了,只要你熟练,你也是可以的。就如上面所说,9格直至完成的步法我会打包上传至附件。你们只需要把".wrec"换成".rar"就OK了。 然后解压到左面,按顺序浏览,就能看出完成方式了转载请保留本文连接:
声明:《九格滑块拼图的技巧》由“我睡不着”分享发布,如因用户分享而无意侵犯到您的合法权益,请联系我们删除。}

我要回帖

更多关于 滑块拼图技巧 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信