夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

人生初のGUIアプリを作った一日。

http://sites.google.com/site/grouseproject/

Grouse Projectのページである。
このサイトをどれくらいの人が見てくれているかは知る由もないが、この度このサイトで人生初のGUIアプリを開発した。

アプリ名は・・・

TopCoderDictionary


今回のリリースはαというわけで、とっても機能も少ないし単語も少ないが貴重な経験になった。

仕組みはというと、まぁ簡単なものでソースコード内でString型の二次元配列を定義し、そこに単語と意味を入れていってまずは小さな辞書の配列を作る。
で、テキストフィールドから受け取った単語を配列をループして一致するものを探し、それに対応する意味を別のテキストフィールドに表示といった感じ。

文字列の処理をのぞけばNetBeansチュートリアルを改造した感じと受け止めてくれればいい。
ファイル入出力を使って、単語追加機能をβまでに実装したいなって思っている。

これは次期β版のUI
さて、テトリスのほうだがコチラはどうも難しい。
コチラのサイト Java+AWTのサンプルがあったので掲載したいと思う。
import java.applet.Applet;
import java.awt.*;
import java.util.*;
import java.awt.event.*;

public class tet extends java.applet.Applet implements Runnable, KeyListener, MouseListener {

int blno=0; // ブロックNo.
int rot=0; // 回転角番号(0=0度,1=90度,2=180度,3=270度)
int block[][] = new int[4][4]; // ブロック
int bx=3, by=0; // ブロックの位置

int nw=18, nh=30; // ブロック位置の最大数
int board[][] = new int[nh+1][nw+1]; // 盤面のブロックの有無
int square = 8; // ブロックの幅

int score; // 点数

Dimension d; // 表示領域
Image offs; // オフスクリーン
Graphics grf;

Thread kicker = null; // アニメーションのためのスレッド変数
int speed = 300; // スピード
boolean loop = true; // 繰り返すための変数

public void init() {
int i ,j; // カウンター

/* ブロックがあるかないかの設定 */
for( i = 0 ; i <= nh ; i++ ) {
for( j = 0 ; j <= nw ; j++ ) {
board[i][j] = 0; // ブロックがない
}
}

/* 左右、下の固定ブロック */
for( i = 0 ; i <= nh ; i++ ) {
for( j = 0 ; j < 3 ; j++ ) {
board[i][j] = 2; // 左固定ブロック
board[i][nw-j] = 2; // 右固定ブロック
}
}
for( i = 0 ; i < 3 ; i++ ) {
for( j = 0 ; j <= nw ; j++ ) {
board[nh-i][j] = 2; // 下固定ブロック
}
}

/* オフスクリーンの設定 */
d = getSize(); // 表示領域の取得
offs = createImage( d.width, d.height);
grf = offs.getGraphics();

/* キーリスナとして自分自身を登録 */
addKeyListener(this);
requestFocus(); // キー入力フォーカス

/* マウスリスナとして自分自身を登録 */
addMouseListener(this);

/* ブロックの設定 */
blset();

score=0;

loop = true;
start();

}

public void paint(Graphics g) {
update(g);
}

public void update(Graphics g) {
int i, j; // カウンター

/* バックを塗る */
grf.setColor(Color.black);
grf.fillRect(0,0,d.width, d.height);

/* ブロックを描く */

grf.setColor(Color.blue);
for( i = 0 ; i <= nh ; i++ ) {
for( j = 0 ; j <= nw ; j++ ) {
if ( board[i][j] >= 1 ) { // ブロックがある
grf.fillRect(j*square, i*square, square, square);
}
}
}
/* 左右、下の固定ブロック */
grf.setColor(Color.darkGray);
for( i = 0 ; i <= nh ; i++ ) {
for( j = 0 ; j < 3 ; j++ ) {
/* 左固定ブロック */
grf.fillRect(j*square, i*square, square, square);
/* 右固定ブロック */
grf.fillRect((nw-j)*square, i*square, square, square);
}
}
for( i = 0 ; i < 3 ; i++ ) {
for( j = 0 ; j <= nw ; j++ ) {
/* 下固定ブロック */
grf.fillRect(j*square, (nh-i)*square, square, square);
}
}

/* 点数の表示 */
grf.setColor(Color.white);
grf.drawString("Score : "+score, 80, 265);

if ( !loop ) {
grf.setColor(Color.white);
grf.drawString("Game Over", 12, 265);
/* RESTARTボタンの描画 */
grf.setColor(Color.red);
grf.fillRect( 48, 120, 65, 25 );
grf.setColor(Color.white);
grf.drawString("RESTART", 55, 138);
grf.setColor(Color.white);
grf.drawLine( 48, 120, 113, 120);
grf.drawLine( 48, 120, 48, 145);
grf.setColor(Color.black);
grf.drawLine( 48, 145, 113, 145);
grf.drawLine( 113, 145, 113, 120);
}

/* オフスクリーンのイメージを一挙に実際の表示領域に描く */
g.drawImage(offs, 0, 0, this);

}

public void keyPressed(KeyEvent e) {
/* キーが押された */

int key = e.getKeyCode(); // 押されたキーのコードを取得

int numkey; // 数字キー
numkey = key - '0'; // 数字キーの計算

if ( numkey == 4 ) {
if ( judge2() ) {
bx = bx - 1;
}
}

if ( numkey == 6 ) {
if ( judge3() ) {
bx = bx + 1;
}
}

if ( numkey == 2 ) {
if ( judge1() ) {
by = by +1;
}
}

if ( numkey == 8 ) {
rot = rot +1;
if ( rot >= 4 ) {
rot = 0;
}
/* ブロックの中身をセット */
switch(blno){
case 0:
blpt0();
break;
case 1:
blpt1();
break;
case 2:
blpt2();
break;
case 3:
blpt3();
break;
case 4:
blpt4();
break;
case 5:
blpt5();
break;
case 6:
blpt6();
break;
}
if ( !judge4() ) {
rot = rot-1;
if ( rot < 0 ) {
rot = 4;
}
}
}
}

public void keyTyped(KeyEvent e) {
/* キーが押されてから離された */
}

public void keyReleased(KeyEvent e) {
/* キーが離された */
}

public void start() {
if(kicker == null) {
/* スレッドを実行させる */
kicker = new Thread(this);
kicker.start();
}
}

public void stop() {
/* スレッドを止める */
kicker = null;
}

public void run() {
int i ,j; // カウンター
int line = 0; // 消した行数
int ibx, iby; // 配列のインデックス

/* 実行中のスレッドをチェック */
Thread thisThread = Thread.currentThread();

/* ずっと繰り返し */
while( loop && kicker == thisThread) {

/* 移動前のブロックを消す */
for( i = 0 ; i <= nh-3 ; i++ ) {
for( j = 3 ; j <= nw-3 ; j++ ) {
if ( board[i][j] < 2 ) {
board[i][j] = 0; // ブロックがない
}
}
}

/* ブロックの中身をセット */
switch(blno) {
case 0:
blpt0();
break;
case 1:
blpt1();
break;
case 2:
blpt2();
break;
case 3:
blpt3();
break;
case 4:
blpt4();
break;
case 5:
blpt5();
break;
case 6:
blpt6();
break;
}

/* ブロックを進める */
if ( judge1() ) {
by = by + 1;
} else {
/* 下まで来たら、 */
/* ブロックを固定 */
for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
if ( block[i][j] == 1 ) {
ibx = bx+j;
iby = by+i;
if ( iby >= 0 && ibx >= 0 ) {
board[by+i][bx+j] = 2;
}
}
}
}
/* 次のブロック */
blset();
}

/* 移動後のブロックを設定 */
for( j = 0 ; j < 4 ; j++ ) {
for( i = 0 ; i < 4 ; i++ ) {
iby = by+i;
ibx = bx+j;
if ( iby >= 0 && ibx >= 0 ) {
if ( board[by+i][bx+j] < 2 ) {
board[by+i][bx+j] = block[i][j];
}
}
}
}

/* 一行揃っていたら消して詰める */
for( i = 1 ; i <= nh-3 ; i++ ) {
if ( lineblt(i) ) {
line=line+1; // 消した行数をカウント
}
}
/* 消した行数から点数を計算 */
line=line*line;
score=score+line*10;
line=0;
repaint();

/* 一行めに固定ブロックがあったらゲーム終了 */
for( j = 3 ; j <= nw-3 ; j++ ) {
if ( board[0][j] == 2 ) {
loop = false;
}
}

try {
Thread.sleep(speed);
} catch (InterruptedException e){}
}
}

public void blset() {
int i, j; // カウンター
blno = (int)( Math.random() * (float)(7) );
rot = 0;
bx = (int)( Math.random() * (float)(nw-7) )+3;
by = -4;
for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0; // ブロックがない
}
}
}

public boolean judge1() {
int i, j; // カウンター
int ibx, iby; // 配列のインデックス

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
iby = by+i;
ibx = bx+j;
if ( iby >= 0 && ibx >= 0 ) {
if ( 3 == board[by+1+i][bx+j] + block[i][j] ) {
return false;
}
}
}
}
return true;
}
public boolean judge2() {
int i, j; // カウンター
int ibx, iby; // 配列のインデックス

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
iby = by+i;
ibx = bx+j;
if ( iby >= 0 && ibx >= 0 ) {
if ( 3 == board[by+i][bx-1+j] + block[i][j] ) {
return false;
}
}
}
}
return true;
}
public boolean judge3() {
int i, j; // カウンター
int ibx, iby; // 配列のインデックス
for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
iby = by+i;
ibx = bx+j;
if ( iby >= 0 && ibx >= 0 ) {
if ( 3 == board[by+i][bx+1+j] + block[i][j] ) {
return false;
}
}
}
}
return true;
}
public boolean judge4() {
int i, j; // カウンター
int ibx, iby; // 配列のインデックス

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
iby = by+i;
ibx = bx+j;
if ( iby >= 0 && ibx >= 0 ) {
if ( 3 == board[by+i][bx+j] + block[i][j] ) {
return false;
}
}
}
}
return true;
}
public boolean lineblt(int i) {
int j, k; // カウンター
for( j = 3 ; j <= nw-3 ; j++ ) {
if ( board[i][j] != 2 ) {
return false; // 揃っていなかったらこのメソッドを抜ける
}
}
for( k = 0 ; k < i ; k++ ) {
for( j = 3 ; j <= nw-3 ; j++ ) {
board[i-k][j]=board[i-k-1][j]; // ブロックを詰める
}
}
for( j = 3 ; j <= nw-3 ; j++ ) {
board[0][j] = 0; // 1行目のセット(ブロックはない)
}
return true;
}

public void mousePressed(MouseEvent e) {
int ix, iy; // マウスが押された座標

/* マウスが押された座標を得る */
ix = e.getX();
iy = e.getY();

if ( ix > 48 && ix < 113 && iy > 120 && iy < 145 ) {
/* マウスの座標(ix,iy)がRESTARTボタン内 */
/* だったらゲーム再スタート       */
if (!loop) {
stop();
init();
repaint();
}
}
}

public void mouseReleased(MouseEvent e) {
/* マウスボタンが離された */
}

public void mouseClicked(MouseEvent e) {
/* マウスボタンがクリックされた */
}

public void mouseEntered(MouseEvent e) {
/* マウスカーソルが入ってきた */
}

public void mouseExited(MouseEvent e) {
/* マウスカーソルが出ていった */
}

public void blpt0() {
int i ,j; // カウンター

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0;
}
}
switch(rot) {
case 0:
/* blno=0, rot=0 */
block[1][1]=1;
block[2][1]=1;
block[3][0]=1;
block[3][1]=1;
break;
case 1:
/* blno=0, rot=1 */
block[2][0]=1;
block[2][1]=1;
block[2][2]=1;
block[3][2]=1;
break;
case 2:
/* blno=0, rot=2 */
block[1][0]=1;
block[1][1]=1;
block[2][0]=1;
block[3][0]=1;
break;
case 3:
/* blno=0, rot=3 */
block[2][0]=1;
block[3][0]=1;
block[3][1]=1;
block[3][2]=1;
break;
}
}
public void blpt1() {
int i ,j; // カウンター

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0;
}
}
switch(rot) {
case 0:
/* blno=1, rot=0 */
block[1][0]=1;
block[2][0]=1;
block[3][0]=1;
block[3][1]=1;
break;
case 1:
/* blno=1, rot=1 */
block[2][2]=1;
block[3][0]=1;
block[3][1]=1;
block[3][2]=1;
break;
case 2:
/* blno=1, rot=2 */
block[1][0]=1;
block[1][1]=1;
block[2][1]=1;
block[3][1]=1;
break;
case 3:
/* blno=1, rot=3 */
block[2][0]=1;
block[2][1]=1;
block[2][2]=1;
block[3][0]=1;
break;
}
}
public void blpt2() {
int i ,j; // カウンター

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0;
}
}
switch(rot) {
case 0:
/* blno=2, rot=0 */
block[2][1]=1;
block[3][0]=1;
block[3][1]=1;
block[3][2]=1;
break;
case 1:
/* blno=2, rot=1 */
block[1][1]=1;
block[2][0]=1;
block[2][1]=1;
block[3][1]=1;
break;
case 2:
/* blno=2, rot=2 */
block[2][0]=1;
block[2][1]=1;
block[2][2]=1;
block[3][1]=1;
break;
case 3:
/* blno=2, rot=3 */
block[1][0]=1;
block[2][0]=1;
block[2][1]=1;
block[3][0]=1;
break;
}
}
public void blpt3() {
int i ,j; // カウンター

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0;
}
}
switch(rot) {
case 0:
/* blno=3, rot=0 */
block[2][0]=1;
block[2][1]=1;
block[3][0]=1;
block[3][1]=1;
break;
case 1:
/* blno=3, rot=1 */
block[2][0]=1;
block[2][1]=1;
block[3][0]=1;
block[3][1]=1;
break;
case 2:
/* blno=3, rot=2 */
block[2][0]=1;
block[2][1]=1;
block[3][0]=1;
block[3][1]=1;
break;
case 3:
/* blno=3, rot=3 */
block[2][0]=1;
block[2][1]=1;
block[3][0]=1;
block[3][1]=1;
break;
}
}
public void blpt4() {
int i ,j; // カウンター

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0;
}
}
switch(rot) {
case 0:
/* blno=4, rot=0 */
block[0][0]=1;
block[1][0]=1;
block[2][0]=1;
block[3][0]=1;
break;
case 1:
/* blno=4, rot=1 */
block[3][0]=1;
block[3][1]=1;
block[3][2]=1;
block[3][3]=1;
break;
case 2:
/* blno=4, rot=2 */
block[0][0]=1;
block[1][0]=1;
block[2][0]=1;
block[3][0]=1;
break;
case 3:
/* blno=4, rot=3 */
block[3][0]=1;
block[3][1]=1;
block[3][2]=1;
block[3][3]=1;
break;
}
}
public void blpt5() {
int i ,j; // カウンター

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0;
}
}
switch(rot) {
case 0:
/* blno=5, rot=0 */
block[2][1]=1;
block[2][2]=1;
block[3][0]=1;
block[3][1]=1;
break;
case 1:
/* blno=5, rot=1 */
block[1][0]=1;
block[2][0]=1;
block[2][1]=1;
block[3][1]=1;
break;
case 2:
/* blno=5, rot=2 */
block[2][1]=1;
block[2][2]=1;
block[3][0]=1;
block[3][1]=1;
break;
case 3:
/* blno=5, rot=3 */
block[1][0]=1;
block[2][0]=1;
block[2][1]=1;
block[3][1]=1;
break;
}
}
public void blpt6() {
int i ,j; // カウンター

for( i = 0 ; i < 4 ; i++ ) {
for( j = 0 ; j < 4 ; j++ ) {
block[i][j] = 0;
}
}
switch(rot) {
case 0:
/* blno=6, rot=0 */
block[2][0]=1;
block[2][1]=1;
block[3][1]=1;
block[3][2]=1;
break;
case 1:
/* blno=6, rot=1 */
block[1][1]=1;
block[2][0]=1;
block[2][1]=1;
block[3][0]=1;
break;
case 2:
/* blno=6, rot=2 */
block[2][0]=1;
block[2][1]=1;
block[3][1]=1;
block[3][2]=1;
break;
case 3:
/* blno=6, rot=3 */
block[1][1]=1;
block[2][0]=1;
block[2][1]=1;
block[3][0]=1;
break;
}
}
}

Cのアルゴリズムでも薄々気づいてはいたがこれは大変そうである。
ただ、TopCoderDictionaryでPlusゲームは大体整ったと見ていい(改造すれば容易に英単語クイズにすることができる。)のであとは実装あるのみ。Swingで上記と同じことが、しかも追加機能を携えてできるか。

まぁ、時間の許す限り勉強するしかないだろう(ただ、学校の勉強があるので何とも言えない
それ以前にまだJavaの入門書を完読(問題含む)していないのでまずそれを解決しなければ。

パソコンでやるべき学校の課題もあるのでLinuxを起動することはしばらくなくなるので・・・


うん。まあ要するにまだまだ完成は先ということだ。(文化祭までに完成させてコン部の入部記念作品にしたいなぁ・・・)

最近Facebookにますますはまり始めたTouyou、ここらへんで失敬する。
では☆ミ