Google Developer Day 2011 Quiz(3) Web Game

締切も過ぎたことなので解答を晒してみる。というか今 Quizトップページを見てみたらボーダーラインが101点になってる。。。これはだめかなあ。しかし、101点ということは結局のところスライドパズルがどれだけ解けるかが問題で、それまでの試験は意味ないってことだよな。

まずは Web Game。HTMLソースを見るとカードの色がベタに書いてあるので、それを読んでマッチングすれば瞬殺だけど、それではあまりに面白く無いので素直に神経衰弱してみた。

var count = 0;

function checknumberofcard(){
  var i = 0;
  var element = true;
  while(element){
    i++;
    element = document.getElementById('card' + i);
  }
  return i;
}

function solver(first){

  count++;
  console.log(count);
  if (count > 1800){
    return 0;
  }

  var card1 = 'card' + first;
  var color1 = turnupcard(card1);

  var checkColor = existColor(color1,first);
  var second;

  if (checkColor == -1) {
    second = getuncheckedcard(first);
  } else {
    second = checkColor;
  }

  var card2 = 'card' + second;
  var color2 = turnupcard(card2);

  if ( color1 == color2) {
    cardmap[first] = 0;
    cardmap[second] = 0;
    checkedmap[first] = 1;
    checkedmap[second] = 1;
  } else {
    cardmap[first] = color1;
    cardmap[second] = color2;
  }

  solver(getuncheckedcard(first));
}

function getuncheckedcard(n){
  var i = n + 1;
  while(true){
    if ((i != n) && (checkedmap[i] != 1)){
      return i;
    } else{
      return i + 1;
    }
    if (i == ncard - 1) {
      i = 0;
    } else {
      i++;
    }
  }
}

function existColor(color,n){
  for (i = 0; i < cardmap.length; i++) {
    if ((i != n) && (cardmap[i] == color)){
      return i;
    }
  }
  return -1;
}

function turnupcard(card){
  var element = document.getElementById(card);
  if (element == null) {
    return 0;
    alert('Card element is not found. Check element id.');
  } else {
    var myevent = document.createEvent('MouseEvents');
    myevent.initEvent('click', false, true);
    element.dispatchEvent(myevent);
    return element.style.backgroundColor;
  }
}

var ncard = checknumberofcard();
var checkedmap = new Array(ncard);
var cardmap = new Array(ncard);

console.log(ncard);
for(i=0; i < checkedmap.length; i++){
  checkedmap[i] = 0;
}
for(i=0; i < cardmap.length; i++){
  cardmap[i] = 0;
}

solver(0);

単純に 1枚目をめくって色を覚える。もしこれまでめくったカードでマッチしてないカードのなかに同じ色があれば 2枚目はそれをめくる。なければめくってないカードからひとつめくる。色が違っていればそれも覚える。カードがなくなるまで以下繰り返し。

1800とかいうマジックナンバーはこれは無限ループ抑止用。思い出した。バグがなくなった今はなくてもいいはず。

しかし汚いソースだ。改めて読み返すと我ながら意味不明だ。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください