数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3850|回复: 7

滑块游戏的Java程序(含求解过程)

[复制链接]
发表于 2004-3-13 19:19:30 | 显示全部楼层 |阅读模式
游戏页

源程序

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.*;
import java.awt.image.*;

public final class puzz extends Applet
    implements Runnable
{

    int i = 0;
    int j = 0;
    int k = 0;
    int l = 0;
    int li = 0;
    int downX = 0;
    int downY = 0;
    int slidePiece = 0;
    int slideH = 0;
    int slideV = 0;
    int displace = 0;
    int dragging = 0;
    int seed = 0;
    int counter = 0;
    int goalsDone = 0;
    int shades[] = {
        0, 0, 1, 0, 1, 1, 0, 1, 0, 0,
        1, 0, 1, 1, 0, 1, 0
    };
    int shadows[] = {
        0, 0, 0, 2, 0, 4, 1, 3
    };
    int autoDisplace[] = {
        0, 5, 12, 21, 32, 32, 27, 20, 11, 0
    };
    int subgoals[] = {
        1, 0, 2, 0, 3, 4, 0, 5, 0, 6,
        0, 7, 8, 0, 9, 13, 0, 10, 14, 0,
        11, 12, 15, 0, 16
    };
    int detour1[] = {
        11, 10, 6, 7, 11, 10, 6, 7, 3, 2,
        6, 7, 11, -1
    };
    int detour2[] = {
        15, 14, 10, 11, 15, 14, 10, 11, 7, 6,
        10, 11, 15, -1
    };
    int detour3[] = {
        6, 2, 3, 7, -1
    };
    int detour4[] = {
        3, 7, -1
    };
    int detour5[] = {
        10, 6, 7, 11, -1
    };
    int detour6[] = {
        7, 11, -1
    };
    int detour7[] = {
        13, 12, 8, 9, -1
    };
    int detour8[] = {
        8, 9, -1
    };
    int detour9[] = {
        10, 14, 13, 9, 10, 14, 13, 9, 8, 12,
        13, 9, 10, -1
    };
    int detour10[] = {
        14, 13, 9, 10, -1
    };
    int detour11[] = {
        9, 10, -1
    };
    int detour12[] = {
        11, 15, 14, 10, 11, 15, 14, 10, 9, 13,
        14, 10, 11, -1
    };
    int roundabout[] = {
        11, 10, 14, 15, -1
    };
    int roundDisp[] = {
        -4, -3, 1, 5, 4, 3, -1, -5, -4, -3,
        1, 5, 4, 3, -1, -5, -4, -3, 1, 5,
        4, 3, -1, -5, -4
    };
    int rounddx[] = {
        0, 1, 1, 1, 0, -1, -1, -1, 0, 1,
        1, 1, 0, -1, -1, -1, 0, 1, 1, 1,
        0, -1, -1, -1, 0
    };
    int moves[] = null;
    int moveCount = 0;
    int holder[] = null;
    int current = 0;
    int moveNum = 0;
    int map[] = null;
    int ppath[] = null;
    boolean vertical = false;
    boolean dragControl = false;
    boolean automatic = false;
    boolean oldDragControl = false;
    Image background = null;
    Image vert = null;
    Image hori = null;
    Image smalls[] = null;
    Color backCol = null;
    Graphics backG = null;
    Graphics vertG = null;
    Graphics horiG = null;
    MediaTracker mt = null;
    ImageProducer improd = null;
    Thread life = null;
    long nextTime = 0;
    AudioClip click = null;
    AudioClip slide = null;

    public void init()
    {
        String s = getParameter("bgcolor");
        if(s != null && s.length() == 7)
        {
            int ai[] = new int[3];
            for(i = 0; i < 3; i++)
            {
                j = Character.toLowerCase(s.charAt(1 + i * 2));
                if(j >= 48 && j <= 57)
                    k = j - 48;
                else
                    k = (10 + j) - 97;
                j = Character.toLowerCase(s.charAt(2 + i * 2));
                if(j >= 48 && j <= 57)
                    k = 16 * k + (j - 48);
                else
                    k = 16 * k + ((10 + j) - 97);
                ai = k;
            }

            backCol = new Color(ai[0], ai[1], ai[2]);
        }
        mt = new MediaTracker(this);
        background = createImage(129, 128);
        backG = background.getGraphics();
        vert = createImage(38, 70);
        vertG = vert.getGraphics();
        hori = createImage(70, 38);
        horiG = hori.getGraphics();
        smalls = new Image[31];
        Image image = getImage(getCodeBase(), "pieces.gif");
        mt.addImage(image, 0);
        showStatus("Loading image");
        try
        {
            mt.waitForID(0);
        }
        catch(InterruptedException _ex) { }
        improd = image.getSource();
        for(i = 0; i < 2; i++)
            for(j = 0; j < 5; j++)
            {
                smalls[i * 5 + j] = createImage(new FilteredImageSource(improd, new CropImageFilter(16 * (j % 3), 16 * (j / 3) + 32 * i, 16, 16)));
                mt.addImage(smalls[i * 5 + j], 1);
            }


        smalls[10] = createImage(new FilteredImageSource(improd, new CropImageFilter(0, 64, 32, 32)));
        smalls[11] = createImage(new FilteredImageSource(improd, new CropImageFilter(0, 96, 32, 32)));
        smalls[12] = createImage(new FilteredImageSource(improd, new CropImageFilter(32, 64, 4, 38)));
        smalls[13] = createImage(new FilteredImageSource(improd, new CropImageFilter(36, 64, 4, 36)));
        smalls[14] = createImage(new FilteredImageSource(improd, new CropImageFilter(0, 128, 38, 4)));
        smalls[15] = createImage(new FilteredImageSource(improd, new CropImageFilter(0, 132, 37, 4)));
        for(i = 10; i < 16; i++)
            mt.addImage(smalls, 1);

        for(i = 0; i < 15; i++)
        {
            smalls[16 + i] = createImage(new FilteredImageSource(improd, new CropImageFilter(23 * (i & 0x1), 136 + 14 * (i / 2), 23, 14)));
            mt.addImage(smalls[16 + i], 1);
        }

        try
        {
            mt.waitForID(1);
        }
        catch(InterruptedException _ex) { }
        for(i = 0; i < 6; i++)
        {
            map = 1;
            map[i * 6] = 1;
        }

        for(i = 0; i < 4; i++)
            for(j = 0; j < 4; j++)
                map[7 + i * 6 + j] = i * 4 + j + 1 & 0xf;


        click = getAudioClip(getCodeBase(), "click.au");
        slide = getAudioClip(getCodeBase(), "slide.au");
        buildBackground();
        showStatus("Done");
    }

    public void buildBackground()
    {
        backG.setColor(backCol);
        backG.fillRect(0, 0, 129, 128);
        for(i = 0; i < 4; i++)
        {
            backG.drawImage(smalls[12], 125, i * 32, this);
            backG.drawImage(smalls[14], i * 32, 124, this);
        }

        for(i = 0; i < 5; i++)
        {
            if(map[4 + 6 * i] > 0)
                backG.drawImage(smalls[13], 125, (i - 1) * 32, this);
            if(map[24 + i] > 0)
                backG.drawImage(smalls[15], (i - 1) * 32, 124, this);
        }

        for(i = 0; i < 4; i++)
            for(j = 0; j < 4; j++)
            {
                k = 0;
                if(map[i * 6 + j] > 0)
                    k += 2;
                if(map[1 + i * 6 + j] > 0)
                    k++;
                if(map[6 + i * 6 + j] > 0)
                    k += 4;
                l = shadows[k];
                k = map[7 + i * 6 + j];
                if(k > 0)
                {
                    l += 5 * shades[k];
                    backG.drawImage(smalls[l], j * 32 - 3, i * 32 - 4, this);
                }
            }


        for(i = 0; i < 4; i++)
            for(j = 0; j < 4; j++)
            {
                k = map[7 + i * 6 + j];
                if(k > 0)
                {
                    backG.drawImage(smalls[10 + shades[k]], j * 32, i * 32, this);
                    backG.drawImage(smalls[15 + k], 5 + j * 32, 9 + i * 32, this);
                }
            }


    }

    public void drawVertical(int i1, int j1, int k1, int l1)
    {
        vertG.setColor(backCol);
        vertG.fillRect(0, 0, 38, 70);
        if(k1 > 3)
            vertG.drawImage(smalls[5 * shades[l1] + 1], 0, k1 - 1, this);
        else
            vertG.drawImage(smalls[5 * shades[l1] + 3], 0, k1 - 1, this);
        if(i1 == 3)
        {
            vertG.drawImage(smalls[12], 32, 0, this);
            vertG.drawImage(smalls[12], 32, 35, this);
            vertG.drawImage(smalls[13], 32, -29, this);
        }
        if(j1 == 2)
        {
            vertG.drawImage(smalls[14], 0, 63, this);
            vertG.drawImage(smalls[15], -29, 63, this);
        }
        if(i1 == 3)
        {
            vertG.drawImage(smalls[13], 32, 3 + k1, this);
        }
        else
        {
            k = 2;
            if(k1 < 8)
                k = 3;
            int i2;
            k += 5 * shades[map[7 + (i2 = i1 + 1) + 6 * j1]];
            vertG.drawImage(smalls[k], 32, -1, this);
            k = 2;
            if(k1 > 7)
                if(k1 < 29)
                    k = 3;
                else
                    k = 4;
            int i3;
            k += 5 * shades[map[7 + (i2 = i1 + 1) + 6 * (i3 = j1 + 1)]];
            vertG.drawImage(smalls[k], 32, 31, this);
        }
        if(j1 == 2)
        {
            if(k1 > 28)
                vertG.drawImage(smalls[15], 3 + (32 - k1), 63, this);
        }
        else
        {
            k = 1;
            if(k1 > 28)
                k = 3;
            int j2;
            k += 5 * shades[map[7 + i1 + 6 * (j2 = j1 + 2)]];
            vertG.drawImage(smalls[k], 0, 63, this);
        }
        if(i1 < 3 && j1 < 2)
        {
            k = 4;
            if(k1 > 28)
                k = 3;
            int k2;
            int j3;
            k += 5 * shades[map[7 + (k2 = i1 + 1) + 6 * (j3 = j1 + 2)]];
            vertG.drawImage(smalls[k], 32, 63, this);
        }
        for(i = -1; i < 3; i++)
            for(j = -1; j < 2; j++)
            {
                int l2 = i1 + j;
                int k3 = j1 + i;
                if(map[7 + l2 + 6 * k3] > 0)
                    vertG.drawImage(smalls[10 + shades[map[7 + (l2 = i1 + j) + 6 * (k3 = j1 + i)]]], 3 + 32 * j, 3 + 32 * i, this);
            }


        vertG.drawImage(smalls[10 + shades[l1]], 3, 3 + k1, this);
        vertG.drawImage(smalls[15 + l1], 8, 12 + k1, this);
    }

    public void drawHorizontal(int i1, int j1, int k1, int l1)
    {
        horiG.setColor(backCol);
        horiG.fillRect(0, 0, 70, 38);
        if(k1 > 3)
            horiG.drawImage(smalls[5 * shades[l1] + 2], k1, -1, this);
        else
            horiG.drawImage(smalls[5 * shades[l1] + 3], k1, -1, this);
        if(i1 == 2)
        {
            horiG.drawImage(smalls[12], 64, 0, this);
            horiG.drawImage(smalls[13], 64, -29, this);
        }
        if(j1 == 3)
        {
            horiG.drawImage(smalls[14], 0, 31, this);
            horiG.drawImage(smalls[14], 35, 31, this);
            horiG.drawImage(smalls[15], -29, 31, this);
        }
        if(i1 == 2)
        {
            if(k1 > 28)
                horiG.drawImage(smalls[13], 64, 3 + (32 - k1), this);
        }
        else
        {
            k = 2;
            if(k1 > 28)
                k = 3;
            int i2;
            k += 5 * shades[map[7 + (i2 = i1 + 2) + 6 * j1]];
            horiG.drawImage(smalls[k], 64, -1, this);
        }
        if(j1 == 3)
        {
            horiG.drawImage(smalls[15], 3 + k1, 31, this);
        }
        else
        {
            k = 1;
            if(k1 < 8)
                k = 3;
            int j2;
            k += 5 * shades[map[7 + i1 + 6 * (j2 = j1 + 1)]];
            horiG.drawImage(smalls[k], 0, 31, this);
            k = 1;
            if(k1 > 7)
                if(k1 < 29)
                    k = 3;
                else
                    k = 4;
            int i3;
            k += 5 * shades[map[7 + (j2 = i1 + 1) + 6 * (i3 = j1 + 1)]];
            horiG.drawImage(smalls[k], 32, 31, this);
        }
        if(i1 < 2 && j1 < 3)
        {
            k = 4;
            if(k1 > 28)
                k = 3;
            int k2;
            int j3;
            k += 5 * shades[map[7 + (k2 = i1 + 2) + 6 * (j3 = j1 + 1)]];
            horiG.drawImage(smalls[k], 64, 31, this);
        }
        for(i = -1; i < 2; i++)
            for(j = -1; j < 3; j++)
            {
                int l2 = i1 + j;
                int k3 = j1 + i;
                if(map[7 + l2 + 6 * k3] > 0)
                    horiG.drawImage(smalls[10 + shades[map[7 + (l2 = i1 + j) + 6 * (k3 = j1 + i)]]], 3 + 32 * j, 3 + 32 * i, this);
            }


        horiG.drawImage(smalls[10 + shades[l1]], 3 + k1, 3, this);
        horiG.drawImage(smalls[15 + l1], 8 + k1, 12, this);
    }
 楼主| 发表于 2004-3-13 19:20:24 | 显示全部楼层

    public int inMap(int i1, int j1)
    {
        return map[7 + i1 + 6 * j1];
    }

    public boolean mouseDown(Event event, int i1, int j1)
    {
label0:
        {
label1:
            {
label2:
                {
label3:
                    {
                        requestFocus();
                        moveCount = moveNum + 1;
                        if(dragging != 0 && (dragging >= 3 || (displace & 0x1f) != 0 || !dragControl))
                            break label1;
                        if((dragging == 1 || dragging == 2) && dragControl)
                            releasePiece();
                        downX = i1;
                        downY = j1;
                        j = i1 / 32;
                        i = j1 / 32;
                        int k1 = j;
                        int i3 = i;
                        if(map[7 + k1 + 6 * i3] <= 0)
                            break label2;
                        if(j < 3)
                        {
                            int l1 = j + 1;
                            int j3 = i;
                            if(map[7 + l1 + 6 * j3] == 0)
                            {
                                dragging = 2;
                                slideH = j;
                                slideV = i;
                                break label3;
                            }
                        }
                        if(j > 0)
                        {
                            int i2 = j - 1;
                            int k3 = i;
                            if(map[7 + i2 + 6 * k3] == 0)
                            {
                                dragging = 2;
                                downX -= 32;
                                slideH = j - 1;
                                slideV = i;
                                break label3;
                            }
                        }
                        if(i < 3)
                        {
                            int j2 = j;
                            int l3 = i + 1;
                            if(map[7 + j2 + 6 * l3] == 0)
                            {
                                dragging = 1;
                                slideH = j;
                                slideV = i;
                                break label3;
                            }
                        }
                        if(i > 0)
                        {
                            int k2 = j;
                            int i4 = i - 1;
                            if(map[7 + k2 + 6 * i4] == 0)
                            {
                                dragging = 1;
                                downY -= 32;
                                slideH = j;
                                slideV = i - 1;
                            }
                        }
                    }
                    if(dragging > 0)
                    {
                        vertical = dragging == 1;
                        if(slideH == j && slideV == i)
                        {
                            displace = 0;
                            counter = 0;
                        }
                        else
                        {
                            displace = 32;
                            counter = 5;
                        }
                        int l2;
                        int j4;
                        slidePiece = map[7 + (l2 = j) + 6 * (j4 = i)];
                        map[7 + j + 6 * i] = 0;
                        automatic = !dragControl;
                        if(automatic)
                            slide.play();
                    }
                }
                moveCount = 1;
                moveNum = 0;
                break label0;
            }
            if(dragging == 5)
            {
                if(i1 >= 32 * slideH && i1 < 32 + 32 * slideH && j1 >= 32 * slideV + displace && j1 < 32 + 32 * slideV + displace)
                {
                    downX = i1;
                    downY = j1 - displace;
                    dragging = 1;
                }
            }
            else
            if(dragging == 6 && i1 >= 32 * slideH + displace && i1 < 32 + 32 * slideH + displace && j1 >= 32 * slideV && j1 < 32 + 32 * slideV)
            {
                downY = j1;
                downX = i1 - displace;
                dragging = 2;
            }
        }
        return true;
    }

    public boolean mouseUp(Event event, int i1, int j1)
    {
        if(dragging > 0 && dragging < 3 && dragControl)
            releasePiece();
        return true;
    }

    public void releasePiece()
    {
        if(displace < 8)
        {
            displace = 0;
            if(vertical)
            {
                drawVertical(slideH, slideV, 0, slidePiece);
                map[7 + slideH + 6 * slideV] = slidePiece;
                backG.drawImage(vert, slideH * 32 - 3, slideV * 32 - 3, this);
            }
            else
            {
                drawHorizontal(slideH, slideV, 0, slidePiece);
                map[7 + slideH + 6 * slideV] = slidePiece;
                backG.drawImage(hori, slideH * 32 - 3, slideV * 32 - 3, this);
            }
            dragging = 0;
            click.play();
            repaint();
            return;
        }
        if(displace > 24)
        {
            displace = 32;
            if(vertical)
            {
                drawVertical(slideH, slideV, 32, slidePiece);
                map[7 + slideH + 6 * slideV + 6] = slidePiece;
                backG.drawImage(vert, slideH * 32 - 3, slideV * 32 - 3, this);
            }
            else
            {
                drawHorizontal(slideH, slideV, 32, slidePiece);
                map[7 + slideH + 6 * slideV + 1] = slidePiece;
                backG.drawImage(hori, slideH * 32 - 3, slideV * 32 - 3, this);
            }
            dragging = 0;
            click.play();
            repaint();
            return;
        }
        if(vertical)
            backG.drawImage(vert, slideH * 32 - 3, slideV * 32 - 3, this);
        else
            backG.drawImage(hori, slideH * 32 - 3, slideV * 32 - 3, this);
        dragging = (dragging & 0x3) + 4;
    }

    public boolean mouseDrag(Event event, int i1, int j1)
    {
        if(dragControl)
            switch(dragging)
            {
            case 1: // '\001'
                displace = Math.min(32, Math.max(0, j1 - downY));
                drawVertical(slideH, slideV, displace, slidePiece);
                backG.drawImage(vert, slideH * 32 - 3, slideV * 32 - 3, this);
                repaint();
                break;

            case 2: // '\002'
                displace = Math.min(32, Math.max(0, i1 - downX));
                drawHorizontal(slideH, slideV, displace, slidePiece);
                backG.drawImage(hori, slideH * 32 - 3, slideV * 32 - 3, this);
                repaint();
                break;

            }
        return true;
    }

    public void getNextMove()
    {
        int i1;
        int j1;
label0:
        {
            j1 = moves[moveNum];
            i1 = j1 / 4;
            j1 &= 0x3;
            if(j1 < 3)
            {
                int k1 = j1 + 1;
                if(map[7 + k1 + 6 * i1] == 0)
                {
                    dragging = 2;
                    slideH = j1;
                    slideV = i1;
                    break label0;
                }
            }
            if(j1 > 0)
            {
                int l1 = j1 - 1;
                if(map[7 + l1 + 6 * i1] == 0)
                {
                    dragging = 2;
                    slideH = j1 - 1;
                    slideV = i1;
                    break label0;
                }
            }
            if(i1 < 3)
            {
                int i2 = i1 + 1;
                if(map[7 + j1 + 6 * i2] == 0)
                {
                    dragging = 1;
                    slideH = j1;
                    slideV = i1;
                    break label0;
                }
            }
            if(i1 > 0)
            {
                int j2 = i1 - 1;
                if(map[7 + j1 + 6 * j2] == 0)
                {
                    dragging = 1;
                    slideH = j1;
                    slideV = i1 - 1;
                }
            }
        }
        vertical = dragging == 1;
        if(slideH == j1 && slideV == i1)
        {
            displace = 0;
            counter = 0;
        }
        else
        {
            displace = 32;
            counter = 5;
        }
        slidePiece = map[7 + j1 + 6 * i1];
        map[7 + j1 + 6 * i1] = 0;
        automatic = true;
        slide.play();
    }
 楼主| 发表于 2004-3-13 19:21:03 | 显示全部楼层

    public void scramble()
    {
        if(!automatic)
        {
            for(int i1 = 0; i1 < 4; i1++)
            {
                for(int k1 = 0; k1 < 4; k1++)
                    map[7 + i1 * 6 + k1] = i1 * 4 + k1 + 1 & 0xf;

            }

            for(int j1 = 0; j1 < 16; j1++)
            {
                seed = (seed * 171) % 30269;
                int j2 = (seed >> 5) % 15;
                int l1 = 7 + 6 * (j2 / 4) + (j2 & 0x3);
                seed = (seed * 171) % 30269;
                j2 = (seed >> 5) % 15;
                int i2;
                for(i2 = 7 + 6 * (j2 / 4) + (j2 & 0x3); i2 == l1; i2 = 7 + 6 * (j2 / 4) + (j2 & 0x3))
                {
                    seed = (seed * 171) % 30269;
                    j2 = (seed >> 5) % 15;
                }

                j2 = map[i2];
                map[i2] = map[l1];
                map[l1] = j2;
            }

            buildBackground();
            repaint();
        }
    }

    public void solve()
    {
        for(i = 0; i < 4; i++)
            for(j = 0; j < 4; j++)
            {
                int i1 = j;
                int j1;
                holder[i * 4 + j] = map[7 + i1 + 6 * (j1 = i)];
            }


        goalsDone = 0;
        i = 0;
        j = 0;
        while(holder[subgoals - 1] == subgoals)
        {
            i++;
            if(subgoals == 0)
            {
                j = i;
                goalsDone++;
                i++;
            }
        }

        for(i = 0; i < j; i++)
            if(subgoals > 0)
                holder[subgoals - 1] = -1;

        moveCount = 0;
        if((displace & 0x1f) > 0)
            goalsDone = 9;
        for(; goalsDone < 9; goalsDone++)
            switch(goalsDone)
            {
            default:
                break;

            case 0: // '\0'
                moveTo(1, 0);
                break;

            case 1: // '\001'
                moveTo(2, 1);
                break;

            case 2: // '\002'
                moveTo(3, 3);
                holder[3] = -1;
                i = locate(0);
                boolean flag = false;
                if(i == 7)
                {
                    if(holder[2] == 4)
                    {
                        makeDetour(detour3, 7);
                        flag = true;
                    }
                }
                else
                if(i == 2)
                {
                    if(holder[6] == 4)
                    {
                        makeDetour(detour4, 2);
                        flag = true;
                    }
                }
                else
                if(holder[2] == 4)
                {
                    moveTo(4, 6);
                    makeDetour(detour4, 2);
                    flag = true;
                }
                if(flag)
                    makeDetour(detour1, 7);
                else
                    moveTo(4, 7);
                holder[3] = 3;
                holder[7] = -1;
                moveTo(3, 2);
                holder[7] = 4;
                moveTo(4, 3);
                break;

            case 3: // '\003'
                moveTo(5, 4);
                break;

            case 4: // '\004'
                moveTo(6, 5);
                break;

            case 5: // '\005'
                moveTo(7, 7);
                holder[7] = -1;
                i = locate(0);
                boolean flag1 = false;
                if(i == 11)
                {
                    if(holder[6] == 8)
                    {
                        makeDetour(detour5, 11);
                        flag1 = true;
                    }
                }
                else
                if(i == 6)
                {
                    if(holder[10] == 8)
                    {
                        makeDetour(detour6, 6);
                        flag1 = true;
                    }
                }
                else
                if(holder[6] == 8)
                {
                    moveTo(8, 10);
                    makeDetour(detour6, 6);
                    flag1 = true;
                }
                if(flag1)
                    makeDetour(detour2, 11);
                else
                    moveTo(8, 11);
                holder[7] = 7;
                holder[11] = -1;
                moveTo(7, 6);
                holder[11] = 8;
                moveTo(8, 7);
                break;

            case 6: // '\006'
                moveTo(13, 8);
                holder[8] = -1;
                i = locate(0);
                boolean flag2 = false;
                if(i == 9)
                {
                    if(holder[12] == 9)
                    {
                        makeDetour(detour7, 9);
                        flag2 = true;
                    }
                }
                else
                if(i == 12)
                {
                    if(holder[13] == 9)
                    {
                        makeDetour(detour8, 12);
                        flag2 = true;
                    }
                }
                else
                if(holder[12] == 9)
                {
                    moveTo(9, 13);
                    makeDetour(detour8, 12);
                    flag2 = true;
                }
                if(flag2)
                    makeDetour(detour9, 9);
                else
                    moveTo(9, 9);
                holder[8] = 13;
                holder[9] = -1;
                moveTo(13, 12);
                holder[9] = 9;
                moveTo(9, 8);
                break;

            case 7: // '\007'
                moveTo(14, 9);
                i = locate(0);
                boolean flag3 = false;
                if(i == 10)
                {
                    if(holder[13] == 10)
                    {
                        makeDetour(detour10, 10);
                        flag3 = true;
                    }
                }
                else
                if(holder[14] == 10)
                {
                    makeDetour(detour11, 13);
                    flag3 = true;
                }
                if(flag3)
                    makeDetour(detour12, 10);
                else
                    moveTo(10, 10);
                holder[9] = 14;
                holder[10] = -1;
                moveTo(14, 13);
                holder[10] = 10;
                moveTo(10, 9);
                break;

            case 8: // '\b'
                while(holder[15] != 0)
                {
                    if(holder[10] == 0)
                    {
                        moves[moveCount++] = 11;
                        holder[10] = holder[11];
                        holder[11] = 0;
                    }
                    if(holder[11] == 0)
                    {
                        moves[moveCount++] = 15;
                        holder[11] = holder[15];
                        holder[15] = 0;
                    }
                    if(holder[14] == 0)
                    {
                        moves[moveCount++] = 15;
                        holder[14] = holder[15];
                        holder[15] = 0;
                    }
                }

                while(holder[14] != 15)
                    makeDetour(roundabout, 15);

                break;

            }

        if(moveCount > 0)
        {
            moveNum = 0;
            getNextMove();
            oldDragControl = dragControl;
            dragControl = false;
        }
    }

    public void makeDetour(int ai[], int i1)
    {
        int j1 = 0;
        int k1 = i1;
        for(; ai[j1] >= 0; moves[moveCount++] = ai[j1++])
        {
            holder[k1] = holder[ai[j1]];
            holder[ai[j1]] = 0;
            k1 = ai[j1];
        }

    }

    public void moveTo(int i1, int j1)
    {
        int l1 = locate(i1);
        int k1 = l1;
        int j2 = 0;
        while((l1 & 0x3) != (j1 & 0x3))
        {
            if((l1 & 0x3) < (j1 & 0x3))
                l1++;
            else
                l1--;
            ppath[j2++] = l1;
        }

        while(l1 > j1)
        {
            l1 -= 4;
            ppath[j2++] = l1;
        }

        holder[k1] = -1;
        for(int i2 = 0; i2 < j2; i2++)
        {
            moveHole(ppath[i2], k1);
            moves[moveCount++] = k1;
            holder[k1] = 0;
            holder[ppath[i2]] = -1;
            k1 = ppath[i2];
        }

    }

    public void moveHole(int i1, int j1)
    {
        int i3 = 0;
        int j3 = 0;
        int k1;
        int i2;
        for(k1 = locate(0); Math.abs((k1 & 0x3) - (j1 & 0x3)) > 1 || Math.abs(k1 / 4 - j1 / 4) > 1; k1 = i2)
        {
            if((k1 & 0x3) < (i1 & 0x3) && holder[k1 + 1] > 0)
                i2 = k1 + 1;
            else
            if((k1 & 0x3) > (i1 & 0x3) && holder[k1 - 1] > 0)
                i2 = k1 - 1;
            else
            if(k1 / 4 < i1 / 4 && holder[k1 + 4] > 0)
                i2 = k1 + 4;
            else
                i2 = k1 - 4;
            moves[moveCount++] = i2;
            holder[k1] = holder[i2];
            holder[i2] = 0;
        }

        if(k1 != i1)
        {
            int l1;
            for(l1 = 8; k1 != j1 + roundDisp[l1]; l1++);
            for(int j2 = l1; j1 + roundDisp[j2] != i1;)
            {
                j2++;
                if(j1 + roundDisp[j2] >= 0 && j1 + roundDisp[j2] < 16 && (j1 & 0x3) + rounddx[j2] < 4 && (j1 & 0x3) + rounddx[j2] >= 0 && holder[j1 + roundDisp[j2]] > 0)
                    i3++;
                else
                    i3 += 50;
            }

            for(int k2 = l1; j1 + roundDisp[k2] != i1;)
            {
                k2--;
                if(j1 + roundDisp[k2] >= 0 && j1 + roundDisp[k2] < 16 && (j1 & 0x3) + rounddx[k2] < 4 && (j1 & 0x3) + rounddx[k2] >= 0 && holder[j1 + roundDisp[k2]] > 0)
                    j3++;
                else
                    j3 += 50;
            }

            byte byte0;
            if(i3 <= j3)
                byte0 = 1;
            else
                byte0 = -1;
            int l2;
            for(; k1 != i1; k1 = l2)
            {
                l1 += byte0;
                l2 = j1 + roundDisp[l1];
                moves[moveCount++] = l2;
                holder[k1] = holder[l2];
                holder[l2] = 0;
            }

        }
    }

    public int locate(int i1)
    {
        for(li = 0; holder[li] != i1; li++);
        return li;
    }

    public void toggle()
    {
        dragControl = !dragControl;
        oldDragControl = dragControl;
    }

    public void run()
    {
        while(life != null)
        {
            try
            {
                Thread.sleep(Math.max(25L, nextTime - System.currentTimeMillis()));
            }
            catch(InterruptedException _ex) { }
            nextTime = System.currentTimeMillis() + 75L;
            if(automatic)
            {
                counter++;
                displace = autoDisplace[counter];
                if(dragging == 1)
                {
                    drawVertical(slideH, slideV, displace, slidePiece);
                    backG.drawImage(vert, slideH * 32 - 3, slideV * 32 - 3, this);
                }
                else
                if(dragging == 2)
                {
                    drawHorizontal(slideH, slideV, displace, slidePiece);
                    backG.drawImage(hori, slideH * 32 - 3, slideV * 32 - 3, this);
                }
                if((displace & 0x1f) == 0)
                {
                    if(vertical)
                    {
                        if(displace == 0)
                            map[7 + slideH + 6 * slideV] = slidePiece;
                        else
                            map[7 + slideH + 6 * slideV + 6] = slidePiece;
                    }
                    else
                    if(displace == 0)
                        map[7 + slideH + 6 * slideV] = slidePiece;
                    else
                        map[7 + slideH + 6 * slideV + 1] = slidePiece;
                    moveNum++;
                    dragging = 0;
                    repaint();
                    if(moveNum == moveCount)
                    {
                        automatic = false;
                        dragControl = oldDragControl;
                    }
                    else
                    {
                        getNextMove();
                    }
                }
                else
                {
                    repaint();
                }
            }
        }

    }

    public void start()
    {
        if(life == null)
        {
            life = new Thread(this);
            life.start();
            nextTime = System.currentTimeMillis() + 80L;
        }
    }

    public void stop()
    {
        if(life != null && life.isAlive())
            life.stop();
        life = null;
    }

    public int randi()
    {
        seed = (seed * 171) % 30269;
        return seed;
    }

    public boolean keyDown(Event event, int i1)
    {
        switch(i1)
        {
        case 115: // 's'
            solve();
            break;

        case 116: // 't'
            dragControl = !dragControl;
            oldDragControl = dragControl;
            break;

        case 120: // 'x'
            scramble();
            break;

        }
        return true;
    }

    public void update(Graphics g)
    {
        g.drawImage(background, 0, 0, this);
    }

    public void paint(Graphics g)
    {
        g.drawImage(background, 0, 0, this);
    }

    public puzz()
    {
        seed = 1;
        moves = new int[400];
        holder = new int[20];
        map = new int[36];
        ppath = new int[9];
        dragControl = true;
        automatic = false;
        backCol = Color.lightGray;
    }
}
 楼主| 发表于 2004-3-13 19:23:03 | 显示全部楼层
 楼主| 发表于 2004-3-14 03:28:05 | 显示全部楼层
以下是引用math618在2004-3-13 11:19:30的发言:
游戏页


进如游戏页看效果。
发表于 2004-3-15 04:52:25 | 显示全部楼层
看看先~
发表于 2004-3-15 04:52:30 | 显示全部楼层
看看先~
发表于 2004-3-22 01:49:59 | 显示全部楼层
。。。
厉害啊
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-30 15:29 , Processed in 0.058078 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表