(97.3.6作成)
「めだかっち」のプログラム(初期バージョン)を、はざまさんの作品でご紹介します。
このプログラムをベースに議論を続け、さらに発展させていきましょう。
はざまさんのコメントです。(^_^;;
ソースを出すのは恥ずかしいのですが、(おかしいところもあると思います) なんとか四方八方に泳ぐようになりました。 ほとんどがいろいろな方のソースのコピーです。^^)^^);; (特にたまじゃばさんのソースをたくさん利用させて頂いています。m(_ _)m) あといいかげんな部分もありまして、メダカの体長、幅の出し方がよくわか らなかったので、目分量で決めています。(((((((((^^; また、"FOOD"ボタンを押したからといって、メダカには体重が増えるとか 、なんら変化はありません。 メダカの状態を表示するためのラベルですが、もっと他に洒落た方法が あると思います(アイデア不足(^_^;)、徐々に変更していければいいなと 思っています。 最初クラス構成のお話がありましたが、今回はメダカクラスまで無くして しまいました。メダカの泳ぐスレッドをどちらのクラスに入れればいいのか その辺もよく分かりませんでしたから。(メダカの色をランダムに変更する メソッドも省略してしまいました。) MedakaAppletクラスを一つにするとほんとに楽でした。これをメダカクラス、 水槽クラス、等等のクラスを作っていくのがいいのでしょうが、そのクラスを作る ことによってどのようなメリットが出るのか、今はよく分かりません。 このように一つのクラスから徐々にクラスを増やしていくのって、順序が 逆なのかな? 逆になるとやはり面倒なことが多くなるのでしょうか? わからないことだらけです。 最初、話に出ていたようにみんなの個性あるメダカを一つの水槽で泳がせるには どうすればいいのでしょうか?、...実現すれば楽しいでしょうね。
import java.awt.*;
import java.applet.*;
public class MedakaApplet extends Applet implements Runnable{
Dimension d; //幅と高さを持つDimensionオブジェクトを作成
private String figure[];//メダカの姿(文字列)を入れる配列
int figureCount = 0; //メダカの姿を描画するための変数
int MaxFigure; //メダカの一方向の姿の数の変数
int x = 100; //メダカが最初にいるx座標
int y = 75; //メダカが最初にいるy座標
int medakaW = 40; //メダカの体長
int medakaH = 10; //メダカの高さ
int mode; //メダカの状態モード(泳ぐ方向)
int margin = 5; //メダカが端まで行かないようマージン
Image offs; //ちらつき防止のためのImageオブジェクト作成
Graphics grf; //ちらつき防止のためのGraphicsオブジェクト作成
Image im; //水草(30*50)の絵を入れる変数
int plantH = 50; //水草の高さ
Thread kick; //スレッド変数
Button b1,b2; //ボタン2個作成するための変数
Label lab1; //メダカの状態を表示するためのラベル変数
Panel top, bottom; //パネル2個作成するための変数
public void init() {
figure = new String[4]; //文字列を入れるための配列(4個入る)
figure[0] = ">^)))><";
figure[1] = "=^)))><";
figure[2] = "><(((^<";
figure[3] = "><(((^=";
setBackground(Color.gray); //背景をグレイにする
d = size(); //アプレットの幅と高さを得る
offs=createImage(d.width, d.height);//描画用領域を生成
grf=offs.getGraphics(); //offsに描くためのGraphicsオブジェクト
//水草イメージファイルの読み込み
im = getImage(getDocumentBase(), "plant1.gif");
b1 = new Button("FOOD "); //餌ボタン
b2 = new Button("CLEAN"); //掃除ボタン
top = new Panel();
//パネルに中央揃えにボタンを配置
top.setLayout(new FlowLayout(FlowLayout.CENTER));
top.add(b1); //ボタンをパネルに貼り付ける
top.add(b2);
//ラベルを一つ作成
lab1 = new Label(" ( ^ ^ ) ");
bottom = new Panel();
//パネルに中央揃えにラベルを配置
bottom.setLayout(new FlowLayout(FlowLayout.CENTER));
bottom.add(lab1); //ラベルをパネルに貼り付ける
setLayout(new BorderLayout());
add("North", top); //ボタンを貼り付けたパネルをアプレット上部に配置
add("South", bottom); //ラベルを貼り付けたパネルをアプレット下部に配置
mode = 1; //メダカの最初の状態モード
}
public void start(){
if (kick == null){
kick = new Thread(this);
kick.start(); //スレッドを実行させる
}
}
public void run(){ //スレッドの処理内容
int time = 0; //ラベルの表示を時間間隔を決めて変更するための変数
int count = 0; //メダカの状態をある間隔毎に変えるための変数
int dx = 0; //メダカのx座標移動数値
int dy = 0; //メダカのy座標移動数値
while (true){ //ずっと繰り返す
count = ++count;
if(count >=20){ //20回数えてメダカの状態モードを変える
count = 0;
mode = 1 + (int)(Math.random() * (float)(10));
}
if (d.width - x < margin + medakaW){
mode = 1; //右端に来ると左に進む
}
if (x < margin){
mode = 2; //左端に来ると右に進む
}
if(y < margin + 30 + medakaH){ //上端に来た時
if(x < d.width/2){ //左寄りの時は右下へ
mode = 5;
}
else{ //右寄りの時は左下へ
mode = 6;
}
}
if(y > d.height - 30 - margin - medakaH){ //下端に来た時
if(x < d.width/2){ //左寄りの時は右上へ
mode = 3;
}
else{ //右寄りの時は左上へ
mode = 4;
}
}
switch(mode){
case 1: //mode1:左向きに進む
swimDirection(0);
dx = -5;
dy = 0;
break;
case 2: //mode2:右向きに進む
swimDirection(2);
dx = 5;
dy =0;
break;
case 3: //右上に進む
dx = 5;
dy = -5;
swimDirection(2);
break;
case 4: //左上向きに進む
dx = -5;
dy = -5;
swimDirection(0);
break;
case 5: //右下に進む
dx = 5;
dy = 5;
swimDirection(2);
break;
case 6: //左下に進む
dx = -5;
dy = 5;
swimDirection(0);
break;
default: //モード1〜6以外は右上へゆっくり進む
dx = 2;
dy = -2;
swimDirection(2);
break;
}
x = x + dx; //メダカのx座標移動
y = y + dy; //メダカのy座標移動
repaint();
time = ++time; //ラベルの表示文字を一定時間毎に書き換える
if(200
![]()
![]()
教員に対するご意見はこちらへ:(Mail to : cbu-staff@psn.or.jp)
用務員:臼井義美 (Mail
to : usui@kcn.or.jp)