最近の記事

字句解析・構文解析に使える正規表現処理

var exp=['(@:)','(@[0-9])','(l[0-9]+)','(o[0-9]+)','(p[0-9]+)','(t[0-9]+)','(v[0-9]+)','[a-g][+-]?[0-9]*.?'];function lexer(str){ return str.match(new RegExp(exp.join('|'),'g'));}function parser(tokens){ for(var i=0;i<tokens.length;i++){

    • モートン順序 ⇔ XY 相互変換

      var mo2xy=function(m){ var r=m & 3, t=[], x=0,y=0 while(m>0){ m>>=2, t.push(m&3) } t.unshift(r) for(var i=0,l=t.length;i<l;i++){ x+=(t[i] & 0x55555555)*(2**i) y+=((t[i] & 0xAAAAAAAA)>>1).toString(2)*(2**i) } return [x,y]}var xy2

      • 複数エレメントにイベントリスナー取り付け

        var c=document.getElementsByClassName('button')for(var i=0,l=c.length;i<l;i++){ (function(e){ e.addEventListener('touchstart',function(_e){ console.log(e.className, e.id) } })(c.item(i))} 複数のエレメントをクラス名で取得 取得した

        • コンパス

          <html><body></body><script>var $=function(id){return document.getElementById(id)}var screen={fov:60}var compus={ fov:60, direction:(function(){  var d=[]  for(var i=0;i<=360;i+=5){   if(i%5==0){    d.push({0:'E',45:'SE',90:'S',135:'SW',180:

        字句解析・構文解析に使える正規表現処理

          Bar表示 & イベント発生+後処理

          var $=function(i){return document.getElementById(i)}function Bar(id, value, color){ this.id=id, this.min=0, this.value=value, this.max=value, this.color=color, this.makeBar=function(){ return '<div class=bar id={id} style=color:{co

          Bar表示 & イベント発生+後処理

          規約+設定

          Railsのルールに「設定より規約」というものがあるが、規約=初期設定として考え、必要な部分のみを設定し、規約の一部を上書きして設定の書き換えを行う var rule={ world:1234, mode:1 }var config={ mode:2 }var rule_and_config = config ? Object.assign( rule, config ) : ruleconsole.log( rule_and_config ) // { world:123

          規約+設定

          チャットコマンド実装

          function $(i){return document.getElementById(i)}function log(t){$('log').innerHTML+=t+'<br>'};function command(t){ t=t.match(/[^\/](.*?)$/)[0].split(' '); com[t[0]] ?com[t[0]][t[1]] ?com[t.shift()][t.shift()](t) :com[t.shift()](t) :log('n

          チャットコマンド実装

          キャラクター移動キー処理

          document.addEventListener('keydown', function(e){ game.key[e.key]=1 });document.addEventListener('keyup', function(e){ game.key[e.key]=0 });var game={ frame: 30, k:'wsda', key:{}, process: { 'w': function(){ console.log('forward')},

          キャラクター移動キー処理

          置換によるマークダウン記法の実装

          書き換え表現の設定 var expr=[ {re:/#(.*?)\r\n/g , rp:function(m,$1){return '<h1>'+$1+'</h1>\r\n'} }, {re:/----+\r\n/g , rp:function(m){return '<hr>\r\n'} } ]; 書き換え処理 function markdown(txt){ for(var i=0,l=expr.length; i<l; i++){ var _expr=ex

          置換によるマークダウン記法の実装

          if-else if-else文, switch-case文,三項演算を使わない分岐処理

          数字による分岐処理: document.getElementById(id).style.backgroundColor=['#fff','#f00'][n]; 文字による分岐: function get(word){ return {'id':id, 'name':name}[word];}

          if-else if-else文, switch-case文,三項演算を使わない分岐処理

          XorShift シード値による疑似乱数生成

          function xs32(s){ this.s= s || new Date().getTime(), this.x= this.s, this.n= function(){ this.x^=this.x<<13; this.x^=this.x>>17; this.x^=this.x<<15; return this.x }, this.r= function(min,max){ return min+Math.abs(this.n(

          XorShift シード値による疑似乱数生成

          自動生成マップ(バイオーム搭載)

          マップを3タイプの気候帯に分割 ・熱帯 ・温帯+乾燥帯 ・冷帯 それぞれの気候帯でマップの色分けの比率を変更する ・熱帯:海が少ないが浅瀬が広い、草原と森が広い、森は高木と低木が混じる、山の高い場所は雪になる ・温帯+乾燥帯:砂と草原が広く森は高木、低木、の他に一部が草になる ・冷帯:海が多く砂、草原が狭く、森、山が広い、森は低木がなく一部が草になる、山は氷で覆われ、高い場所は雪になる マップを書き換えるタイミングで緯度レベル、高度→地形+ランダム変化を加えることで各バ

          自動生成マップ(バイオーム搭載)

          自動生成マップ(チャンク+ダイヤモンドスクエア)

          <html><body></body><script>// ダイヤモンドスクエアfunction dmsq(s, sz, mz, h, mp){ var m=(eval(h.join("+"))>>2); if (sz==1) { mp[s]=m; return } else { sz>>=1; dmsq(s, sz, mz, [ h[0], (h[0]+h[1])>>1, (h[0]+h[2])>>1, m ], mp); dmsq(s+sz, sz

          自動生成マップ(チャンク+ダイヤモンドスクエア)

          文字置換の応用 L-system

          L-systemはフラクタルを応用した自動生成システムの一つ function Lsys(O, P, n){ while (n--) O=O.replace(P.reg, function(m, $1){ return P[$1] }); return O;}// 藻類WScript.echo(Lsys("A", {"A":"AB","B":"A","reg":/([AB])/g}, 4));// フィボナッチWScript.echo(Lsys("A", {"A":"B

          文字置換の応用 L-system

          JavaScript文字列テンプレート(ロジック搭載式)

          var t=[], tmp='<td id=\'{id}\'>{c}</td>';for(var i=0,l=100;i<l;i++){ t.push(tmp.replace(/\{(.*?)\}/g, function(m,$){ return {'id':i, 'c':i%2==0?1:0}[$]; });}document.body.innerHTML='<table><tr>'+t.join('</tr><tr>')+'</tr></table>'; tm

          JavaScript文字列テンプレート(ロジック搭載式)

          移動方向と壁

          var Map = { size: 32, grid: [ ]}var System = { translation: function (p,o,k){ var d=[ 1, Map.size, -Map.size, -1]["0123130220313210".charAt(o*4+k)]; return Map.grid[ p+d ] ? p : p+d ; }} 2次元マップの移動時の処理p:position プレイヤーの一次元位置(二次元マップ

          移動方向と壁