GDD11JP DevQuiz解答晒し祭り:WebGame用ChromeExtension 意味なく公開


巷で流行っているそうですので、わたくしも晒します。


分野別クイズはWebGameとGoをやりました。
スライドパズルは519個しか解けませんでした。幅優先検索をスタートとゴールから実施して、マンハッタン距離(壁無視)でコストを出して、コストが低いものから解くようにしたという感じです。60秒で解けないものはあきらめるという作戦で、一晩動かしてそんなスコアです。よってこれは晒さない。


TF枠で当選していたこともあり、スライドパズルはその辺でやめてしまいました。
TF枠なんで当選したのかは等の本人も首をかしげる状態です。何基準なのでしょうか。

GO!

GOははじめて書きましたが、こんなのでいいのでしょうかね。。

package main

import (
    "fmt"
    "io"
    "strings"
    "image"
    _ "image/png"
)

func CountColor(png io.Reader) int {
    img, _, _ := image.Decode(png)
    rect := img.Bounds() //Rectangle

    //Colorを記憶するMap
    colors := make(map[string] string)

    for x := 0; x < rect.Max.X ; x++ {
      for y := 0; y < rect.Max.Y; y++  {
        //fmt.Println(img.At(x, 3))
        r, g, b, _ := img.At(x, y).RGBA()
        srtRgb := string(r) + "," + string(g) + "," + string(b)
        colors[srtRgb] = srtRgb
      }
    }
    //fmt.Println(len(colors))
    return len(colors)
}


コンパイラのインポートエラーがよくわからなかった(_ "image/png")のところ。今もちょっと良くわかってないw
あと、Try&Errするのに、以下が役に立ちました。特に環境がなくてもブラウザで動かせたので。
http://golang.org/doc/play/

Web Game

ChromeExtensionは以下に公開してみました
https://chrome.google.com/webstore/detail/hchabofhnbmpbeoocneocmlehpcflmbh?hl=ja

中身は結構かんたんです。
こんなの書きました。jqueryを使ってます。

solver.js

//[id1, id2]を格納していく。キーはcolorの値を使ったHash
var colors = {};

//カードを1枚ずつあけていく処理
var elements = $("div.card");
elements.each(function(){
	var self = $(this);
	self.click(function(){
		var _color = self.css("backgroundColor");
		var _id = self.attr("id");
		console.log("id=" + _id + ", color=" + _color);
		if (!colors[_color]) {
			colors[_color] = [];
		}
		colors[_color].push(_id);
	});
	clickEvByDom(this);
});

//console.log(colors);

//同じ色ごとにクリックしていく
for (var arr in colors) {
	console.log("arr:" + arr);
	elem0 = $("#" + colors[arr][0]).get(0);
	elem1 = $("#" + colors[arr][1]).get(0);
	clickEvByDom(elem0);
	clickEvByDom(elem0);
	clickEvByDom(elem1);
}

//jQueryのClickではNGなのでDOM経由でClickする
function clickEvByDom(elem) {
	var clickEv = document.createEvent("MouseEvents");
	clickEv.initEvent("click", false, true);
	elem.dispatchEvent(clickEv);	
}

とりあえず、1枚ずつあけていって色とIDを記憶して、同じ色同士をクリックしていくという単純な戦略です。この程度であっさりといけてしまった。


これをExtensionとして組み込むために、マニフェストを書きます。

{
  "name": "GDD11JP Web Game Solver",
  "version": "1.0",
  "description": "google developer day 2011 jp Web Game solver.",
  "content_scripts": [
    {
      "matches": [
        "http://gdd-2011-quiz-japan.appspot.com/webgame/problem*"
      ],
      "js": [
        "jquery-1.4.4.min.js",
        "solver.js"
      ],
      "run_at": "document_end",
      "all_frames": true
    }
  ]
}

JSON形式ですね。ポイントは

    • matchesのところに、実行したいURLを指定
    • jsのところに、jquery.js -> solver.js の順番で指定(逆は駄目)

ぐらいですね。
マニフェスト書く上での注意点は、コメントアウトしては駄目とか、余分なカンマを打たないとかですね。

実際にローカルで作るときは、マニフェストとJSを同じフォルダに置いてchrome://extensions/ で、デベロッパーモードにして、そのフォルダ読み込めば動きます。Greasemonkeyと違って、Extensionを修正したら、chrome://extensions/再読み込みしないと駄目で、これをいちいち手でやるのが面倒ではありますが、結構手軽に作れますね。



それにしても、Chrome Web Storeに公開するときに、1280x800のスクリーンショットが必須とか、128x128のアイコンが必須とか、メンドクサイなと思います。デフォルトの何かを提供してくれたり、適当にリサイズしてくれればうれしいんですけれどね。こんなことぼやくとガイドラインに反するって怒られたりして。。。