import java.applet.Applet;
import java.awt.*;
public class Game extends Applet {
MediaTracker mt;
Image pict[] = new Image[7] ; // 絵を入れる配列
Image back ; // カードの裏の絵を入れる変数
int count = 0; // ひっくり返されたカードの枚数
int openCard[] = new int[2]; // ひっくり返された2枚のカード番号
int stat[] = new int[12]; // カードの状態(0:裏、1:ひっくり返された、2:表のまま)
int card[] = new int[12]; // カードの配列(セットされた絵の番号が入る)
int x[] = new int[12]; // カードのx座標
int y[] = new int[12]; // カードのy座標
int cardWidth = 32, cardHeight = 32; // カードの幅、高さ
public void init(){
int i ,j; // カウンター
int k; // カード番号
int yy; // 段毎のy座標
mt = new MediaTracker(this);
/* イメージファイルの読み込み */
back = getImage(getCodeBase(), "back.gif");
for( i = 0 ; i < 7 ; i++ ){
pict[i] = getImage(getCodeBase(), "img" + (i) + ".gif");
mt.addImage(pict[i],0);
}
try{
mt.waitForID(0);
} catch (InterruptedException e) {
return;
}
/* カードの位置(x、y座標)の設定 */
k = 0;
for( i = 0 ; i < 3 ; i++ ){
yy = i * cardHeight + 5;
for( j = 0 ; j < 4 ; j++ ){
x[k] = j * cardWidth + 5 ;
y[k] = yy;
k = k + 1;
}
}
/* カードをセットする */
shuffle();
}
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g){
int i; // カウンター
/* バックをオレンジで塗る */
g.setColor(Color.pink);
g.fillRect(0,0,223,106);
/* タイトルの描画 */
g.setColor(Color.blue);
g.drawString("アンパンマン", 138, 30);
/* カードの描画 */
for( i = 0 ; i < 12 ; i++ ){
if ( stat[i] == 0 ) {
/* statが0だったら裏の絵を描く */
g.drawImage( back, x[i], y[i], this);
} else {
/* セットされている絵を描く */
g.drawImage( pict[card[i]], x[i], y[i], this);
}
}
/* SHUFFLEボタンの描画 */
g.setColor(Color.white);
g.fillRect( 138, 70, 65, 25 );
g.setColor(Color.black);
g.drawString("SHUFFLE", 145, 88);
}
public boolean mouseDown(java.awt.Event evt, int ix, int iy){
int i; // カウンター
int row, col; // マウスが押された位置(行、列)
int nn; // ひっくり返すカードの番号
/* 1枚目のカードをひっくり返す前の処理 */
if ( count == 0 ) {
for( i = 0 ; i < 12 ; i++ ) {
if ( stat[i] == 1 ) {
/* 前回ひっくり返されたカードを裏に戻す */
/* (前回一致したカードは表のまま残す) */
stat[i] = 0;
repaint(x[i], y[i], 32, 32);
}
}
}
if ( ix > 138 && ix < 203 && iy > 70 && iy < 95 ) {
/* マウスの座標(ix,iy)がSHUFFLEボタン内 */
/* だったらカードをセットし直す */
shuffle();
repaint();
return true; // このメソッドを抜ける
}
/* マウスで何列目が押されたか */
col = 0;
if( ix > cardWidth + 5 ) col = 1;
if( ix > cardWidth * 2 + 5 ) col = 2;
if( ix > cardWidth * 3 + 5 ) col = 3;
if( ix > cardWidth * 4 + 5 ) col = -1;
if( col < 0 ) return true; // カードの無い場所だったらこのメソッドを抜ける
/* マウスで何行目が押されたか */
row = 0;
if( iy > cardHeight + 5 ) row = 1;
if( iy > cardHeight * 2 + 5 ) row = 2;
if( iy > cardHeight * 3 + 5 ) row = -1;
if( row < 0 ) return true; // カードの無い場所だったらこのメソッドを抜ける
/* ひっくり返すカード番号の計算 */
nn = row * 4 + col;
/* カードが裏でなかったらこのメソッドを抜ける */
if( stat[nn] != 0 ) return true;
/* カードをひっくり返す */
openCard[count] = nn; // どのカードが開けられたかセットする
stat[nn] = 1; // カードの状態を「ひっくり返す」にする
repaint(x[nn], y[nn], 32, 32);
/* 2枚目のカードをひっくり返したときの処理 */
if ( count == 1 ) {
if ( card[openCard[0]] == card[openCard[1]] ) {
/* 絵が一致したらカードの状態を表に固定する */
stat[openCard[0]] = 2;
stat[openCard[1]] = 2;
}
}
/* 現在何枚のカードがひっくり返されたか */
count = count + 1;
if ( count == 2 ) {
count = 0;
}
return true;
}
public void shuffle(){
int i, k; // カウンター
int notuse; // 使わない絵の番号
int no ; // 入れ替えるカードの位置
int work; // 入れ替えに使うワーク変数
/* 変数の初期化 */
count = 0; // ひっくり返されたカードは0枚
for( i = 0 ; i < 12 ; i++ ){
stat[i] = 0; // カードをすべて裏の状態に戻す
}
/* 使用しない絵を乱数で決める */
notuse = (int)( Math.random() * (float)(7) );
/* カードに絵の番号をセットする */
k = 0;
for( i = 0 ; i < 7 ; i++ ){
if ( i != notuse ) {
/* notuse以外の絵の番号をセット */
card[k] = i;
card[k+1] = i;
k = k + 2;
}
}
/* カードの順番を入れ替える */
/* カードの枚数だけループ */
for( k = 0 ; k < 12 ; k++ ){
/* 乱数で入れ替えるカードを決める */
no = (int)( Math.random() * (float)(12) );
/* カードの入れ替え */
work = card[k];
card[k] = card[no];
card[no] = work;
}
}
}
これは、神経衰弱ゲームです。マウスで押すとカードがひっくり返って絵が出ます。絵は、私のイメージキャラクタ(?)のアンパンマンを使いました。キャラクタの絵は、7枚あります。 SHUFFLEボタンを押すと、絵の位置が入れ替わるだけでなく、さっきはなかったキャラクタが出てきます。