Question

Lights Out game solver.

Asked by: burningmace

The following page contains a JavaScript lights out game. I am trying to make a solver for my Visual Basic lights out game and am having trouble doing it. Could somebody give me a VB translation of this please??? I have also included my VB program code at the bottom.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis">
<TITLE>
A Lights Out Puzzle with Solver
</TITLE>
</HEAD>

<BODY TEXT="#000000" BGCOLOR="#C0E0FF" ALINK="#000000" VLINK="#000000">

<H3>A Lights Out Puzzle with Solver (JavaScript)</H3>

<SCRIPT LANGUAGE="JavaScript">
<!--
// --- constants ---
var imgs = new Array();     // string[], URLs of tile images
var nums = new Array();     // string[], URLs of digit images
var maxcolcount = 7;        // integer, maximum number of columns
var maxrowcount = 7;        // integer, maximum number of rows

var outrangeimg = "outrange.gif";   // string, URL of empty ans cell
var emptyimg    = "empty.gif";      // string, URL of empty cell
// var nosolimg = "nosol.gif";      // string, URL of no solution image
imgs[0] = "blue.gif";
imgs[1] = "red.gif";
imgs[2] = "yellow.gif";
imgs[3] = "green.gif";
imgs[4] = "purple.gif";

// --- global variables ---
var colcount;   // integer, number of columns
var rowcount;   // integer, number of rows
var imgcount;   // integer, number of states of a tile
var cells;      // integer[row][col], current states of tiles
var steps;      // integer, current steps of operation
var playing;    // boolean, if playing
var autogen;    // boolean, if playing with an auto-generated problem

// --- initialization ---
//function onLoad(){}
init();
function init() {
    for (var val = 0; val < imgs.length; val++)
        nums[val] = "number" + val + ".gif";
    var col;
    var row;
    cells = new Array();
    for (col = 0; col < maxcolcount; col++) {
        cells[col] = new Array();
        for (row = 0; row < maxrowcount; row++)
            cells[col][row] = 0;
    }
//  playing = false;
}

// --- event handlers ---
function newSettings(){
    var dimension = document.toolbar.dimension.options[
        document.toolbar.dimension.selectedIndex].value;
    colcount = eval(dimension.substring(0,1));
    rowcount = eval(dimension.substring(2,3));
    imgcount = eval(document.toolbar.colors.options[
        document.toolbar.colors.selectedIndex].value);
    for (var col = 0; col < maxcolcount; col++)
    for (var row = 0; row < maxrowcount; row++) {
        setcellimage(col,row,emptyimg);
        setanscellimage(col,row,outrangeimg);
    }
    newGame();
}
function newGame(){
    for (var col = 0; col < colcount; col++)
    for (var row = 0; row < rowcount; row++) {
        setcell(col,row, Math.floor(Math.random() * imgcount));
        setanscellimage(col,row,outrangeimg);
    }
    playing = true;
    autogen = true;
    steps = 0;
}
function edit() {
    if (!playing) {
        for (var col = 0; col < colcount; col++)
        for (var row = 0; row < rowcount; row++)
            setcell(col,row,0);
    }
    playing = false;
    autogen = false;
}
function play() {
    playing = true;
}
function ansoperate(col,row) {
    operate(col,row);
    solve();
}
function operate(col,row) {
    if (col >= colcount || row >= rowcount) return;
    flip(col,row);
    if (playing) {
        if (col > 0)            flip(col-1, row);
        if (row > 0)            flip(col, row-1);
        if (col < colcount - 1) flip(col+1, row);
        if (row < rowcount - 1) flip(col, row+1);
        steps++;
        if (autogen && isCleared()) {
            alert("Cleared in " + steps + " steps!");
            autogen = false;
        }
    }
}
// --- operation methods ---
function setcell(col,row,val) {
    cells[col][row] = val;
    setcellimage(col,row,imgs[val]);
}
function setcellimage(col,row,imgsrc) {
    eval("document." + cellname(col,row) + ".src = '" + imgsrc + "'");
}
function setanscellimage(col,row,imgsrc) {
    eval("document.ans" + cellname(col,row) + ".src = '" + imgsrc + "'");
}
function cellname(col,row) {
    return "cell" + col + "_" + row;
}
function flip(col,row) {
    setcell(col,row,(cells[col][row] + 1) % imgcount);
}

// --- status methods ---
function isCleared(){
    var sample = cells[0][0];
    for (var col = 0; col < colcount; col++)
    for (var row = 0; row < rowcount; row++)
        if (cells[col][row] != sample) return false;
    return true;
}

// --- finite field algebra solver
function modulate(x) {
    // returns z such that 0 <= z < imgcount and x == z (mod imgcount)
    if (x >= 0) return x % imgcount;
    x = (-x) % imgcount;
    if (x == 0) return 0;
    return imgcount - x;
}
function gcd(x, y) { // call when: x >= 0 and y >= 0
    if (y == 0) return x;
    if (x == y) return x;
    if (x > y)  x = x % y; // x < y
    while (x > 0) {
        y = y % x; // y < x
        if (y == 0) return x;
        x = x % y; // x < y
    }
    return y;
}
function invert(value) { // call when: 0 <= value < imgcount
    // returns z such that value * z == 1 (mod imgcount), or 0 if no such z
    if (value <= 1) return value;
    var seed = gcd(value,imgcount);
    if (seed != 1) return 0;
    var a = 1, b = 0, x = value;    // invar: a * value + b * imgcount == x
    var c = 0, d = 1, y = imgcount; // invar: c * value + d * imgcount == y
    while (x > 1) {
        var tmp = Math.floor(y / x);
        y -= x * tmp;
        c -= a * tmp;
        d -= b * tmp;
        tmp = a;  a = c;  c = tmp;
        tmp = b;  b = d;  d = tmp;
        tmp = x;  x = y;  y = tmp;
    }
    return a;
}

// --- finite field matrix solver

var mat;    // integer[i][j]
var cols;   // integer[]
var m;      // count of rows of the matrix
var n;      // count of columns of the matrix
var np;     // count of columns of the enlarged matrix
var r;      // minimum rank of the matrix
var maxr;   // maximum rank of the matrix

function a(i,j)   { return mat[i][cols[j]]; }
function setmat(i,j,val) { mat[i][cols[j]] = modulate(val); }

function solve() {
    var col;
    var row;
    for (var goal = 0; goal < imgcount; goal++) {
        if (solveProblem(goal)) { // found an integer solution
            var anscols = new Array();
            var j;
            for (j = 0; j < n; j++)  anscols[cols[j]] = j;
            for (col = 0; col < colcount; col++)
            for (row = 0; row < rowcount; row++) {
                var value;
                j = anscols[row * colcount + col];
                if (j < r) value = a(j,n); else value = 0;
                setanscellimage(col,row,nums[value]);
            }
            return;
        }
    }
    // (aborted or) no solution
    for (var col = 0; col < colcount; col++)
    for (var row = 0; row < rowcount; row++)
        setanscellimage(col,row,outrangeimg);
    alert("No solutions!"); // setanscellimage(0,0,nosolimg);
}

//  // general solution:
//  if (j < r) {
//      for (var jj = r; jj < n; jj++) + any[jj] * modulate(-a(j,jj));
//  }
//  else {
//      + any[j];
//  }

function checkNormal() {
    var size = colcount * rowcount;
    m = size;
    n = size;
    np = n + size;
    initMatrix();
    for (var col = 0; col < colcount; col++)
    for (var row = 0; row < rowcount; row++) {
        var i = row * colcount + col;
        var line = mat[i];
        for (var j = n; j < np; j++)  line[j] = 0;
        line[n + i] = 1;
    }
    if (sweep())
         alert("Always solvable");
    else alert("Not always solvable ( "
        + Math.pow(imgcount,n-r) + " identity patterns )");
}
function initMatrix() {
    maxr = Math.min(m,n);
    mat = new Array();
    for (var col = 0; col < colcount; col++)
    for (var row = 0; row < rowcount; row++) {
        var i = row * colcount + col;
        var line = new Array();
        mat[i] = line;
        for (var j = 0; j < n; j++) line[j] = 0;
        line[i] = 1;
        if (col > 0)            line[i - 1]        = 1;
        if (row > 0)            line[i - colcount] = 1;
        if (col < colcount - 1) line[i + 1]        = 1;
        if (row < rowcount - 1) line[i + colcount] = 1;
    }
    cols = new Array();
    for (var j = 0; j < np; j++) cols[j] = j;
}
function solveProblem(goal) {
    var size = colcount * rowcount;
    m = size;
    n = size;
    np = n + 1;
    initMatrix();
    for (var col = 0; col < colcount; col++)
    for (var row = 0; row < rowcount; row++)
        mat[row * colcount + col][n] = modulate(goal - cells[col][row]);
    return sweep();
}
function sweep() {
    for (r = 0; r < maxr; r++) {
        if (!sweepStep()) return false; // failed in founding a solution
        if (r == maxr) break;
    }
    return true; // successfully found a solution
}
function sweepStep() {
    var i;
    var j;
    var finished = true;
    for (j = r; j < n; j++) {
        for (i = r; i < m; i++) {
            var aij = a(i,j);
            if (aij != 0)  finished = false;
            var inv = invert(aij);
            if (inv != 0) {
                for (var jj = r; jj < np; jj++)
                    setmat(i,jj, a(i,jj) * inv);
                doBasicSweep(i,j);
                return true;
            }
        }
    }
    if (finished) { // we have: 0x = b (every matrix element is 0)
        maxr = r;   // rank(A) == maxr
        for (j = n; j < np; j++)
            for (i = r; i < m; i++)
                if (a(i,j) != 0)  return false; // no solution since b != 0
        return true;    // 0x = 0 has solutions including x = 0
    }
    alert("Internal error - contact the author to obtain a full solver");
    return false;   // failed in founding a solution
}

function swap(array,x,y) {
    var tmp  = array[x];
    array[x] = array[y];
    array[y] = tmp;
}
function doBasicSweep(pivoti, pivotj) {
    if (r != pivoti) swap(mat,r,pivoti);
    if (r != pivotj) swap(cols,r,pivotj);
    for (var i = 0; i < m; i++) {
        if (i != r) {
            var air = a(i,r);
            if (air != 0)
                for (var j = r; j < np; j++)
                    setmat(i,j, a(i,j) - a(r,j) * air);
        }
    }
}

// --- document writer ---
function createField(imgsrc, prefix) {
    var row;
    var col;
    for (row = 0; row < maxrowcount; row++) {
        for (col = 0; col < maxcolcount; col++) {
            document.write("<IMG SRC='" + imgsrc);
            document.write("' NAME='" + prefix + cellname(col,row));
            document.write("' onmousedown='javascript:" + prefix);
            document.write("operate(" + col + "," + row + ")' ");
            document.write("ondblclick='javascript:" + prefix);
            document.write("operate(" + col + "," + row + ")'>");
        }
        document.write("<BR>");
    }
}

// --- entry point ---
//onLoad();
//-->
</SCRIPT>

<FORM NAME="toolbar">
<TABLE>
<TR><TD>
<INPUT TYPE="button" VALUE="NEW GAME" onClick="javascript:newGame()">
<INPUT TYPE="button" VALUE="SOLVE"    onClick="javascript:solve()">
<INPUT TYPE="button" VALUE="EDIT"     onClick="javascript:edit()">
<INPUT TYPE="button" VALUE="PLAY"     onClick="javascript:play()">
<TR HEIGHT=40pt><TD>
<SELECT NAME="colors" ONCHANGE="javascript:newSettings()">
<OPTION VALUE="2" SELECTED>2 colors
<OPTION VALUE="3"         >3 colors
<OPTION VALUE="4"         >4 colors
<OPTION VALUE="5"         >5 colors
</SELECT>
<SELECT NAME="dimension" ONCHANGE="javascript:newSettings()">
<OPTION VALUE="3x3"         >3 x 3
<OPTION VALUE="4x3"         >4 x 3
<OPTION VALUE="4x4"         >4 x 4
<OPTION VALUE="5x4"         >5 x 4
<OPTION VALUE="5x5"         >5 x 5
<OPTION VALUE="6x5" SELECTED>6 x 5
<OPTION VALUE="6x6"         >6 x 6
<OPTION VALUE="7x7"         >7 x 7
</SELECT>
<INPUT TYPE="button" VALUE="<-- CHECK" onClick="javascript:checkNormal()">
</TABLE>
</FORM>

<SCRIPT LANGUAGE="JavaScript">
<!--
document.write("<TABLE><TR><TD>");
createField(emptyimg, "");
document.write("<TD WIDTH=10%><TD>");
createField(outrangeimg, "ans");
document.write("</TABLE>");
newSettings();
//-->
</SCRIPT>

</BODY></HTML>


Here is my VB game:


Dim stat(35) As Boolean, clicks As Integer 'stat is for the save function and clicks is no. of clicks in game.

'Consts and APIs
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const CREATE_NEW = 1
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Sub Form_Load()
Dim col As Long
clicks = 0
dlgOpen.InitDir = App.Path
dlgSave.InitDir = App.Path
For i = 0 To 35
Call Randomize
If Int(Rnd * 2) = 1 Then col = vbRed Else col = vbBlue 'Randomly generate game.
lblBox(i).BackColor = col
Next i
End Sub

Private Sub lblBox_Click(Index As Integer)
'This sub inverts the 5 boxes.

clicks = clicks + 1
If lblBox(Index).BackColor = vbRed Then lblBox(Index).BackColor = vbBlue Else lblBox(Index).BackColor = vbRed
If Index = 0 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index > 0 And Index < 5 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
GoTo CheckWin
End If
If Index = 5 Then
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index > 30 And Index < 35 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
GoTo CheckWin
End If
If Index = 30 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 35 Then
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 6 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 12 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 18 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 24 Then
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 11 Then
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 17 Then
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 23 Then
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If Index = 29 Then
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed
GoTo CheckWin
End If
If lblBox(Index + 1).BackColor = vbRed Then lblBox(Index + 1).BackColor = vbBlue Else lblBox(Index + 1).BackColor = vbRed
If lblBox(Index - 1).BackColor = vbRed Then lblBox(Index - 1).BackColor = vbBlue Else lblBox(Index - 1).BackColor = vbRed
If lblBox(Index - 6).BackColor = vbRed Then lblBox(Index - 6).BackColor = vbBlue Else lblBox(Index - 6).BackColor = vbRed
If lblBox(Index + 6).BackColor = vbRed Then lblBox(Index + 6).BackColor = vbBlue Else lblBox(Index + 6).BackColor = vbRed

CheckWin:
Dim nb As Integer
For i = 0 To 35
If lblBox(i).BackColor = vbBlue Then nb = nb + 1
Next i
If nb = 36 Then
Call MsgBox("You win!!! It took you " & clicks & " moves.", vbSystemModal, "WIN")
Call Form_Load
End If
End Sub

Private Sub mnuAbout_Click()
Call MsgBox("Lights Out V1.0 by Graham Sutherland", vbInformation + vbSystemModal, "About")
End Sub

Private Sub mnuExit_Click()
Dim ret As VbMsgBoxResult
ret = MsgBox("Are you sure you want to quit?", vbCritical + vbYesNo, "Quit?")
If ret = vbYes Then End
End Sub

Private Sub mnuNew_Click()
Call Form_Load
End Sub

Private Sub mnuOpen_Click()
dlgOpen.ShowOpen
If dlgOpen.FileName = "" Then
Call MsgBox("Error: You must choose a file name!", vbCritical + vbSystemModal, "ERROR")
Exit Sub
Open dlgOpen.FileName For Random As #1
End If
Get #1, 100, clicks
For i = 1 To 36
Get #1, i, stat(i - 1)
Next i
Close #1
For i = 0 To 35
If stat(i) = True Then lblBox(i).BackColor = vbRed Else lblBox(i).BackColor = vbBlue
Next i
End Sub

Private Sub mnuRules_Click()
Call MsgBox("Get all squares to become blue. If you click a box, it and the four surrounding boxes' colours are inverted.", vbInformation + vbSystemModal, "Rules")
End Sub

Private Sub mnuSave_Click()
For i = 0 To 35
If lblBox(i).BackColor = vbRed Then stat(i) = True Else stat(i) = False
Next i
dlgSave.ShowSave
If dlgSave.FileName = "" Then
Call MsgBox("Error: You must choose a file name!", vbCritical + vbSystemModal, "ERROR")
Exit Sub
End If
r = CreateFile(dlgSave.FileName, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CREATE_NEW, 0, 0)
CloseHandle r
Open dlgSave.FileName For Random As #1
Put #1, 100, clicks
For i = 1 To 36
Put #1, i, stat(i - 1)
Next i
Close #1
End Sub

Private Sub mnuSolve_Click()
Call Load(Form2)
Form2.Show
End Sub




Form2 will contain the solver, but has no code so far.
If anybody can translate the Java to VB or just supply me with some code to solve 6x6 Lights Out grids then I would be very grateful.
Thanks in advance!

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2004-01-17 at 01:23:07ID20853743
Tags

solver

,

out

,

lights

Topic

Programming Languages

Participating Experts
2
Points
150
Comments
72

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. game ranking algorithm
    I have developed a multi-player game system. Now I need to add ranking support to the system. Basically it's a two player game and the result can be win/lose/draw. I want to rank the players according to their results like level 1, level 2, level 3, ... etc. But there are a n...
  2. Power Rankings
    Here is a tough one for all of you. STEP 1. I want to take the winning percentage of 10 teams and rank them accordingly 1 - 10 (duplicate ranks are wanted). STEP 2. I want take each teams total points and rank them accordingly 1-10, again, duplicates are wanted. STEP 3. ...
  3. Automating solver
    I have some real problems with solver when I run it through a procedure. I have created a loop to go through some large matrix and then perform some optimization with solver. The problem is that solver gets slower and slower (starts out slow as well) for every loop. Don't get...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: crazycomputersPosted on 2004-01-17 at 12:33:29ID: 10137455

This is a far more difficult task than you think.  The game tree is unlimited in size, so your program will need to store each position it comes across to make sure it doesn't run in circles.  You'll run out of memory long before you get to a solution.

It's almost like asking a computer to find every possible position in chess, or at least all the positions where there is checkmate.

This process isn't quite as complex, but  think about the math.  A 7x7 board.  That's 49 squares.  2 (on/off) to the power of 49 is 562,949,953,421,312.  That's how many possible positions there are.  Now, you probably won't have to search that many, so we'll divide it by 100 to be realistic.  5,629,499,534,213.  Not much better.  Multiply that by 49 to get the storage space to save all the positions.  That's 256,901 gigabytes of positions.

This is very similar to an "I need this guy's ZIP-file password" question.  Not that it's illegal, just that it's going to take a lot more processor power and memory than you've got to solve one puzzle.

 

by: burningmacePosted on 2004-01-18 at 00:48:44ID: 10139729

crazycomputers - What you have just described is the bruteforce method. The amount of memory is not a problem, as you could just generate a possible solution from an integer which increases every attempt, then check the solution, then write over all the variables in the next calculation. I tried this but it would take aprox 20 days to get a result. I am also using a 6x6 grid.

This is what I mean:

Dim binSol(35) as Boolean, tmpMatrix(35) as Boolean
For i = 1 to 2^36  'Number of positions
DoEvents  'Obviously :P
EmptyArray(binSol)  'Set all values in the Binary Solution to 0
TransferPuzzle(tmpMatrix)  'Copy the puzzle from the game to the temporary matrix
binSol = CalculateSolution(i)  'Create an array of 36 True/False from the 'i' variable (Binary)
ApplySolution(binSol, tmpMatrix)  'Virtually play the solution on the temporary matrix
If Complete(tmpMatrix) then Goto GotSolution  'Check if the solution is correct
Next i  'Next solution

GotSolution:
  'Code for adding labels to the correct boxes (lights) in the game


You may think 'why not use that code?', but you forget how long it takes. About 20 days on average, 41 days max, ERK!

I need something which can mathematically calculate the correct solution. The above javascript does it in less than a second (I'm on broadband :P). I get an exact mathematical solution to the puzzle in a grid. As for the grid size and colour variables in the Java, they can be swapped for constant values from my 6x6 grid with 2 colours.

Thanks for your help anyway,
And thanks in advance to those of you who answer!!!

 

by: burningmacePosted on 2004-01-18 at 00:51:22ID: 10139733

Also, not to steal anybody's code, the JavaScript was from http://www.ueda.info.waseda.ac.jp/~n-kato/lightsout/

You can see the code in action there!

 

by: CeledorPosted on 2004-01-18 at 09:00:22ID: 10140838

Use Alpha-Beta pruning, which is a 'smart' version of the brute force method.

Start sequentially from top to bottom.  If at any point, any of your past 'switches' has not caused their respective lights to turn on, then you skip that branch of the game tree and continue on to the next.  

Speeds it up a lot.

 

by: crazycomputersPosted on 2004-01-18 at 12:00:01ID: 10141698

True...

What you might consider is some sort of smart algorithm that will look five nodes down and make a decision on which position to do the next search from based on how many lights are on.  Careful, this could run into an infitite loop.

Just to refresh my memory, what are the rules of lights out?  I'll try to code something in C (if that's acceptable - it's much faster than JavaScript) if you can tell me how to play.  ;)

 

by: crazycomputersPosted on 2004-01-18 at 19:59:13ID: 10143692

I downloaded a Lights Out game for Palm OS, and refreshed my memory on the rules.  Then I wrote this C program that solves any puzzle in less than 20 seconds!

After playing a bit, I realized that the move tree is actually very limited.  For example, moving 0,0 and 0,0 returns you to the same position.  So there is a fixed depth: rows * height.

I hope you can translate it into JavaScript if you need it in that language; I don't know very much JavaScript.  If the C version is acceptable, well, that's great!  =)

I have enclosed the compiled EXE and the C source.  This is UUEncoded.  WinZip will open such files.  Just copy 'n paste it into a text file, save it as "lightsout.uue" and open it in WinZip.

If you have any trouble getting it to work, just let me know.


_=_
_=_ Part 001 of 001 of file lightsout.zip
_=_

begin 666 lightsout.zip
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
4!08``````@`"`'P```")0P``````
`
end

 

by: crazycomputersPosted on 2004-01-18 at 20:06:32ID: 10143728

I meant it solves the puzzles in less than 20 seconds, not it took me 20 seconds to write it.  ;)

 

by: burningmacePosted on 2004-01-21 at 09:00:38ID: 10166319

Well, that's great stuff. I do understand a little C++ but not much. You couldn't translate it in terms of Visual Basic could you? The code seems to be simple though.

I have posted my lights out game here:
http://www.clanpower.com/accounts/burningmacelans/lightsout.zip

It was written in VB6. It's the latest version of what I'm doing.

A way I found could quickly solve simple puzzles was the following:

Generate a 7 bit binary number from a for.. next loop integer. Use it to click the top row buttons when the corresponding number is 1 (e.g. 0100101 would click the 2nd, 5th and 7th buttons on the top line). After that, the program would simulate clicking the squares below the lights left on on the top line. It would then do the same for the lights on the second line, and keep going untill the bottom. In some cases, there would be no lights left on, therefore giving a solution!

Anyway, thanks for your help so far!

 

by: burningmacePosted on 2004-01-21 at 09:02:50ID: 10166340

Ooops. I made a mistake. I am using a 6x6 grid, not a 7x7, therefore it is a 6 bit number that is generated!!! The principal stays the same though.

 

by: crazycomputersPosted on 2004-01-21 at 09:28:08ID: 10166573

Yes, that's how I play lights out myself.  ;)  I found that the pattern of lights left on in the bottom row indicates what pattern to enter in the top row before you start going down the rows.  The patterns differ with grid sizes and there's no easy way to figure out the combination for the top based on the lights at the bottom, but they are always the same.  I.E. on a 5x5 grid, say I have this game:

1 0 1 0 1
0 0 0 1 1
1 1 1 1 1
0 1 0 0 1
0 1 1 1 0

After clicking below lights, I get this pattern:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 0 1 1

From what I've discovered in the past, I know that I must click the middle light in the top row.  After doing that, the original puzzle becomes:

1 1 0 1 1
0 0 1 1 1
1 1 1 1 1
0 1 0 0 1
0 1 1 1 0

After following those down, the puzzle is solved.  One more puzzle:

1 1 1 1 1
1 0 1 0 0
0 0 1 1 0
0 0 0 0 0
0 1 1 0 0

After following the lights down:

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 0 0 0 1

Past experience says I click the first, third, and fourth lights on the top row:

0 1 1 1 0
0 0 0 1 0
0 0 1 1 0
0 0 0 0 0
0 1 1 0 0

Now I follow them down, and it's solved!

As for the C program (yes C, not C++) I will try to convert it to VB, but note that it will not run anywhere near as fast as the C program.

 

by: burningmacePosted on 2004-01-21 at 09:40:02ID: 10166688

Aaah.. But are you using looping? My game does not.

 

by: crazycomputersPosted on 2004-01-21 at 09:42:32ID: 10166718

Looping?  You mean in the C program or when I play it myself?

 

by: burningmacePosted on 2004-01-21 at 09:43:54ID: 10166732

Both. By looping I mean that when you click on the bottom, it changes ones on the top.

My program does NOT do this.

 

by: crazycomputersPosted on 2004-01-21 at 09:46:59ID: 10166767

Oh.  I thought you meant for ... next (or for {}) loops.  No game looping.

 

by: burningmacePosted on 2004-01-21 at 09:48:28ID: 10166782

Hehe. Are you currently working on the VB version???
I would be happy to put your name in the solver's 'About' box.

 

by: crazycomputersPosted on 2004-01-21 at 09:53:48ID: 10166853

Not at this moment; I'm in Linux right now.  I'll begin work on it next time I'm in Windows.

 

by: burningmacePosted on 2004-01-21 at 09:54:28ID: 10166861

OK, you're a lifesaver!

 

by: burningmacePosted on 2004-01-21 at 09:54:52ID: 10166868

OK, you're a lifesaver!

/me increases points by 50

 

by: crazycomputersPosted on 2004-01-21 at 11:33:19ID: 10167868

Rebooting to Windows now.  It might not get done 'till tomorrow sometime.

 

by: crazycomputersPosted on 2004-01-21 at 13:55:56ID: 10169116

Alright, here's the code.  A few notes on usage:

- The arrays are 0-based.  This was the easiest way to go porting it from C.

- You must set the "Rows" and "Cols" global variables prior to calling SearchTree.

Here is a quick demo of how to use the module:

'  -------
Private Sub Form_Load()

Dim mPos As Position

Rows = 5
Cols = 5

With mPos
    .Board(0, 0) = True
    .Board(2, 0) = True

    .Board(0, 1) = True
    .Board(2, 1) = True
    .Board(3, 1) = True

    .Board(0, 2) = True
    .Board(1, 2) = True
    .Board(2, 2) = True
    .Board(3, 2) = True

    .Board(1, 3) = True
    .Board(3, 3) = True

    .Board(0, 4) = True
    .Board(1, 4) = True
    .Board(3, 4) = True
    .Board(4, 4) = True
End With

SearchTree mPos, 0, 0

End Sub
'  -------

Here's the module (LightsOut.bas):

'  -------
Option Explicit

Public Type Position
    Board(20, 20) As Boolean
End Type
Public Type Move
    X As Integer
    Y As Integer
End Type

Public Moves(1000) As Move
Public MoveCount As Integer
Public FoundWin As Boolean

Public StopAt As Integer    ' Set to minimum acceptable solution length
Public Rows As Integer, Cols As Integer ' Set to row/column count
Public Sub MakeMove(ByRef mPos As Position, X As Integer, Y As Integer, Optional Internal As Boolean = False)

If ((X < 0) Or (X >= Cols) Or _
    (Y < 0) Or (Y >= Cols)) Then Exit Sub

mPos.Board(X, Y) = Not mPos.Board(X, Y)

If Internal Then Exit Sub
MakeMove mPos, X + 1, Y, True
MakeMove mPos, X - 1, Y, True
MakeMove mPos, X, Y + 1, True
MakeMove mPos, X, Y - 1, True

End Sub
Public Function Winner(mPos As Position) As Boolean

Dim X As Integer, Y As Integer
For X = 0 To Cols - 1
    For Y = 0 To Rows - 1
        If mPos.Board(X, Y) Then
            Winner = False
            Exit Function
        End If
    Next Y
Next X

Winner = True

End Function
Public Sub SearchTree(ByRef mPos As Position, X As Integer, Y As Integer, Optional Internal As Boolean = False)

Dim NX As Integer, NY As Integer

If Not Internal Then
    MoveCount = 0
    FoundWin = False
End If

MakeMove mPos, X, Y ' Make the move

With Moves(MoveCount)   ' Record the move
    .X = X
    .Y = Y
End With
MoveCount = MoveCount + 1

If Winner(mPos) Then
    If (StopAt And (MoveCount <= StopAt)) Or (Not StopAt) Then
        FoundWin = True
        Exit Sub
    End If
End If

NX = X + 1
NY = Y
If (NX = Cols) Then
    NX = 0
    NY = NY + 1
    If (NY = Rows) Then
        MoveCount = MoveCount - 1   ' Undo move
        MakeMove mPos, X, Y
        Exit Sub
    End If
End If

SearchTree mPos, NX, NY, True
If FoundWin Then Exit Sub

MoveCount = MoveCount - 1   ' Undo move
MakeMove mPos, X, Y

SearchTree mPos, NX, NY, True

End Sub
'  -------

Note that this runs slow as heck compared to the C version.  As for crediting me, something like "Solving engine by Chris Howie (crazycomputers@yahoo.com)." will suffice.

Hope this works!

Oh, and to access the solution:

'  -------
For M = 1 to MoveCount
    With Moves(M - 1)
        Debug.Print .X, .Y
    End With
Next M
'  -------

 

by: crazycomputersPosted on 2004-01-21 at 13:59:06ID: 10169146

Also, feel free to add a DoEvents call to the top of the SearchTree subroutine to keep your app from hanging while it's solving.  Then you can even add a command button to stop the process:

'  -------
Private Sub cmdStop_Click()

FoundWin = True   ' This makes SearchTree return immediately

End Sub
'  -------

 

by: burningmacePosted on 2004-01-24 at 00:44:23ID: 10190228

I have a question with this declaration:

Public Sub SearchTree(ByRef mPos As Position, X As Integer, Y As Integer, Optional Internal As Boolean = False)

I understand that Internal is for when it is called internally from the sub, but what is X and Y for???

Thanks,
Burningmace

 

by: burningmacePosted on 2004-01-24 at 01:23:26ID: 10190297

From what I have done so far, it doesn't work :(

I've posted the code to: http://www.clanpower.com/accounts/burningmacelans/LightsOut.zip

I hope you can find the problem!

If possible, could you fix the program, outline each fixed line with a comment like
'FIXED: Explanation
And then post the code back here???

That'd be great :)

Thanks for all of your help so far!

I will increase points to 200 if you can get it working!

 

by: crazycomputersPosted on 2004-01-24 at 11:55:18ID: 10192111

Here is the line in my sample that I called SearchTree from:

SearchTree mPos, 0, 0

X and Y indicate where to begin the search.  You might say that these are internal as well.

Remember that everything is 0-based, so a 5x5 grid will deal with array indicies 0..4, 0..4.

 

by: crazycomputersPosted on 2004-01-24 at 12:05:50ID: 10192168

I looked over your code and have a few suggestions:

Move the DoEvents to the line following:

If (NX = Cols) Then
    DoEvents ' <--- move here

This line is reached less often than the top of the subroutine.  As a result, the program will not be as responsive, but will search much faster.

Secondly, you don't need the StopSearch variable.  Setting FoundWin = True will cause the same effect.  Of course, you will still need a LOCAL StopSearch variable to check whether the user pressed cancel or not, but SearchTree doesn't need to know about it.  frmSolve should be changed to look like this:

' -----
Private Stopped As Boolean
Private Sub cmdStop_Click()
FoundWin = True
Stopped = True
Me.Hide
Unload Me
End Sub

Private Sub Timer1_Timer()
DoEvents
If Not Stopped Then
MsgBox "Found Solution!"
For M = 1 To MoveCount
    With Moves(M - 1)
        Debug.Print .X, .Y
    End With
Next M
Timer1.Enabled = False
Me.Hide
Unload Me
End If
End Sub
' -----

One important thing to note is that the tree search will ALWAYS produce a valid solution if you give it enough time, so you don't actually need to check FoundWin to determine if it was successful.

 

by: crazycomputersPosted on 2004-01-24 at 12:09:01ID: 10192185

Also, you are telling the solver in Form_Load that the board is 5x5 when, in fact, it is 6x6.

Rows = 5   ' should be 6
Cols = 5     ' ditto

 

by: crazycomputersPosted on 2004-01-24 at 12:12:13ID: 10192199

Also, replace your GetRow and GetColumn functions with these more flexible and (in the case of GetColumn) readable counterparts:

Public Function GetRow(ByVal index As Integer)
GetRow = Int(index / Rows)
End Function

Public Function GetColumn(ByVal index As Integer)
GetColumn = index Mod Cols
End Function

 

by: crazycomputersPosted on 2004-01-24 at 12:17:18ID: 10192226

You also don't need any DoEvents in the Timer1_Timer subroutine.  And, for the sake of speed and cleanness of code, there shouldn't be a timer at all; check the result after SearchTree returns.

 

by: crazycomputersPosted on 2004-01-24 at 12:50:41ID: 10192411

Okay, here's my modified version of your program.  It's still really slow, but it solved a very simple puzzle rather quickly:

(UUEncoded to preserve PAQ value.)

_=_
_=_ Part 001 of 001 of file LightsOut.zip
_=_

begin 666 LightsOut.zip
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
8<FU02P4&``````4`!0`>`0``*10`````
`
end

 

by: burningmacePosted on 2004-01-26 at 23:46:43ID: 10207529

It doesn't seem to work :(

It just sits there and does nothing, even though I see the code being implemented.

 

by: burningmacePosted on 2004-01-26 at 23:47:56ID: 10207537

I might modify it to use the binary method first, then if nothing is found, try the second method!

 

by: crazycomputersPosted on 2004-01-27 at 03:27:16ID: 10208294

It "doesn't seem to work" because it takes forever to execute this in VB.  (That's why I wrote the original version in C.)  Press CTRL+BREAK every so often and use the DumpBoard procedure that I added to take a look at the current board state.  You'll see a different position than is on the board.  It's working... slowly.

 

by: crazycomputersPosted on 2004-01-27 at 03:34:42ID: 10208329

You might also consider running it as a compiled EXE.  First, you'll need to modify the way results are displayed (currently by Debug.Print, which doesn't show in a compiled app).

When running in the VB IDE, there are tons of debugging hooks in there that slow a program down.  My rough estimates from just watching compiled vs. IDE-run programs is that a compiled app is 500% faster (with optimization on speed).

I have actually heard of a way to get C object files compiled into a VB application.  Maybe I'll take a look and see if we can merge the two languages.  Should help with the speed.

 

by: crazycomputersPosted on 2004-01-27 at 03:46:11ID: 10208389

I found an add-in to do this for us: http://www.tweakvb.com .  I'll work on getting the C solver into the VB program.  Note that since C doesn't know about DoEvents, the program will likely hang until it's done solving.

 

by: burningmacePosted on 2004-01-27 at 10:25:47ID: 10211601

Hmmm... It seems you have to "buy" TWEAKVB. What does that mean? Joking.
I would prefer to have something for free.

Aha! You could make a C++ program that solves it when passed a command line argument of a 36 bit number showing the grid status:

001001
010011
101000
111101
010010

Becomes:

001001010011101000111101010010

Which is passed by:

Shell App.Path & "\Solver.exe 001001010011101000111101010010"


Thanx

 

by: crazycomputersPosted on 2004-01-27 at 21:46:29ID: 10215959

TweakVB does have a freeware version available, which isn't limited too badly.

But I'll work on the command-line version.  Along those lines, how do you plan on retrieving the solution from the external program?

 

by: crazycomputersPosted on 2004-01-27 at 21:50:26ID: 10215973

Another possible solution would be that I could write a DLL to do this in C, and you could call it from VB.  However, I've only written a handful of C programs already (the lights out solver being one of them) so I'm still not exactly sure about how to go about writing a DLL.  I'll try a few things and get back to you.

 

by: burningmacePosted on 2004-01-29 at 07:04:44ID: 10226650

I was thinking of retrieving the solution via a file containing the solution in the following format:

001101
010010
111101
101100
100101
010111

1 = Click it
0 = Don't click it

The DLL idea seems to be better though...

 

by: crazycomputersPosted on 2004-01-29 at 10:02:34ID: 10227664

As far as having the DLL and VB communicate, the best answer seems to me to be strings.  There are few other dynamically-sized types that have the same format in VB and C.  Dynamic-length strings need to be null-terminated, but we can optimize that away because we're dealing with a fixed-size grid.

The "answer" format will be a square in the format "X,X" & vbNullChar; a number, a comma, a number, and the null character.  We'll make the end of the solution have an extra null character so your program knows when to stop reading.  Given that information, the maximum size of an answer on a 6x6 grid is:

3 chars max for each coordinate + 1 null char = 4 chars per coord.
4 * 36 = 144
144 + 1 null char on the end = 145 chars

Still, it's best to be safe, so we'll allocate ourselves 200 characters.

Dim mBoard As String

' put code to get the board layout here.  string should be EXACTLY 36 characters.
' "0" (ASCII 48) for "off", and "1" (ASCII 49) for "on".

Dim mBuffer As String * 200   ' fixed-length string at 200 characters
SolvePuzzle ByVal Cols, ByVal Rows, ByRef mBoard, ByRef mBuffer

I'll work a bit on the DLL today, but it might take a while.

 

by: crazycomputersPosted on 2004-01-29 at 16:52:37ID: 10231464

The DLL has been finished!  It works with Visual Basic 6 on both Windows 98 and XP.  I have compressed the DLL with UPX (http://upx.sourceforge.net), which reduced the DLL from 44K to 15K.

The DLL source code is not included to save space on Experts Exchange.  Let me know if you really need it and I'll post it.

The idea has been modified a bit from my previous post.  Here is SolvePuzzle's prototype and parameter description:

----------

Function SolvePuzzle(Columns As Long, Rows As Long, LongestSolution As Long, Board As String, Solution As String) As Long

- Columns: The number of columns in the puzzle.

- Rows: The number of rows in the puzzle.

- LongestSolution: The maximum number of moves you're willing to accept as a solution.  Use 0 if you want the shortest possible solution.  (1 might be faster than 0, actually.)

- Board: A string of exactly (Columns * Rows) length.  Use "0" (ASCII 48) and "1" (ASCII 49) to designate on or off lights.  For example, the puzzle:

1 1 0 0 1
1 1 0 1 0
1 0 0 0 0
0 1 1 0 0
1 1 1 0 0

Would be represented as this:

mBoard = "1100111010100000110011100"

- Solution: A buffer that the solution will be returned in.  The format is x-coordinate, comma (,), y-coordinate, character code 1.  The last coordinate is postfixed with character code 0 (null) instead of 1.  So a solution might look like: ([n] is character code n)

0,0[1]2,0[1]4,4[0]

This can be parsed to look like:

0,0
2,0
4,4

It is worth noting that the solution is 0-based; 0,0 specifies the upper-left-most light, and (Columns - 1),(Rows - 1) the lower-right-most light.

----------

I have included a sample Visual Basic project that uses the DLL to solve a static puzzle.  Let me know if you need any help.  It includes a simple routine to parse the Solution string.


_=_
_=_ Part 001 of 001 of file losolver.zip
_=_

begin 666 losolver.zip
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
J`+:!FCD``'!R:DQ/5&5S="YV8G!02P4&``````,``P"P````53L`````
`
end

 

by: crazycomputersPosted on 2004-01-29 at 17:00:53ID: 10231527

Also, the DLL doesn't do any fancy DoEvents-like stuff, so your program will hang while the search is in progress.  To make the search go as quickly as possible, ALWAYS specify a LongestSolution.  As soon as it finds a solution, it checks if the number of moves is <= LongestSolution and, if so, returns immediately.  Specifying a LongestSolution of 0 means that the ENTIRE GAME TREE will be searched, regardless of the shortest solution found!

You might want to notify the user that the program will appear to hang while it's searching for a solution.

 

by: burningmacePosted on 2004-01-30 at 12:55:00ID: 10238329

When the DLL is called VB6 closes along with all my work. It's as if the DLL does a CloseProcess on VB6.

 

by: crazycomputersPosted on 2004-01-30 at 14:44:12ID: 10239270

This is a common problem with mixing VB and C.  If you aren't passing the parameters EXACTLY as the DLL expects them, it will most likely write into memory locations you didn't intend, bringing down the calling process (VB in this case).

Does the sample project work?  If it does, then post the code it's crashing with and I'll take a look.  If the sample DOESN'T work, then... well... I'll think of something.  ;)

 

by: crazycomputersPosted on 2004-01-30 at 14:49:14ID: 10239326

Here are a few places where you could be going wrong:

* Copy the declare EXACTLY from the sample project.  All arguments MUST be passed ByVal.

* The string you pass into Solution must contain enough characters to store the solution.  (200 to be safe).  Fill it with binary zeros before passing it in: mSolution = String(200, vbNullChar)

* The string you pass into Board must contain EXACTLY Rows * Columns characters.  Fewer, and the DLL will likely crash.

 

by: burningmacePosted on 2004-02-01 at 04:10:10ID: 10246297

The test worked!
I'll try to fix my project.

 

by: burningmacePosted on 2004-02-01 at 04:22:16ID: 10246316

Hmmm...
I fixed it to how the test worked. I ran it and got an 'Out of stack space' error on the DLL line, then the program exited. I saved before running though.

 

by: crazycomputersPosted on 2004-02-01 at 10:48:04ID: 10247736

Out of stack space?  That's weird.  Post your code and I'll take a look.

 

by: burningmacePosted on 2004-02-05 at 13:43:11ID: 10284747

 

by: crazycomputersPosted on 2004-02-05 at 13:59:54ID: 10284888

I'm still working on locating the source of the stack space error, but I did notice a typo:

Dim board As String
boaed = GetBoard

*** >>> Always, ALWAYS use Option Explicit! <<< ***

There are some VERY important reasons:

1) You avoid typos.
2) Implicitly created variables are declared As Variant.  Not only is this slow, but it wastes memory.

 

by: crazycomputersPosted on 2004-02-05 at 14:08:48ID: 10284962

I have located the source of the stack space error.  The problem could have been resolved per my previous post:

"Copy the declare EXACTLY from the sample project.  All arguments MUST be passed ByVal."

The declaration was not correct.  If ByVal is not specified, ByRef is assumed.  This means that Rows and Cols were not 6 and 6, but were some much, much larger numbers.  No wonder you ran out of stack space!

An amendment to the incorrectly spelled variable and the DLL declaration should render your program operable.  Be warned though... the program is taking quite a while on my computer.  I expect this is because your grid is 6x6 instead of my 5x5 demo.  I guess that comes with the territory...

 

by: crazycomputersPosted on 2004-02-05 at 14:17:09ID: 10285038

Go ahead and correct your program, but I'm going to reprogram the DLL to take advantage of the binary search method you proposed earlier.  All you really have to do is brute-force the FIRST row; the rest will follow.  Be aware that while this solution will be faster, it will NOT produce the smallest possible number of moves!

 

by: crazycomputersPosted on 2004-02-05 at 14:19:48ID: 10285056

I have also fixed a small bug in the DLL.  It should have verified that Rows and Cols were inside the bounds allowed by the MAX_SIZE constant.  If you try to solve a puzzle over this size, it will return 1 (now, anyway).

 

by: burningmacePosted on 2004-02-07 at 01:17:38ID: 10297293

Thanks so far, but I haven't got time to fix it at the moment. I'm kinda busy!
Could you post the UUE of the DLL soon, when you've fixed some stuff.

 

by: burningmacePosted on 2004-02-07 at 01:24:34ID: 10297318

Ok, I decided to fix the program now anyway, ignoring my previous task :P
It seems to work so far, as it just hangs for ages. It's running right now and has been for several minutes...
I'll post when it's done :P

 

by: burningmacePosted on 2004-02-07 at 01:44:40ID: 10297374

The program has been hanging for 30 mins. I'm closing it now. It's quite annoyingly slooooow.

 

by: crazycomputersPosted on 2004-02-07 at 13:17:20ID: 10299997

I've worked a bit on the DLL.  I'm abandoning the idea of implementing the binary search, but I do believe that there is a way that the search can go faster.  Instead of going through every possible board position, it is given a certain number of "presses."  So it will begin by looking for a 1-move solution, then a 2-move solution, etc.

I have also added a callback event that you can use to cancel the search, as well as display the number of positions seen.  Once I've perfected the system I'll post the code.

 

by: crazycomputersPosted on 2004-02-07 at 13:23:33ID: 10300023

And, as for the speed concern, here's what I found with a calculator.

Searching for a solution to a 5x5 grid takes approx. 20 seconds.  You would expect that 6x6 wouldn't be much longer, right?

Wrong!  Every single extra light DOUBLES the approximate search time!  A 6x6 grid has 11 (6 + 5) more lights, so that means...

20 * (2 ** 11) = 40,960 is how many seconds it will take on average!  That's (40960 / 60 / 60) = 11 hours!

So... either I work on that DLL update (faster search) or maybe you could consider using a 5x5 grid?

 

by: crazycomputersPosted on 2004-02-08 at 14:46:53ID: 10305433

Okay, I have done a few things:

* The DLL now searches for 1-move solutions, then 2-move solutions, etc.  This speeds up the search (a bit).

* The DLL provides a callback to provide feedback to the user, as well as allow them to cancel the search.

* The internal search function (searchtree) now passes a pointer to the board when it recurses instead of a copy of the board.  This means that searching is approx. five times faster, maybe more!

* SolvePuzzle now returns different values depending on the results of the search.

* I completely rewrote your program.  Well, not COMPLETELY, but I did add Option Explicit to all modules (and resolve any "undeclared identifier" errors caused by that), indented If ... Then / For ... Next / etc code, added a few comments, and other general fixes to make it more readable.  The "lblBox_Click" function is now no longer spaghetti-like (If ... Then; Goto) but now uses a smart subroutine to toggle the surrounding lights (including out-of-bounds detection for lights on the edge of the board).

The new syntax of SolvePuzzle is:

Private Declare Function SolvePuzzle Lib "losolver" (ByVal Columns As Long, ByVal Rows As Long, ByVal Depth As Long, ByVal Board As String, ByVal Solution As String, ByVal Callback As Long) As Long

Columns: No change.

Rows: No change.

Depth: Maximum depth to look for a solution.  If 0, the DLL uses (Rows * Columns) instead (I.E. searches the whole tree).

Board: No change.

Solution: No change.

Callback: Address of a VB function to take update messages.  Use 0 if you don't require updates.  The prototype of the function must be: "Function (ByVal Long, ByVal Long) As Long".  Return any non-zero value to cancel the search.

SolvePuzzle return values:

0: Found a solution, and stored it in the string passed into Solution.

1: The Rows or Columns parameter was outside of the hard-coded maximum board size.

2: The operation was cancelled because the subroutine passed into Callback returned a non-zero value.

3: No solution was found, probably because the search didn't go deep enough.


Cheers.



_=_
_=_ Part 001 of 001 of file LightsOut (rewritten).zip
_=_

begin 666 LightsOut (rewritten).zip
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
=8W0Q+G9B<%!+!08`````!0`%`!X!``"I30``````
`
end

 

by: burningmacePosted on 2004-02-09 at 10:09:05ID: 10312566

Slight problem! C++ is an evil language when it comes to large numbers - It loops. The number of positions seen loops when you get to a depth of about 11/36. Could you define the number as a float or double to stop this??? This is the first time I have ran the solver and have got to 12/36 so far. It's been several minutes and it's still going.

 

by: crazycomputersPosted on 2004-02-09 at 16:08:54ID: 10316803

Typically, random puzzles will require (rows * columns) / 2 moves to solve.  This is also the depth that takes the longest to search.  The time to solve a certain depth increases exponentially as it gets closer to (rows * columns) / 2 and decreases exponentially as it gets further away.

As for the looping, I never got that far during test runs.  (Contrived puzzles were solved by the solver, fortunately, even puzzles that took nine moves, so I know that the solver does work.)  C++ actually is not "evil" in this respect.  Most other languages (Java, Pascal, Perl) do not raise errors when a variable goes out of bounds.  Java and Pascal overflow (loop) the value, and Perl sets the value to "inf".  If you really want to talk about evil, ask yourself why VB's Boolean data type requires two bytes of storage.  ;)

I fear that other data types may not be compatible between C and Visual Basic.  Using a float value means that you lose accuracy, and it will say something like "Positions seen: 742963179401.5758".  What we need is VB support for the C __int64 (8-byte integer) type, or C support for VB's Decimal (14-byte integer) data type.  I'll do a bit of research on this.

 

by: crazycomputersPosted on 2004-02-09 at 16:14:16ID: 10316869

Well, that's handy!  I found out that the C __int64 and VB Currency data types are the same.  (Per this website: http://www.flipcode.com/articles/article_vbdlls.shtml)

I will work on updating this today.

 

by: crazycomputersPosted on 2004-02-09 at 17:07:06ID: 10317516

I have changed the data type from int to __int64.  The VB Currency data type does not use the exact same data representation (it has decimal information), but I have compensated for this in the DLL (it multiplies the pseen variable by 10000 before passing it to the callback function).


_=_
_=_ Part 001 of 001 of file losolver.zip
_=_

begin 666 losolver.zip
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
E````;&]S;VQV97(N9&QL4$L%!@`````!``$`.@```&\X````````
`
end

 

by: crazycomputersPosted on 2004-02-09 at 17:10:57ID: 10317559

Are you still sure that you want your product to have a 6x6 grid?  5x5 will solve much faster.

 

by: burningmacePosted on 2004-02-12 at 23:14:39ID: 10350054

It has to be 6x6 as it can ALWAYS be solved. 5x5 cannot always be solved :)

 

by: burningmacePosted on 2004-02-12 at 23:19:22ID: 10350074

Could you please add the binary brute-force method, as then it would add variety to the solver, and allow the user to quickly find an answer, even if it is not the smallest number of moves.

 

by: crazycomputersPosted on 2004-02-12 at 23:26:06ID: 10350101

5x5 can always be solved... can't it?

 

by: burningmacePosted on 2004-02-12 at 23:34:58ID: 10350134

I've made a modification to the code, so that users will find it easy to understand the output :)

The code that was:

For Result = LBound(bSolution) To UBound(bSolution)
    mSolution = mSolution & vbCrLf & bSolution(Result)
    Count = Count + 1
Next Result

Now reads as:

For Result = LBound(bSolution) To UBound(bSolution)
    bSolution(Result) = Str(Val(Mid(bSolution(Result), 1)) + 1) & "," & Str(Val(Mid(bSolution(Result), 3)) + 1)
    mSolution = mSolution & vbCrLf & bSolution(Result)
    Count = Count + 1
Next Result

This makes the solution 1-based instead of 0-based.
There are some glitchy errors that used to come up on my machine whils running, but I fixed them :)

 

by: crazycomputersPosted on 2004-02-13 at 15:45:53ID: 10357311

I have finished the second search algorithm.  (I don't want to call it "binary" because, in fact, it has little to do with the binary number system.)

The VB project has been modified to take advantage of the new search algorithm.  Because it really has only 36 (6 * 6) different positions to try, it usually finishes in the blink of an eye.  I added a help item to the solver menu to explain that it usually doesn't produce the shortest answer.

For speed reasons, you might consider changing Str(Val(Mid(bSolution(Result), 1)) + 1) to Chr(Asc(Mid(bSolution(Result), 1)) + 1).  Val() and Str() take longer to do their thing than Chr() and Asc().  You can leave it as it is though, as speed isn't very important during that stage.  (It can hardly take even half a second longer to use Str(Val()) than Chr(Asc()).)

Also, I removed vbSystemModal from your MsgBox calls.  This is considered VERY bad style.  Never make a dialog box system modal unless it is EXTREMELY urgent.  (For example, a virus was found, you're running low on disk space, or the dog is on fire.)


_=_
_=_ Part 001 of 001 of file losolver.zip
_=_

begin 666 losolver.zip
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
/``4`!0`>`0``'U$`````
`
end

 

by: crazycomputersPosted on 2004-02-28 at 15:04:32ID: 10477906

Did it work?

 

by: crazycomputersPosted on 2004-03-30 at 08:25:20ID: 10714800

Finally some activity.  I AGREE!  =)

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...