2009-09-01

minesweeper.jsx

Tipsでもなんでもないのですが、昔作ったExtendScriptToolKitで動くマインスウィーパーです。
AfterEffects上でも起動します。
ゲームクリア関数になんかスクリプト書けば、クリアしたらレンダリング開始とか
意味不明なことができます。
デフォルトではゲームクリア、ゲームオーバー時にはalert()でメッセージが出るだけです。

ボタンで描画してるので、Macのひとはボタンが丸くなっちゃいます。


(function (){

Array.prototype.shuffle = function () {
var i = this.length;
while (i--) {
var j = Math.floor(Math.random()*(i+1));
var t = this[i];
this[i] = this[j];
this[j] = t;
}
return this;
}

var cols = 12;
var rows = 8;
var bom_persent = 10;
var num_boms = Math.floor((cols*rows)/bom_persent);
var num_panels = cols*rows;
var buttonSize = 20;
var info_size = 60;

var mine_document = new Window('palette','mine-sweeper',[0,0,buttonSize*cols,buttonSize*rows+info_size]);
var mines_info = mine_document.add('panel',[0,0,buttonSize*cols,info_size-2],'',{name:"info"});
var hoge = mines_info.add('button',[buttonSize*cols/2-info_size/2,2,buttonSize*cols/2+info_size/2,info_size-8],'Refresh');
var mines_area = mine_document.add('group',[0,info_size,buttonSize*cols,buttonSize*rows+info_size])

//爆弾設定
var boms = [];
for(var i=1;i<=cols*rows;i++){
boms[boms.length] = i;
}
boms.shuffle();
boms = boms.slice(0,num_boms);

//何もないところの塗りつぶし再帰関数
function zero_fill(){
for(var i=1;i<arguments[0].length;i=i+2){
if(arguments[0][i]){
if(mines_area[arguments[0][i]].properties.value == "0"){
mines_area[arguments[0][i]].properties.value = " ";
mines_area[arguments[0][i]].visible = false;
if(mines_area[arguments[0][i]].properties.clicked == false) checkNumPanels();
mines_area[arguments[0][i]].properties.clicked = true;
zero_fill(checkArea(arguments[0][i]));
}
}
}
}

//パネルの残りチェック
function checkNumPanels(){
num_panels--;
if(num_panels <= num_boms){
gameClear();
}
}

//ゲームオーバー
function gameOver(){
allClear();
alert("GAME OVER");
}

//ゲームクリア
function gameClear(){
allClear();
alert("Clear!!");
}

//クリア時、ゲームオーバー時の描画
function allClear(){
for(var row=0;row<rows;row++){
for(var col=0;col<cols;col++){
var btnName = col +"-" + row;
if(mines_area[btnName].properties.value == "0"){
mines_area[btnName].visible = false;
}else{
mines_area[btnName].text = mines_area[btnName].properties.value;
mines_area[btnName].properties.clicked = true;
}
}
}
}

//答え表示
function allView(){
for(var row=0;row<rows;row++){
for(var col=0;col<cols;col++){
var btnName = col +"-" + row;
mines_area[btnName].text = mines_area[btnName].properties.value;
}
}
}

//自分の周りのボタンの名前を得る
function checkArea(){
var x= arguments[0].split("-")[0];
var y= arguments[0].split("-")[1];
var f = function (i,j){
if(i<0 || i>cols-1 || j < 0 || j >rows-1){
return null;
}else{
var btnName = i +"-" + j;
return btnName;
}
}
return [f(x*1-1,y*1-1),f(x,y*1-1),f(x*1+1,y*1-1),
f(x*1-1,y),f(x,y),f(x*1+1,y),
f(x*1-1,y*1+1),f(x,y*1+1),f(x*1+1,y*1+1)];
}

//ボタンの大きさの設定
function setBounds(col,row){
var ofsetX = col*buttonSize;
var ofsetY = row*buttonSize;
var n = [ofsetX,ofsetY,ofsetX+buttonSize,ofsetY+buttonSize];
return n;
}

//ボタンの名前の設定、アドレスみたいなもの
function setName(col,row){
var n = col + "-" + row;
return n;
}

//爆弾配列からの爆弾の設定
function setBom(col,row){
var n = col+cols*row+1;
for(var i=0;i<boms.length;i++){
if(n == boms[i]){
n = "*";
}
}
return n;
}

//最初の描画ルーチン
for(var row=0;row<rows;row++){
for(var col=0;col<cols;col++){
var mines = mines_area.add('button',setBounds(col,row),'',{name:setName(col,row),value:setBom(col,row),clicked:false});
mines.onClick = function (){
if(this.properties.value == "*"){
if(this.properties.clicked == false) gameOver();
}else if(this.properties.value == "0"){
num_panels++;
this.visible = false;
checkNumPanels();
zero_fill(checkArea(this.properties.name));
}else{
this.text = this.properties.value;
if(this.properties.clicked == false) checkNumPanels();
this.properties.clicked = true;
}
}
}
}

//爆弾の保持数の設定
for(var row=0;row<rows;row++){
for(var col=0;col<cols;col++){
var btnName = col +"-" + row;
var n = checkArea(btnName);
var num = 0;
if(mines_area[btnName].properties.value != "*"){
for(var i=0;i<n.length;i++){
if(n[i]){
if(mines_area[n[i]].properties.value == "*"){
num++;
}
}
mines_area[btnName].properties.value = num;
}
}
}
}

//チェック用
hoge.onClick = function (){
mine_document.close();
minesweeper();
}

mine_document.center();
mine_document.show();

})();




ダウンロード



タグ : [タグを追加する]


この記事の投稿者について:t_e_t_s_u_o

フィードバック

1 Star2 Stars3 Stars4 Stars5 Stars
(評価回数:4 , 平均:5.00)
Loading...Loading...

この記事に対する 9 の反応があります


  1. 1 AE-USERS 8月 31st, 2009 at 16:49

    新着記事 : minesweeper.jsx http://bit.ly/ypLA5

  2. 2 じゅる 8月 31st, 2009 at 17:26

    Watching : minesweeper.jsx | AEP Project http://bit.ly/HLMOl
    ちょっとこういうことやめてください。仕事が・・・

  3. 3 八の字 8月 31st, 2009 at 17:39

    30分ほど掛かってもクリアできないんですが、本家より難しくないですかコレ。 minesweeper.jsx | AEP Project http://bit.ly/1ac9q

  4. 4 ちーず 8月 31st, 2009 at 18:03

    Watching : minesweeper.jsx | AEP Project http://bit.ly/HLMOl

  5. 5 カナヘビ 6月 8th, 2010 at 14:57

    クリアしたらレンダリング開始の書きかたを、教えてください!

  6. 6 t_e_t_s_u_o 7月 6th, 2010 at 17:38

    //ゲームクリア
    function gameClear(){
    allClear();
    alert(“Clear!!”);
    }

    の部分を

    //ゲームクリア
    function gameClear(){
    app.project.renderQueue.render();
    }

    とするといいと思います~

  7. 7 haostin 3月 4th, 2011 at 12:00

    あ、やっぱ判らないっすorz スプリクトか・・・
    いちおう、ゲーム終了後に画面全消ししたあと、ifでいくつかの中から選ぶってのはありますが、違うね。
    http://ae-users.com/jp/tips/scripts-tips/2009/09/minesweeper-jsx/

  8. 8 AJABON GRINSMITH 5月 2nd, 2012 at 09:42

    ESTKで動くマインスイーパ、自分より2年も前に作ってる方がいらしたようで… http://t.co/Lu6c769P @

  1. 1 minesweeper.jsx | スクリプト - After Effects - 動画編集ソフト - アプリケーション | Jishuu.net Pingback on 7月 7th, 2012 at 13:05

コメントをどうぞ!




特集