テトリスはゲームプログラミングの基礎/ジェフ・ホーキンス/この冬の孤独

Javascriptのテトリスのコードを読んでいた。
いろいろなプログラムを自分で書く経験をたくさんしないとプログラミング能力は高まらないなと思っている。
以下、GITHUBより引用。
テトリスのソース、今さら読んでいても難しくないが、こういったプログラムを自分でたくさん書くっていうのが大事なんだと実感している。
1var COLS = 10, ROWS = 20; // 盤面のマスの数
2 var board = []; // 盤面の状態を保持する変数
3 var lose; // 一番うえまで積み重なっちゃったフラグ
4 var interval; // ゲームタイマー保持用変数
5 var current; // 現在操作しているブロック
6 var currentX, currentY; // 現在操作しているブロックのいち
7 // ブロックのパターン
8 var shapes = [
9 [ 1, 1, 1, 1 ],
10 [ 1, 1, 1, 0,
11 1 ],
12 [ 1, 1, 1, 0,
13 0, 0, 1 ],
14 [ 1, 1, 0, 0,
15 1, 1 ],
16 [ 1, 1, 0, 0,
17 0, 1, 1 ],
18 [ 0, 1, 1, 0,
19 1, 1 ],
20 [ 0, 1, 0, 0,
21 1, 1, 1 ]
22 ];
23 // ブロックの色
24 var colors = [
25 'cyan', 'orange', 'blue', 'yellow', 'red', 'green', 'purple'
26 ];
27
28 // shapesからランダムにブロックのパターンを出力し、盤面の一番上へセットする
29 function newShape() {
30 var id = Math.floor( Math.random() * shapes.length ); // ランダムにインデックスを出す
31 var shape = shapes[ id ];
32 // パターンを操作ブロックへセットする
33 current = [];
34 for ( var y = 0; y < 4; ++y ) {
35 current[ y ] = [];
36 for ( var x = 0; x < 4; ++x ) {
37 var i = 4 * y + x;
38 if ( typeof shape[ i ] != 'undefined' && shape[ i ] ) {
39 current[ y ][ x ] = id + 1;
40 }
41 else {
42 current[ y ][ x ] = 0;
43 }
44 }
45 }
46 // ブロックを盤面の上のほうにセットする
47 currentX = 5;
48 currentY = 0;
49 }
50
51 // 盤面を空にする
52 function init() {
53 for ( var y = 0; y < ROWS; ++y ) {
54 board[ y ] = [];
55 for ( var x = 0; x < COLS; ++x ) {
56 board[ y ][ x ] = 0;
57 }
58 }
59 }
60
61 // newGameで指定した秒数毎に呼び出される関数。
62 // 操作ブロックを下の方へ動かし、
63 // 操作ブロックが着地したら消去処理、ゲームオーバー判定を行う
64 function tick() {
65 // 1つ下へ移動する
66 if ( valid( 0, 1 ) ) {
67 ++currentY;
68 }
69 // もし着地していたら(1つしたにブロックがあったら)
70 else {
71 freeze(); // 操作ブロックを盤面へ固定する
72 clearLines(); // ライン消去処理
73 if (lose) {
74 // もしゲームオーバなら最初から始める
75 newGame();
76 return false;
77 }
78 // 新しい操作ブロックをセットする
79 newShape();
80 }
81 }
82
83 // 操作ブロックを盤面にセットする関数
84 function freeze() {
85 for ( var y = 0; y < 4; ++y ) {
86 for ( var x = 0; x < 4; ++x ) {
87 if ( current[ y ][ x ] ) {
88 board[ y + currentY ][ x + currentX ] = current[ y ][ x ];
89 }
90 }
91 }
92 }
93
94 // 操作ブロックを回す処理
95 function rotate( current ) {
96 var newCurrent = [];
97 for ( var y = 0; y < 4; ++y ) {
98 newCurrent[ y ] = [];
99 for ( var x = 0; x < 4; ++x ) {
100 newCurrent[ y ][ x ] = current[ 3 - x ][ y ];
101 }
102 }
103 return newCurrent;
104 }
105
106 // 一行が揃っているか調べ、揃っていたらそれらを消す
107 function clearLines() {
108 for ( var y = ROWS - 1; y >= 0; --y ) {
109 var rowFilled = true;
110 // 一行が揃っているか調べる
111 for ( var x = 0; x < COLS; ++x ) {
112 if ( board[ y ][ x ] == 0 ) {
113 rowFilled = false;
114 break;
115 }
116 }
117 // もし一行揃っていたら, サウンドを鳴らしてそれらを消す。
118 if ( rowFilled ) {
119 document.getElementById( 'clearsound' ).play(); // 消滅サウンドを鳴らす
120 // その上にあったブロックを一つずつ落としていく
121 for ( var yy = y; yy > 0; --yy ) {
122 for ( var x = 0; x < COLS; ++x ) {
123 board[ yy ][ x ] = board[ yy - 1 ][ x ];
124 }
125 }
126 ++y; // 一行落としたのでチェック処理を一つ下へ送る
127 }
128 }
129 }
130
131
132 // キーボードが押された時に呼び出される関数
133 function keyPress( key ) {
134 switch ( key ) {
135 case 'left':
136 if ( valid( -1 ) ) {
137 --currentX; // 左に一つずらす
138 }
139 break;
140 case 'right':
141 if ( valid( 1 ) ) {
142 ++currentX; // 右に一つずらす
143 }
144 break;
145 case 'down':
146 if ( valid( 0, 1 ) ) {
147 ++currentY; // 下に一つずらす
148 }
149 break;
150 case 'rotate':
151 // 操作ブロックを回す
152 var rotated = rotate( current );
153 if ( valid( 0, 0, rotated ) ) {
154 current = rotated; // 回せる場合は回したあとの状態に操作ブロックをセットする
155 }
156 break;
157 }
158 }
159
160 // 指定された方向に、操作ブロックを動かせるかどうかチェックする
161 // ゲームオーバー判定もここで行う
162 function valid( offsetX, offsetY, newCurrent ) {
163 offsetX = offsetX || 0;
164 offsetY = offsetY || 0;
165 offsetX = currentX + offsetX;
166 offsetY = currentY + offsetY;
167 newCurrent = newCurrent || current;
168 for ( var y = 0; y < 4; ++y ) {
169 for ( var x = 0; x < 4; ++x ) {
170 if ( newCurrent[ y ][ x ] ) {
171 if ( typeof board[ y + offsetY ] == 'undefined'
172 || typeof board[ y + offsetY ][ x + offsetX ] == 'undefined'
173 || board[ y + offsetY ][ x + offsetX ]
174 || x + offsetX < 0
175 || y + offsetY >= ROWS
176 || x + offsetX >= COLS ) {
177 if (offsetY == 1 && offsetX-currentX == 0 && offsetY-currentY == 1){
178 console.log('game over');
179 lose = true; // もし操作ブロックが盤面の上にあったらゲームオーバーにする
180 }
181 return false;
182 }
183 }
184 }
185 }
186 return true;
187 }
188
189 function newGame() {
190 clearInterval(interval); // ゲームタイマーをクリア
191 init(); // 盤面をまっさらにする
192 newShape(); // 新しい
193 lose = false;
194 interval = setInterval( tick, 250 ); // 250ミリ秒ごとにtickという関数を呼び出す
195 }
196
197 newGame(); // ゲームを開始する
ソース引用元:https://github.com/yat1ma30/canvas-tetris/blob/master/js/tetris.js
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
2045年問題~人工知能が人間の知能を超える「技術的特異点(シンギュラリティ)」とは

世界を変える天才たち
人工知能が熱すぎる。意識のアルゴリズムはまだ解明されていないが、そこに近づきつつある今がエキサイティングすぎる。
ジェフ・ホーキンスのマスターアルゴリズムがもっとも正解に近いような気がする。

2004年には、ニューヨーク・タイムズの科学記者であるサンドラ・ブレイクスリーと共著で“On Intelligence”(邦題『考える脳 考えるコンピューター』)を出版した。同書では脳がどのように機能するかという「自己連想記憶」理論を提唱している。 この理論は脳についての統一理論で、認識したパターンから周辺世界について予測を行う能力こそが、脳と知能の鍵であると主張する。人工知能の実現については、脳が行っていることをそのままコンピュータにプログラムしても知性を持つコンピュータを作るのは無理であり、単純にパターンの見つけ方、使い方をコンピュータに教えることが必要であると説く。この方法によって現在のコンピュータでは達成し得ていないような、私たちの役に立つ、あらゆる種の有益な仕事ができる知能機械を作れると考えている。さらには、この自己連想記憶システムは脳の大脳皮質で実現されており、それが人間の知性の基底となっているとする。
引用元:ウィキペディア
On intelligence ジェフ・ホーキンス著 洋書版
【第8回AI美芸研】「人工知能と軍事」-「迫りくるシンギュラリティと不要階級の登場」松田卓也 3/5 #AI美芸研
人工知能の最前線~人口減・職の減少・ビジネスに与えるインパクト
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
今週はぐだぐだした一週間だった。
表彰式のミス。
シンママからの絶縁。
婚活の停滞、マッチングなるもその後のスルー。ひーよんさんは、私とマッチングしたくせに、なにも返事してくれない。
背景の巨大な絵を描いているがアスペおじさんは非協力的。
となりの職場の人が台布を貸して欲しいというんだが、そのためには台布の場所をハラッサーに聞かなきゃいけない。憂鬱だ。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
前の婚活でも、テンションが低いことが敗因だった。
浅草橋で会ったみかんサワーさんの件。
そして、今回もそれがあったんじゃないか。って思ってる。
それにしても、子ども最優先で、子どもが怒るからって子どもの前で電話しない女。
だから日中、仕事もしてないくせに電話できない。
日中働いている私ですら待たせて、子どもが寝てからじゃないと電話できないって、そんな子ども中心の、モンペ予備軍みたいな女性と付き合うと、これからもいろいろなことに振り回されそう。
別れてよかったんじゃないか、って自分を慰めてる。
今もまた
ペアーズとマッチドットコムで婚活している。
けど、音沙汰なし。
もう、ダメなのかな・・・
結婚しないの、って聞かれるのが嫌で、もう、6年ぐらい親に会ってない。
親不孝なんじゃなくて、自分が不幸(字が違うけど)なんだよ。
悔しいなぁ・・・
アトリエ行っても、出会えないしさぁ。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
ゼミも面倒くさいなぁ、
でも、履歴書に確実に書ける一行がこれで出来たと思えばいいか。
2年目にして、この履歴はちょっと自信が付くよなぁ。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
この冬は、結局、孤独に戻ってしまった。
さよなら、シンママさん。
1ヶ月、いい夢を見せてもらいました。(涙)
ダメだった原因は自分だったのです。
この冬は断食や勉強をして、いつもどおりの寒い、寂しい冬を過ごそうと思います。
実家には帰りません。
祖母が死んで、6年。
もう、実家に帰っていません。
ほんの数日前までは、シンママさんを両親に紹介することまで考えていたのに。
また数年。
私の父母は孫を見ることはできるのでしょうか。
スポンサーサイト