dh-Materialien
JavaScript    
Beispiele
 

SameGame

n =    c =       


// Online-Spiel SameGame (c)2014 dh

// die zur Verfügung stehenden Kugelfarben
var
col = new Array("a", "b", "c", "d", "e", "f", "g");

// Laufvariablen
var i = 0;
var j = 0;

// Kantenlänge des aktuellen Spielfeldes
var
n = 14;

// Anzahl verschiedener Farben im aktuellen Spiel
var
c = 5;

// jeweils benachbarte Kugeln gleicher Farbe
var
balls = new Array();

// Liste der Kugeln, deren Nachbarn noch zu untersuchen sind
var blist = new Array();

// Speicher für die bisherigen Spielzüge
var bckup = new Array();

// Positionen der Randkugelspalten l (links) und r (rechts)
var l;
var r;

// aktueller Punktestand
var
score = 0;

// Score-Liste
var sclst = new Array();

var IsSmiley = false;


function xc(name) {
// Hilfsfunktionen: xc('bc3') = 12; yc('b2f') = 15;
  return parseInt(name[1], 16);
}
function yc(name) {
  return parseInt(name[2], 16);
}

function nm(x, y) {
// Hilfsfunktion: nm(3, 12) = "b3c";
  xhex=x.toString(16);
  yhex=y.toString(16);
  return "b"+xhex+yhex;
}

function InBalls (i,j) {
// prüft, ob [i,j] Element von balls ist
  result = false;
  for (k=0; k<balls.length; k++)
    if ((balls[k][0] == i)&&(balls[k][1] == j))
      result = true;
  return result;
}

function clearSquares (imin, imax, jmin, jmax) {
// zeichnet den kugelfreien Hintergrund
  for (i=imin; i<=imax; i++)
    for (j=jmin; j<=jmax; j++)
      document.getElementById(nm(i,j)).src = "n.jpg";
  IsSmiley = false; 
}

function getColor(src) {
// Hilfsfunktion: getColor(../c.jpg) = c
  pos = src.length - 5;
  return src.substr(pos, 1);
}

function ijColor(i, j) {
  img = document.getElementById(nm(i,j)).src;
  pos = img.length - 5;
  return img.substr(pos, 1);
}

function setColor(i, j, col) {
  document.getElementById(nm(i,j)).src = col+".jpg";
}

function clearArray(arr) {
  arr.splice(0, arr.length);
}


function init() {
  // Auswerten der Eingaben
  n = parseInt(document.f_input.e_n.value, 10);
  if (n < 6) n = 6;
  if (n > 16) n = 16;
  if (Math.round(n/2) - n/2 != 0) n = n + 1;
  document.f_input.e_n.value = n.toString(10);

  l = 8-n/2;
  r = 7+n/2;

  c = parseInt(document.f_input.e_c.value, 10);
  if (c < 3) c = 3;
  if (c > 7) c = 7;
  document.f_input.e_c.value = c.toString(10);

  // Zufälliges Füllen des Spielfeldes mit Kugeln
  for (i=l; i<=r; i++)
    for (j=l; j<=r; j++) {
      cn = (c-1)*Math.random();
      cn = Math.round(cn);
      setColor(i, j, col[cn]);
  }

  clearSquares(0, l-1, 0, 15);
  clearSquares(r+1, 15, 0, 15);
  clearSquares(0, 15, 0, l-1);
  clearSquares(0, 15, r+1, 15);

  score = 0;
  ausgabe ("resultat", "0 Punkte");

  clearArray(bckup);
  clearArray(sclst);
  backupGame();
}


function SameColor(col, i, j) {
// prüft benachbarte Kugeln auf Farbgleichheit
  result = false;
  if ((i > l-1)&&(i < r+1))
    if ((j > l-1)&&(j < r+1))
      if (ijColor(i, j) == col)
        result = true;
  return result;
}

function GameOver() {
  var result = true;
  for (i=l; i<=r; i++) {
    if (result) {
      for (j=l; j<r; j++) {
        color = ijColor(i, j);
        if ((color != "n")&&(SameColor(color, i, j+1))) {
          result = false;
        }
      }
    }
  }
  if (result) {
    for (j=l; j<=r; j++) {
      for (i=l; i<r; i++) {
        color = ijColor(i, j);
        if ((color != "n")&&(SameColor(color, i+1, j))) {
          result = false;
        }
      }
    }
  }
  return result;
}


function checkBall(x, y, col) {
  if ((SameColor(col, x, y))&&(!InBalls(x, y))) {
    balls.push([x,y]);
    blist.push([x,y]);
  }
}


function checkNeighbours(i, j) {
  balls.push([i,j]);
  color = ijColor(i, j);

  var k = 0;
  var l = 0;
  blist.push([i,j]);
  while (blist.length != 0) {
    k = blist[0][0];
    l = blist[0][1];
    checkBall(k+1, l, color);
    checkBall(k, l-1, color);
    checkBall(k-1, l, color);
    checkBall(k, l+1, color);
    blist.splice(0,1);
  }
  return balls.length;
}


function deleteBalls() {
  var len = balls.length;
  for (k=0; k<len; k++) {
    i = balls[k][0];
    j = balls[k][1];
    setColor(i, j, "n");
  }
  score = score + (len-2)*(len-2);
  pkt = (score == 1) ? " Punkt" : " Punkte";
  ausgabe ("resultat", score.toString()+pkt);
}


function removeGaps() {
  var k;
  var column = new Array();
  for (j=l; j<=r; j++) {
    for (i=l; i<=r; i++) {
      color = ijColor(i, j);
      if (color != "n") column.push(color);
    }
    for (k=1+column.length; k<=n; k++) column.push("n");
    for (i=l; i<=r; i++)
      setColor(i, j, column[i-l]);
    column.splice(0, column.length);
  }
}


function getColumn(j) {
  var cballs = new Array();
  var len;
  for (i=l; i<=r; i++) {
    color = ijColor(i, j);
    cballs.push(color);
  }
  len = cballs.length;
  if (len < n) {
    for (i=len+1; i<=n; i++) {
      cballs.push("n");
    }
  }
  return cballs;
}


function backupGame() {
  var field = new Array();
  for (j=l; j<=r; j++) {
    field.push(getColumn(j).join(""));
   }
  bckup.push(field);
  sclst.push(score);
}


function reorganize() {
  var field = new Array();
  var len;
  for (j=l; j<=r; j++) {
    color = ijColor(l, j);
    if (color != "n") {
      field.push(getColumn(j));
    }
  }
  len = field.length;

  for (j=l; j<=len+7-n/2; j++) {
    for (i=l; i<=r; i++) {
      setColor(i, j, field[j-l][i-l]);
    }
  }
  if (len < n) {
    for (j=len+l; j<=r; j++) {
      for (i=l; i<=r; i++) {
        setColor(i, j, "n");
      }
    }
  }
  clearArray(field);
  if (GameOver()) showSmiley(0);
  if (len == 0) showSmiley(1);
  backupGame();
}


function undo() {
  var len = bckup.length;

  if (len > 1) {
    for (j=l; j<=r; j++)
      for (i=l; i<=r; i++) {
        setColor(i, j, bckup[len-2][j-l][i-l]);
      }
    bckup.splice(len-1, 1);
    score = sclst[len-2];
    ausgabe ("resultat", score.toString()+pkt);
    sclst.splice(len-1, 1);
  }

  if (IsSmiley) {
    setColor(14, 7, "n");
    setColor(14, 8, "n");
    setColor(13, 7, "n");
    setColor(13, 8, "n")
    IsSmiley = false;
  } 
}


function showSmiley(k) {
  if (k == 0) {
    setColor(14, 7, "ne");
    setColor(14, 8, "gs");
    setColor(13, 7, "mi");
    setColor(13, 8, "ly");
  } else {
    setColor(14, 7, "po");
    setColor(14, 8, "sm");
    setColor(13, 7, "il");
    setColor(13, 8, "ey");
   }

  IsSmiley = true;
}


function play(square) {
  color = getColor(document.getElementById("b"+square).src);
  if ((!IsSmiley)&&(color !="n")) {
    tdij = "b"+square;
    i = xc(tdij);
    j = yc(tdij);
    check = checkNeighbours(i, j);
    if (check > 1) {
      deleteBalls();
      removeGaps();
      reorganize();
    }
    clearArray(balls);
  }
}


var defaultNode = document.createTextNode('');
function ausgabe (ST, out) {
// gibt den Wert von out an einer bestimmten Stelle im Dokument aus

  with (document.getElementById (ST)) {
    outNode = document.createTextNode('');
    appendChild (defaultNode);
    replaceChild (outNode, document.getElementById(ST).firstChild);
    outNode = document.createTextNode(out);
    appendChild (defaultNode);
    replaceChild (outNode, document.getElementById(ST).firstChild);
  }
}

 Home   Back   Top