Minesweeper
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
(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);
}
}
}