Difference between revisions of "Minesweeper"

From Second Life Wiki
Jump to navigation Jump to search
(Added LSL Header)
m (<lsl> tag to <source>)
 
(2 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{LSL Header}}
{{LSL Header}}


(http://www.gnu.org/copyleft/fdl.html) in the spirit of which this script is GPL'd. Copyright (C) 2007 Xaviar Czervik
(http://www.gnu.org/copyleft/fdl.html) in the spirit of which this script is GPL'd. Copyright (C) 2008 Xaviar Czervik


This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.  
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.  
Line 11: Line 11:


Create a controller object, and drop the following script into it.
Create a controller object, and drop the following script into it.
<pre>
<source lang="lsl2">
integer size = 6;    //Size of the game 3 is a 3x3, 5 is a 5x5.
integer size = 6;    //Size of the game 3 is a 3x3, 5 is a 5x5.
float percent = .1;    //Percentage of squares that are mines.
float percent = .1;    //Percentage of squares that are mines.
Line 179: Line 179:
     }
     }
}
}
</pre>
</source>


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


<pre>
<source lang="lsl2">
integer size;
integer size;
integer num;
integer num;
Line 245: Line 245:
     }
     }
}
}
</pre>
</source>
 
 
[[Category:LSL Library]]
[[Category:LSL Examples]]

Latest revision as of 17:21, 24 January 2015

(http://www.gnu.org/copyleft/fdl.html) in the spirit of which this script is GPL'd. Copyright (C) 2008 Xaviar Czervik

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.


This is an example of a very simple minesweeper game.


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

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 i) {
        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.

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);
        }
    }
}