//
// ライフゲームエディタJava版第3回
//
// 2000/ 6/23-2001/ 2/19 宍戸 輝光
//
import java.awt.*;
import java.awt.event.*;
class CLdat { // データクラス
private byte lifes[],blifes[]; // セル配列
private int width,height,step,nlife; // 大きさ保存用変数
private int rules[]={-1,-1,0,1,-1,-1,-1,-1,-1};
CLdat(int w,int h) { // コンストラクタ
width=w;
height=h;
// 指定された大きさでセル配列確保
lifes=new byte[width*height];
blifes=new byte[width*height];
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public int getStep() {
return step;
}
public int getNlife() {
return nlife;
}
public byte getLife(int x,int y) {
return lifes[x+y*width];
}
public void setLife(int x,int y,byte val) {
lifes[x+y*width]=val;
nlife=0;
for (int i=0;i<width*height;i++)
nlife+=lifes[i];
}
public void setRules(int rul[]) {
rules=rul;
}
public int[] getRules() {
return rules;
}
public void next() { // 1ステップ進める
int i,j,k,l,n,x,y;
// 現在のセルをblifesに退避
System.arraycopy(lifes,0,blifes,0,width*height);
nlife=0;
for (i=0;i<height;i++) // 注目セルを中心とする3×3セルの生物数計算
for (j=0;j<width;j++) {
n=0; // 生物数カウンタクリア
for (k=-1;k<2;k++) // 周辺の生物数合計
for (l=-1;l<2;l++) {
if (j+l==-1)
x=width-1;
else if (j+l==width)
x=0;
else
x=j+l;
if (i+k==-1)
y=height-1;
else if (i+k==width)
y=0;
else
y=i+k;
n+=blifes[x+y*width];
}
n-=blifes[j+i*width]; // 注目セル自身の分を引く
if (rules[n]==-1) // ルールで生死判定
lifes[j+i*width]=0;
else if (rules[n]==1)
lifes[j+i*width]=1;
nlife+=lifes[j+i*width];
}
step++;
}
public void clear() { // セル配列と生物数・世代数クリア
for (int i=0;i<width*height;i++)
lifes[i]=0;
step=0;
nlife=0;
}
}
class CLdisp extends Canvas implements MouseListener { // 表示パネルクラス
private CLdat ldat;
private game_of_life parent;
private Image img;
private Graphics g_img;
private int vr=13;
private int lwid,lhei;
CLdisp(CLdat dat,game_of_life p) {
ldat=dat; // 描画対象のデータクラスを保存
parent=p;
// データクラスの大きさ保存
lwid=ldat.getWidth();
lhei=ldat.getHeight();
setSize(lwid*vr+2,lhei*vr+2);
setBackground(Color.white);
addMouseListener(this);
}
private void drawDat() { // imgに現在のセルの状況を描画
Color cl;
for (int i=0;i<lhei;i++)
for (int j=0;j<lwid;j++) {
// 生物の有無で色を設定
if (ldat.getLife(j,i)==0)
cl=Color.orange;
else
cl=Color.blue;
g_img.setColor(cl);
// 設定した色で(j,i)を塗りつぶす
g_img.fillRect(j*vr+1,i*vr+1,vr-1,vr-1);
}
}
public void paint(Graphics g) {
if (img==null) { // 最初の描画時にイメージ作成
img=createImage(lwid*vr,lhei*vr);
g_img=img.getGraphics();
g_img.setColor(Color.DARK_GRAY);
g_img.fillRect(0,0,lwid*vr,lhei*vr);
}
drawDat(); // 現在の状況をイメージに描画
g.drawImage(img,1,1,this);
}
public void update(Graphics g) { // ちらつき防止のためオーバーライド
paint(g);
}
public void mousePressed(MouseEvent e) {}
public void mouseClicked(MouseEvent e) { // マウスクリック
int x=(int)((e.getX()-1)/vr);
int y=(int)((e.getY()-1)/vr);
if (ldat.getLife(x,y)==0)
ldat.setLife(x,y,(byte)1);
else
ldat.setLife(x,y,(byte)0);
repaint();
parent.drawState();
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
class CRule extends Panel { // ルール設定パネル
Checkbox rchk[][];
CheckboxGroup rchkb[];
Label lb[];
CRule() {
int i,j;
rchk=new Checkbox[3][9];
rchkb=new CheckboxGroup[9];
String str[]=new String[3];
str[0]="O";
str[1]="X";
str[2]="-";
lb=new Label[9];
setBackground(new Color(160,192,192));
setLayout(new GridLayout(9,4,1,2));
for (i=0;i<9;i++) { // チェックボックス作成
lb[i]=new Label(String.valueOf(i),Label.CENTER);
add(lb[i]);
rchkb[i]=new CheckboxGroup();
for (j=0;j<3;j++) {
rchk[j][i]=new Checkbox(str[j],false,rchkb[i]);
add(rchk[j][i]);
}
}
}
public void getRules(int rules[]) {
for (int i=0;i<9;i++)
if (rchk[0][i].getState())
rules[i]=1;
else if (rchk[1][i].getState())
rules[i]=-1;
else
rules[i]=0;
}
public void setRules(int rules[]) {
for (int i=0;i<9;i++)
if (rules[i]==1)
rchk[0][i].setState(true);
else if (rules[i]==-1)
rchk[1][i].setState(true);
else
rchk[2][i].setState(true);
}
}
class game_of_life extends Frame implements ActionListener,Runnable {
CLdat ldat;
Panel pl,vpl;
Label lState;
Button btClose,btNext,btAuto,btClear;
CLdisp disp;
CRule rl;
Thread runner=null;
volatile boolean running=false;
game_of_life() {
setLayout(new BorderLayout());
ldat=new CLdat(64,64);
disp=new CLdisp(ldat,this);
rl=new CRule();
vpl=new Panel();
lState=new Label(" Step:0 life:0");
vpl.setBackground(new Color(160,192,192));
vpl.setLayout(new BorderLayout());
vpl.add(lState,"North");
vpl.add(disp,"Center");
btClose=new Button("Close"); // ボタン生成
btClose.addActionListener(this); // ボタンのイベントリスナ設定
btNext=new Button("Next");
btNext.addActionListener(this);
btAuto=new Button("Auto");
btAuto.addActionListener(this);
btClear=new Button("Clear");
btClear.addActionListener(this);
pl=new Panel(); // 部品配置用パネル生成
pl.setBackground(new Color(160,144,192));
pl.setLayout(new GridLayout(4,1));
pl.add(btNext);
pl.add(btAuto);
pl.add(btClear);
pl.add(btClose);
rl.setRules(ldat.getRules());
add(vpl,"Center");
add(pl,"East"); // パネルをフレーム上に配置
add(rl,"West");
}
public static void main(String args[]) {
game_of_life app=new game_of_life(); // アプリケーション生成
app.pack();
app.setVisible(true);
app.repaint();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==btClose) { // Closeボタンクリックイベント
dispose(); // アプリケーションフレーム破棄
System.exit(0); // 終了
}
if (e.getSource()==btNext) { // Nextボタン
rl.getRules(ldat.getRules());
ldat.next();
drawState();
disp.repaint();
}
if (e.getSource()==btAuto) { // Auto/Stopボタン
if (running) { // 自動更新中
running=false; // 終了フラグリセット
try { // スレッド終了を待つ
runner.join();
} catch (InterruptedException ex) {}
finally {
btAuto.setLabel("Auto");
btClose.setEnabled(true);
btNext.setEnabled(true);
btClear.setEnabled(true);
disp.setEnabled(true);
runner=null;
}
} else { // 自動更新スレッド起動
rl.getRules(ldat.getRules());
running=true;
runner=new Thread(this);
runner.start();
btAuto.setLabel("Stop");
btClose.setEnabled(false);
btNext.setEnabled(false);
btClear.setEnabled(false);
disp.setEnabled(false);
}
}
if (e.getSource()==btClear) { // Clearボタン
ldat.clear(); // データクリア
drawState(); // ステップと生物数表示
disp.repaint(); // セルを再描画
}
}
public void run() { // 自動更新スレッド
while (running) {
ldat.next(); // 1世代更新
// 状態表示
drawState();
Graphics g=disp.getGraphics();
disp.paint(g);
g.dispose();
}
}
public void drawState() {
lState.setText(" Step:"+String.valueOf(ldat.getStep())+" life
game_of_life.zip_game of life_game of life java_game_of_life_lif
版权申诉
121 浏览量
2022-09-19
15:41:50
上传
评论
收藏 3KB ZIP 举报
钱亚锋
- 粉丝: 86
- 资源: 1万+
最新资源
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈