ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2016年7月26日火曜日

lifegame (JavaScript)

lifegame 作ってみた
短くするのが目的ではなく、何をしてるのか分かるように書いたつもり


=====html=====
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
  <title>lifegame</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>lifegame</h1>
  <canvas id ="c" width="300" height="300" />

  <script src="script.js"></script>
</body>
</html>
=====Javascript=====
window.addEventListener('load', init(30,30), false);

function init(m,n){
  // 横方向の配列作って、
  var la = new Array();
  // 縦方向に配列を追加する
  for(i=0;i<m+2;i++){
    la[i] = new Array();
    for(j=0;j<n+2;j++){
      la[i][j] = Math.floor(Math.random()*2);
    }
  }

  DrawProc(la,m,n);
}

function DrawProc(la,m,n)
{
  CopyBuff(la,m,n);
  DeadOrAlive(la,m,n);
  draw(la,m,n);
  setTimeout(DrawProc, 100,la,m,n);
}

function CopyBuff(la,m,n)
{
  // 上下をコピー
  for(i=1;i<m+1;i++){
    la[i][0]   = la[i][n];
    la[i][n+1] = la[i][1];
  }
  // 左右をコピー
  for(j=1;j<n+1;j++){
    la[0  ][j]   = la[m][j];
    la[m+1][j] = la[1][j];
  }
  // 四隅をコピー
  la[  0][  0] = la[m][n];
  la[m+1][n+1] = la[1][1];
  la[  0][n+1] = la[m][1];
  la[m+1][  0] = la[1][n];
}

function DeadOrAlive(la,m,n)
{
  // la から lbにコピー
  var lb = new Array();
  for(i=0;i<m+2;i++){
    lb[i] = new Array();
    for(j=0;j<n+2;j++){
      lb[i][j] = la[i][j];
    }
  }

  // lb を評価しながらla に設定
  for(i=1;i<m+1;i++){
    for(j=1;j<n+1;j++){
      var cnt = lb[i-1][j-1]+lb[i][j-1]+lb[i+1][j-1]
              + lb[i-1][j  ]           +lb[i+1][j  ]
              + lb[i-1][j+1]+lb[i][j+1]+lb[i+1][j+1];

      if(lb[i][j]==1&&(cnt==2||cnt==3)){
        // 生きててカウントが2か3
        // そのまま生きる
      }else if(lb[i][j]==0&&cnt==2){
        // そのまま死んどく
      }else if(lb[i][j]==0&&cnt==3){
        // 生まれる
        la[i][j] = 1;
      }else{
        // それ以外は死
        la[i][j] = 0;
      }
    }
  }
}

function draw(la,m,n){
  var canvas = document.getElementById('c');
  var ctx = canvas.getContext('2d');
  ctx.beginPath();
  

  for(i=0;i<m;i++){
    for(j=0;j<n;j++){
      if (la[i+1][j+1]==1){
        ctx.fillStyle = "white";
        ctx.fillRect(i*10, j*10, 10, 10);
      }else{
        ctx.fillStyle = "gray";
        ctx.fillRect(i*10, j*10, 10, 10);
        ctx.strokeStyle = "white";
        ctx.strokeRect(i*10, j*10, 10, 10);
      }
    }
  }
}
=====css=====
@charset "UTF-8";

#c {
  color: gray;
  background-color:gray;
}



2016年7月17日日曜日

重複しない乱数生成(JavaScript)

あまりにも考えなしに重複しない乱数生成とかウェブで公開している連中がいるので、正解をここに上げとく
ちなみに不正解なのは、
一度出た乱数を除外したり、配列に入れといてかき混ぜたりするやり方です。
なんで不正解なのかよく考えて欲しい。
下のやり方は、配列に入れといて、出たらその数を消すやり方
いわゆる物理的世界でのビンゴゲームと一緒のやり方だ。
ついでに左からのゼロ補完もやってる
文字の妥当性チェックは面倒なので数値かどうかだけ、マイナスだったり小数だったりはチェックしてない


----html----
<!doctype html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
  <title>重複のない乱数</title>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>重複のない乱数</h1>
  乱数の個数<br>
  <input type=text id="num" /><input type =button value = "開始" onClick="Start()" />
  <div id="test"></div>
  <script src="script.js"></script>
</body>
</html>
----css----
@charset "UTF-8";

#test {
  color: blue;
}

----js----
window.addEventListener('load', function(e) {
  // ここでは特に何もしない
}, false);


function initCollection(n,nums) {
  // nums 配列に1-nをセットする
  for(var i=0;i<n;i++){
    nums[i] = i+1;
  }
}
function Start(){
  // 配列を定義
  var nums = new Array();
  // test のエリアを消す
  document.querySelector('#test').innerHTML = "";
  // 入力された値を取得
  var n = document.getElementById("num").value;
  // 数値判定
  if(isNaN(n)){
    window.alert("数値を入れてください");
    document.getElementById("num").value = "";
    return;
  }

  // nums 配列を初期化
  initCollection(n,nums);

  // zero 補完用文字列を準備
  var nLen = n.length
  var zero='';
  for(var i=0;i<nLen;i++){
    zero += '0';
  }

  var cnt = 1;
  for(var i=n;i>0;i--){
    // 乱数生成
    var rnd = Math.floor(Math.random()*i);
    // カウントとnums のrnd番目を表示
    document.querySelector('#test').innerHTML +=
        (zero+cnt).slice(-nLen) +':' + nums[rnd]+ '<br>';
    // rnd 番目を削除
    nums.splice(rnd,1);
    // カウントをインクリメント
    cnt++;
  }
}