Minesweeper

De DigiWiki.

Create a controller object, and drop the following script into it.

// Minesweeper v1.0 (controller)
// GPL'd. Copyright (C) 2008 Xaviar Czervik
 
integer size = 6;   // Size of the game 3 is a 3x3, 5 is a 5x5.
float percent = .1; // Percentage of squares that are mines.
 
list mat;
list mines;
integer found;
integer rand;
 
showhidden(integer i)
{
    if ((i+1)%size != 0)
    {
        llShout(rand+i+1, (string)(i+1));
    }
 
    if (i-1 >= 0)
    {
        if (i%size != 0)
        {
            llShout(rand+i-1, (string)(i-1));
        }
    }
 
    llShout(rand+i+size, (string)(i+size));
 
    if (i-size >= 0)
    {
        llShout(rand+i-size, (string)(i-size));
    }
 
    if (i-size+1 >= 0)
    {
        if ((i+1)%size != 0)
        {
            llShout(rand+i-size+1, (string)(i-size+1));
        }
    }
 
    if ((i+1)%size != 0)
    {
        llShout(rand+i+size+1, (string)(i+size+1));
    }
 
    if (i%size != 0)
    {
        llShout(rand+i+size-1, (string)(i+size-1));
    }
 
    if (i-1-size >= 0)
    {
        if (i%size != 0)
        {
            llShout(rand+i-size-1, (string)(i-size-1));
        }
    }
}
 
display()
{
    integer i = 0;
 
    while (i < llGetListLength(mat))
    {
        i += size;
    }
}
 
init()
{
    rand = (integer)llFrand(100000000) + 1000;
    integer i = 0;
 
    while (i < size*size)
    {
        if (llFrand(1) < percent)
        {
            mat += 9;
        }
 
        else
        {
            mat += 0;
        }
        i += 1;
    }
 
    i = 0;
 
    while (i < size*size)
    {
        if (llList2Integer(mat, i) == 0)
        {
            integer mines = 0;
 
            if ((i+1)%size != 0)
            {
                if (llList2Integer(mat, i+1) == 9) mines++;
            }
 
            if (i-1 >= 0)
            {
                if (i%size != 0)
                {
                    if (llList2Integer(mat, i-1) == 9) mines++;
                }
            }
 
            if (llList2Integer(mat, i+size) == 9) mines++;
 
            if (i-size >= 0)
            {
                if (llList2Integer(mat, i-size) == 9) mines++;
            }
 
            if (i-size+1 >= 0)
            {
                if ((i+1)%size != 0)
                {
                    if (llList2Integer(mat, i-size+1) == 9) mines++;
                }
            }
 
            if ((i+1)%size != 0)
            {
                if (llList2Integer(mat, i+size+1) == 9) mines++;
            }
 
            if (i%size != 0)
            {
                if (llList2Integer(mat, i+size-1) == 9) mines++;
            }
 
            if (i-1-size >= 0)
            {
                if (i%size != 0)
                {
                    if (llList2Integer(mat, i-size-1) == 9) mines++;
                }
            }
            mat = llListReplaceList(mat, [mines], i, i);
        }
        i += 1;
    }
 
    i = 0;
 
    while (i < size*size)
    {
        integer f = i + rand;
        llRezObject("Square", llGetPos() + <-(i%size)/2.0, 2, -llFloor(i/size)/2.0>, <0,0,0>, <0,0,0,0>, f);
        llSay(f, (string)size);
        llSay(f, (string)i);
        llSay(f, (string)llList2Integer(mat, i));
        i += 1;
    }
}
 
 
default
{
    state_entry()
    {
        llShout(-121215, "Die");
        llOwnerSay("Touch me when you finish.");
        init();
        llListen(-12, "", "", "");
        llListen(-13, "", "", "");
    }
 
    touch_start(integer touch_num)
    {
        integer lost;
        integer i = 0;
 
        while (i < size*size)
        {
            if (llList2Integer(mat, i) == 9)
            {
                if (llListFindList(mines, [i]) == -1)
                {
                    lost = 1;
                }
            }
            i++;
        }
 
        i = 0;
 
        while (i < llGetListLength(mines))
        {
            if (llList2Integer(mat, llList2Integer(mines, i)) != 9)
            {
                lost = 1;
            }
            i++;
        }
 
        if (lost)
            llOwnerSay("You lose.");
 
        else
            llOwnerSay("You win.");
 
        llShout(-121215, "Die");
    }
 
    listen(integer ch, string n, key id, string m)
    {
        if (ch == -13)
        {
            mines += (integer)m;
        }
 
        else if (ch == -12)
        {
            integer i = (integer)m;
            integer num = llList2Integer(mat, i);
 
            if (llListFindList(mines, [i]) != -1)
            {
                mines = llListReplaceList(mines, [], llListFindList(mines, [i]), llListFindList(mines, [i]));
            }
 
            if (num == 0)
                showhidden(i);
        }
    }
}

Then create an object called Square, and drop the following script in it. Then put the Square into the Controller.

// Minesweeper v1.0 (Square)
// GPL'd. Copyright (C) 2008 Xaviar Czervik
 
integer size;
integer num;
integer value;
integer i;
integer a;
 
default {
    on_rez(integer ii)
    {
        llListen(ii, "","", "");
        llListen(-121215, "","", "");
    }
 
    state_entry()
    {
        llSetTexture("767c7cd0-9312-0f5b-caf1-18d1b9b4d66e", ALL_SIDES);
        llOffsetTexture((6)*.077, 0, ALL_SIDES);
    }
 
    listen(integer ch, string s, key id, string m)
    {
        if (ch == -121215)
        {
            llDie();
        }
 
        else
        {
            if (i == 0)
            {
                size = (integer)m;
                i = 1;
            }
 
            else if (i == 1)
            {
                num = (integer)m;
                i = 2;
            }
 
            else if (i == 2)
            {
                value = (integer)m;
                llOffsetTexture((6)*.077, 0, ALL_SIDES);
                i = 3;
            }
 
            else if (i == 3)
            {
                i = 4;
                a = 2;
                if (value == 0)
                    llShout(-12, (string)num);
                llOffsetTexture((value-6)*.077, 0, ALL_SIDES);
            }
 
            else
            {
                llOffsetTexture((value-6)*.077, 0, ALL_SIDES);
            }
        }
    }
 
    touch_start(integer i)
    {
        if (a == 0)
        {
            llSetColor(<0,0,1>, ALL_SIDES);
            a = 1;
            llOffsetTexture((4)*.077, 0, ALL_SIDES);
        }
 
        else if (a == 1)
        {
            llSetColor(<1,0,0>, ALL_SIDES);
            a = 2;
            llOffsetTexture((5)*.077, 0, ALL_SIDES);
            llShout(-13, (string)num);
        }
 
        else if (a == 2)
        {
            llSetColor(<1,1,1>, ALL_SIDES);
            llShout(-12, (string)num);
            if (value == 9)
                llSetColor(<1,0,0>, ALL_SIDES);
            llOffsetTexture((value-6)*.077, 0, ALL_SIDES);
        }
    }
}
Outils personnels
  • Cette page a été consultée 1 372 fois.
donate
Google Ads