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();
})();
ダウンロード
2009-09-01
minesweeper.jsx
BY TIPS - スクリプト
IN
新着記事 : minesweeper.jsx http://bit.ly/ypLA5
Watching : minesweeper.jsx | AEP Project http://bit.ly/HLMOl
ちょっとこういうことやめてください。仕事が・・・
30分ほど掛かってもクリアできないんですが、本家より難しくないですかコレ。 minesweeper.jsx | AEP Project http://bit.ly/1ac9q
Watching : minesweeper.jsx | AEP Project http://bit.ly/HLMOl
クリアしたらレンダリング開始の書きかたを、教えてください!
//ゲームクリア
function gameClear(){
allClear();
alert(“Clear!!”);
}
の部分を
//ゲームクリア
function gameClear(){
app.project.renderQueue.render();
}
とするといいと思います~
あ、やっぱ判らないっすorz スプリクトか・・・
いちおう、ゲーム終了後に画面全消ししたあと、ifでいくつかの中から選ぶってのはありますが、違うね。
http://ae-users.com/jp/tips/scripts-tips/2009/09/minesweeper-jsx/
ESTKで動くマインスイーパ、自分より2年も前に作ってる方がいらしたようで… http://t.co/Lu6c769P @