[Add-On]Minesweeper NPC

Page 1 of 3 123 LastLast
Results 1 to 15 of 32
  1. #1
    Account Upgraded | Title Enabled! Emilyx3 is offline
    MemberRank
    Apr 2009 Join Date
    393Posts

    [Add-On]Minesweeper NPC

    I was bored so I made a Minesweeper NPC:
    PHP Code:
    /** Minesweeper NPC
     *  Author: Emilyx3 of UMaple
     */
    var DEBUG false;
    var 
    HIDDEN_ITEM 4031325MINE_ITEM 5021013EXPLODED_ITEM 5120009;
    var 
    Modes = [
        
    //MAX COL = 7
        //MAX ROW = 7 (Without scrolling)
        //Difficulty Name, Rows, Cols, Number of Mines
        
    ["#gEasy                 #k"554],
        [
    "#bIntermediate   #k"668],
        [
    "#rHard                 #k"7715]
    ];

    /* Don't touch these variables below unless you know what you're doing */
    var status;
    var 
    BoardRevealed;
    var 
    VALUE_REVEALED 1VALUE_HIDDEN 0;
    var 
    ModeSelected = -1StartTime = -1NumCols = -1,
    NumRows = -1NumMines = -1LeftToBeRevealed = -1;
    var 
    Neighbors = [
        
    //dX ,dY
        
    [-1, -1], [-10], [-11], [0, -1],
        [
    01],   [1, -1], [10],  [11]
    ];
    var 
    Numbers = [
    39900093990000399000139900023990003,
    39900043990005399000639900073990008
    ];
    /* Don't touch these variables above unless you know what you're doing */

    function start() {
        
    status = -1;
        
    action(100);
    }
    function 
    Header() {
        return 
    "#d============ Minesweeper ============#k\r\n\r\n";
    }
    function 
    ConstructModeSelectionString() {
        var 
    ret "";
        for (var 
    0;Modes.length;i++) {
            
    ret += "#L"+i+"#"+Modes[i][0]+" ("+Modes[i][1]+"x"+Modes[i][2]+") Mines: "+Modes[i][3]+"#l\r\n";
        }
        return 
    ret;
    }
    function 
    InitializeBoard() {
        
    NumCols Modes[ModeSelected][1];
        
    NumRows Modes[ModeSelected][2]
        
    NumMines Modes[ModeSelected][3];
        
    LeftToBeRevealed NumCols NumRows NumMines;
        
    Board = new Array(NumCols);
        for (var 
    0;NumCols;i++) {
            
    Board[i] = new Array(NumRows);
        }
        
    Revealed = new Array(NumCols);
        for (
    0;NumCols;i++) {
            
    Revealed[i] = new Array(NumRows);
            for (var 
    0;NumRows;j++) {
                
    Revealed[i][j] = VALUE_HIDDEN;
            }
        }
        
    InitializeMines();
        
    InitializeMineCounts();
        
    InitializeBlankSpaces();
    }
    function 
    InitializeMines() {
        var 
    AllPosition = new Array(NumRows NumCols);
        for (var 
    0;NumCols;i++) {
            for (var 
    0;NumRows;j++) {
                
    AllPosition[(NumCols) + j] = [i,j];
            }
        }
        
    Shuffle(AllPosition);
        for (
    0;NumMines && AllPosition.length 0;i++) {
            var 
    NewMine AllPosition.pop();
            
    Board[NewMine[0]][NewMine[1]] = MINE_ITEM;
        }
    }
    function 
    InitializeMineCounts() {
        for (var 
    0;NumCols;r++) {
            for (var 
    0;NumRows;c++) {
                if (
    Board[r][c] != MINE_ITEM) {
                    var 
    Count 0;
                    for (var 
    0;Neighbors.length;k++) {
                        var 
    NewR Neighbors[k][0];
                        var 
    NewC Neighbors[k][1]
                        if (
    ValidPosition(NewRNewC) && Board[NewR][NewC] == MINE_ITEM) {
                            
    Count++;
                        }
                    }
                    
    Board[r][c] = Numbers[Count];
                }
            }
        }
    }
    function 
    InitializeBlankSpaces() {
        for (var 
    0;NumCols;i++) {
            for (var 
    0;NumRows;j++) {
                if (
    Board[i][j] == null) {
                    
    Board[i][j] = HIDDEN_ITEM;
                }
            }
        }
    }
    function 
    ConstructBoardString() {
        var 
    ret "Number of Empty Spaces Left: " LeftToBeRevealed "\r\n";
        var 
    num 0;
        for (var 
    0;NumCols;i++) {
            for (var 
    0;NumRows;j++) {
                if (
    Revealed[i][j] == VALUE_REVEALED) {
                    
    ret += "#L"+num+"##v"+Board[i][j]+"##l";
                } else {
                    if (
    DEBUG && Board[i][j] == MINE_ITEM) {
                        
    ret += "#L"+num+"##v"+MINE_ITEM+"##l";
                    } else {
                        
    ret += "#L"+num+"##v"+HIDDEN_ITEM+"##l";
                    }
                }
                
    num++;
            }
            
    ret += "\r\n";
        }
        return 
    ret;
    }
    function 
    ConstructEndBoardString() {
        var 
    ret "";
        var 
    num 0;
        for (var 
    0;NumCols;i++) {
            for (var 
    0;NumRows;j++) {
                if (
    Revealed[i][j] == VALUE_REVEALED) {
                    if (
    Board[i][j] == MINE_ITEM) {
                        
    ret += "#v"+EXPLODED_ITEM+"#";
                    } else {
                        
    ret += "#v"+Board[i][j]+"#";
                    }
                } else {
                    if (
    Board[i][j] == MINE_ITEM) {
                        
    ret += "#v"+MINE_ITEM+"#";
                    } else {
                        
    ret += "#v"+HIDDEN_ITEM+"#";
                    }
                }
                
    num++;
            }
            
    ret += "\r\n";
        }
        return 
    ret;
    }
    function 
    Shuffle(arr) {
        var 
    arr.length;
        if (
    == 0)
            return;
        while (--
    i) {
            var 
    Math.floorMath.random() * ( ) );
            var 
    tempi arr[i];
            var 
    tempj arr[j];
            
    arr[i] = tempj;
            
    arr[j] = tempi;
        }
    }
    function 
    ValidPosition(rc) {
        return 
    >= && NumRows && >= && NumCols;
    }
    function 
    GetPositionFromSelection(sel) {
        return [(
    sel NumCols) | 0, (sel NumCols) | 0];
    }
    function 
    IsGameOver() {
        return 
    LeftToBeRevealed == 0;
    }
    function 
    GetGameTime(End) {
        var 
    Diff End StartTime;
        var 
    MilliSec = (Diff 1000) | 0;
        
    Diff /= 1000;
        var 
    Min = (Diff 60) | 0;
        var 
    Sec = (Diff 60) | 0;
        return ((
    Min 10) ? "0" Min Min) + ":" + ((Sec 10) ? "0" Sec Sec)
            + 
    "." + ((MilliSec 100) ? "0" + ((MilliSec 10) ? "0" MilliSec MilliSec) : MilliSec);

    }
    function 
    action(modetypeselection) {
        if (
    mode == -|| mode == 0)
            
    cm.dispose();
        else {
            if (
    status != 2)
                
    status++;

            if (
    status == 0) {
                
    cm.sendSimple(Header()+"Please select a mode:\r\n"+ConstructModeSelectionString())
            } else if (
    status == 1) {
                if (
    selection || selection Modes.length) { //Packet Edits
                    
    cm.dispose();
                    return;
                }
                
    ModeSelected selection;
                
    InitializeBoard();
                
    cm.sendSimple(Header() + ConstructBoardString());
            } else if (
    status == 2) {
                if (
    StartTime == -1) {
                    
    StartTime = (new Date()).getTime();
                }
                var 
    SendStr Header();
                var 
    Move GetPositionFromSelection(selection);
                if (!
    ValidPosition(Move[0], Move[1])) {
                    
    cm.sendOk("PE Detected ...");
                    return;
                }
                if (
    Revealed[Move[0]][Move[1]] == VALUE_REVEALED) { //Already went there
                    
    SendStr += "You have already moved in that space ...\r\n\r\n" ConstructBoardString();
                    
    cm.sendSimple(SendStr);
                    return;
                }
                
    Revealed[Move[0]][Move[1]] = VALUE_REVEALED;
                
    LeftToBeRevealed--;
                
    SendStr += ConstructBoardString();
                if (
    Board[Move[0]][Move[1]] == MINE_ITEM) {
                    
    //Lose
                    
    cm.sendOk(Header() + ConstructEndBoardString() + "\r\nYou lost! Game Time: " GetGameTime((new Date()).getTime()));
                    
    cm.dispose();
                } else {
                    if (
    IsGameOver()) {
                        
    cm.sendOk(Header() + ConstructEndBoardString() + "\r\nYou won! Game Time: " GetGameTime((new Date()).getTime()));
                        
    cm.dispose();
                    } else {
                        
    cm.sendSimple(SendStr);
                    }
                }
            }
        }

    For Mine densities closer to the Window's Minesweeper, use this Modes array (thanks Moogra):
    Code:
    var Modes = [
        ["#gEasy                 #k", 5, 5, 3],     //12% Density
        ["#bIntermediate   #k", 6, 6, 6],           //16% Density
        ["#rHard                 #k", 7, 7, 10]     //20% Density
    ];


    Enjoy ~ (May be buggy)
    Last edited by Emilyx3; 28-04-11 at 04:00 PM.


  2. #2
    bleh.... Shawn is offline
    MemberRank
    Oct 2008 Join Date
    Mississauga, CaLocation
    5,904Posts

    re: [Add-On]Minesweeper NPC

    Tested and working? Mind posting an SS of it? I'd love to see what this looks like without having to set up a test server :) It looks really interesting.

  3. #3
    Gamma Sparrow is offline
    MemberRank
    Mar 2009 Join Date
    SydneyLocation
    2,960Posts

    re: [Add-On]Minesweeper NPC

    Looks great, I'll test now and put some screenshots.
    Attached Thumbnails Attached Thumbnails maple0036.jpg   maple0037.jpg   maple0038.jpg   maple0039.jpg   maple0040.jpg  

    Last edited by Sparrow; 27-04-11 at 07:34 AM.

  4. #4
    Account Upgraded | Title Enabled! Sharky is offline
    MemberRank
    Dec 2010 Join Date
    Ur Mom's Pants.Location
    927Posts

    re: [Add-On]Minesweeper NPC

    This is just.... wow. Takes NPC Scripting to a new level. =) I'm impressed.

  5. #5
    Account Upgraded | Title Enabled! Emilyx3 is offline
    MemberRank
    Apr 2009 Join Date
    393Posts

    re: [Add-On]Minesweeper NPC

    Added Pics.

  6. #6
    bleh.... Shawn is offline
    MemberRank
    Oct 2008 Join Date
    Mississauga, CaLocation
    5,904Posts

    re: [Add-On]Minesweeper NPC

    Great job and thank you Sparrow and Emilyx3 for uploading pictures! Looks amazing!

  7. #7
    Member Lukey (: is offline
    MemberRank
    Mar 2010 Join Date
    77Posts

    re: [Add-On]Minesweeper NPC

    amazing. good job!

  8. #8
    Alpha Member XxОsirisxX is offline
    MemberRank
    Aug 2009 Join Date
    2,727Posts

    re: [Add-On]Minesweeper NPC

    I have never liked a NPC release like this one. I'm totally impressed by this release. Really creative item's images and everything. It looks WONDERFUL! Congratulations!

  9. #9
    Account Upgraded | Title Enabled! Choobed is offline
    MemberRank
    Jul 2008 Join Date
    AustraliaLocation
    386Posts

    re: [Add-On]Minesweeper NPC

    This stuff is just... (speechless)

    I'd have to agree with everyone else. This NPC is probably one of the best that I have ever seen in my entire life.

  10. #10
    :) iJFAC is offline
    MemberRank
    Sep 2007 Join Date
    SomewhereLocation
    519Posts

    re: [Add-On]Minesweeper NPC

    Hahaha.. This is outstanding XD.. Awesome release, and that's what i call a pretty well done job :P

  11. #11
    Account Upgraded | Title Enabled! Soul is offline
    MemberRank
    Aug 2009 Join Date
    645Posts

    re: [Add-On]Minesweeper NPC

    Wow this is something Ive never seen before nice job!

  12. #12
    Apprentice xPerpetual is offline
    MemberRank
    Mar 2011 Join Date
    17Posts

    re: [Add-On]Minesweeper NPC

    Wow, just wow.
    this is incredibly creative, and well coded, I'm impressed.

  13. #13
    Account Upgraded | Title Enabled! Diglett is offline
    MemberRank
    Sep 2010 Join Date
    Diglett WorldLocation
    289Posts

    re: [Add-On]Minesweeper NPC

    This looks amazing. Goodjob.

  14. #14
    Computer Science Student Vintage is offline
    MemberRank
    Mar 2008 Join Date
    286Posts

    re: [Add-On]Minesweeper NPC

    An NPC script that impresses me? None till this one. I was thinking about making a Blackjack NPC ;)

  15. #15
    bleh.... Shawn is offline
    MemberRank
    Oct 2008 Join Date
    Mississauga, CaLocation
    5,904Posts

    re: [Add-On]Minesweeper NPC

    Quote Originally Posted by Vintage View Post
    An NPC script that impresses me? None till this one. I was thinking about making a Blackjack NPC ;)
    Already been done... a few times. Just sayin



Page 1 of 3 123 LastLast

Advertisement