JAVAのソースを公開しています。
このゲームは三つのファイルから出来ています。
- cellbom2.java メインのファイルです。
- sysMap.java キャンバスのクラスです。ここに画像が張られています。
- mapdata.java マップのデータが入ってます。
cellbom2.java
/***********************************************************************
CELL BOM 2
森田浩喜 平成11年6月13日
***********************************************************************/
import java.awt.*;
import java.applet.*;
import sysMap;
public class cellbom2 extends Applet implements Runnable
{
Thread g_thread = null;
int gi_sleeptime = 300;
int i =0,ii=0;
private Image g_offscreanImage;
private Graphics g_offscreanGC;
private Image[] g_image = new Image[3];
private MediaTracker g_MediaTracker ;
static final int g_MDID = 1;
private boolean gb_issecure; //実行許可
private boolean gb_isPlaying; //プレイ中
private boolean gb_isLoadOK; //画像のロード済み
private boolean gb_isWindo; //メッセージ表示
private boolean gb_isGOing; //実行中
private sysMap g_SysMap;
private final String gstr_STRAT = "RESET";
private final String gstr_sinka = "進化";
private final String gstr_dai = "代目";
private Button g_STbutton; // スタートボタン
private Button g_sinbutton; // 進化ボタン
private Label g_label;
private int gi_sedai=0; //世代カウント
private int g_kaisu =0;
private int posX,posY;
int kaisu =0;
//丸の配置状況
public int[][][] eraebase = new int[3][20][20];
//丸のマスク
int[][] mask = {{1,1,1},{1,0,1},{1,1,1}};
public void init()
{
// Take out this line if you don't use symantec.itools.net.RelativeURL or symantec.itools.awt.util.StatusScroller
//symantec.itools.lang.Context.setApplet(this);
// This code is automatically generated by Visual Cafe when you add
// components to the visual environment. It instantiates and initializes
// the components. To modify the code, only use code syntax that matches
// what Visual Cafe can generate, or Visual Cafe may be unable to back
// parse your Java file into its visual environment.
//{{INIT_CONTROLS
setLayout(new BorderLayout(0,0));
setSize(400,450);
setBackground(new Color(12632256));
//}}
gb_isPlaying =true; //プレイ中じゃない
gb_isLoadOK = false; //ロード未完
gb_issecure = true; //実行可能
g_SysMap = new sysMap(400,400);
for (int index = 0;index=40 && yy>=40)
{
if (base[0][posX][posY]==1)
{
kaisu--;
base = dellboll(posX,posY,base);
}
else if (base[0][posX][posY]==0)
{
base = setboll(posX,posY,1,base);
kaisu++;
}
}
}
return base;
//g_SysMap.setbackstage(eraebase);
}
/**
* ボールをセットする
*
*/
private int[][][] setboll(int x,int y,int z,int[][][] base)
{
//System.out.println( "--- set boll "+Integer.toString(z)+" ---");
base[0][x][y] = z;
//if (z==1)
{
base[1][x][y] = z;
}
return base;
}
/**
* ボールを消す
*/
private int[][][] dellboll(int x,int y,int[][][] base)
{
base[0][x][y] = 0;
base[1][x][y] = 0;
return base;
}
/**
*..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':
*
* アクションイベント取得
*..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':
*/
public boolean action(Event evt,Object ojt)
{
if(evt.target instanceof Button)
{
Button l_button = (Button)evt.target;
if(gstr_sinka.equals(l_button.getLabel()))
{
g_sinbutton_ActionPerformed();
}
else if(gstr_STRAT.equals(l_button.getLabel()))
{
g_STbutton_ActionPerformed();
}
}
return false;
}
/*
* 変化するマスを調べる
*
*/
void g_sinbutton_ActionPerformed()
{
eraebase = g_SysMap.passBase();
//一度スタートしたら置き直し出来ない
gb_isGOing = true;
g_STbutton.setEnabled(true);
//世代を1増やす
gi_sedai++;
String str_hyoji = Integer.toString(gi_sedai)+gstr_dai;
g_label.setText(str_hyoji);
//自分の周りのセルの数
int kazu=0;
for (int i=0;i<20;i++)
{
for (int j=0;j<20;j++)
{
for (int x=0;x<3;x++)
{
for (int y=0;y<3;y++)
{
kazu = kazu + eraebase[0][(i+x-1+20)%20][(j+y-1+20)%20]*mask[x][y];
}
}
if (eraebase[0][i][j]==0)
{
if (kazu==3 ) //まわりに3で出現
{
eraebase[1][i][j] = 1;
}
if (30 <= kazu && kazu <= 39) //癌細胞は 30 代で発生
{
eraebase[1][i][j] = 10;
}
}
else if (eraebase[0][i][j]==1)
{
if (kazu <= 1 || kazu >= 4 ) //4 以上 1 以下で消える
{
eraebase[1][i][j] =2;
}
}
else if (eraebase[0][i][j]==10) //癌細胞は 4 以上で消える
{
if(kazu >= 40 || kazu%10 != 0)
{
eraebase[1][i][j] =2;
}
}
kazu=0;
}
}
lookHairetu();
//repaint();
//制限リセット
kaisu = 0;
g_SysMap.setbackstage(eraebase);
}
/**
*..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':
* 配列を見てボールを置いたり消したり
*..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':
*/
protected void lookHairetu()
{
for (int i=0;i<20;i++)
{
for (int j=0;j<20;j++)
{
if (eraebase[1][i][j] == 1)
{
//ボールを置く
eraebase = setboll(i,j,1,eraebase);
}
else if (eraebase[1][i][j] ==10)
{
//癌細胞を置く
eraebase = setboll(i,j,2,eraebase);
}
else if (eraebase[1][i][j] ==2)
{
//ボールを消す
eraebase = dellboll(i,j,eraebase);
}
eraebase[1][i][j] =0;
}
}
// repaint();
}
/**
*..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':
* リセットボタン
*..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':..*.:'゜☆゜':
*/
void g_STbutton_ActionPerformed()
{
//世代を戻す
gi_sedai = 0;
String str_hyoji = Integer.toString(gi_sedai)+gstr_dai;
g_label.setText(str_hyoji);
eraebase = g_SysMap.setstage(1);
g_SysMap.setbackstage(eraebase);
//セルをおけるように戻す
gb_isPlaying = true;
gb_isGOing = false;
g_sinbutton.setEnabled(true);
}
}
sysMap.java
mapdata.java
ライフゲーム
戻る
トップへ