//
/* ----------------------------------------------------------------------------------------------
half_adder1.java 半加算器演習 (2) ver. 1.01 (JDK 1.02)
ueyama@infonet.co.jp 2007.03.06
---------------------------------------------------------------------------------------------- */
import java.applet.*;
import java.awt.*;
public class half_adder1 extends Applet
{
// 'd' 'e' 'f' 'C' 'S'
int Cor[][]={{1,1,1,0},{1,1,0,1},{1,0,1,1},{0,0,0,1},{0,1,1,0}}; // 正解
int Ans[][]={{2,2,2,2},{2,2,2,2},{2,2,2,2},{2,2,2,2},{2,2,2,2}}; // 回答
int Clo[]={2,2,2,2,2}; // 列回答完了
int Fin=2; // 全回答完了
int Xx[]={217, 258, 217, 231, 272, 313, 327, 286, 327, 313, 272, 231, 217}; // '×' 表示 X座標データ
int Xy[]={ 85, 126, 167, 181, 140, 181, 167, 126, 85, 71, 112, 71, 85}; // '×' 表示 Y座標データ
int Qx;
boolean Clr=false;
AudioClip Pinpon, Boouu;
Image Img;
Graphics gr;
public void init()
{
String bg=getParameter("BgColor");
int bgc=Integer.valueOf(bg,16).intValue();
setBackground(new Color(bgc));
Pinpon=getAudioClip(getCodeBase(), "pinpon.au");
Boouu=getAudioClip(getCodeBase(), "boouu.au");
MediaTracker mt=new MediaTracker(this);
Img=getImage(getCodeBase(), getParameter("figure"));
mt.addImage(Img, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
gr=getGraphics();
}
public boolean inside(int x, int a, int b)
{
return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
}
public void dsp_g(int x, int y, int m, int n, int c) // 図や文字を描く
{
Graphics gx=gr.create();
int w=0, h=0, ox=0, oy=0;
switch(c)
{
case 0: w= 14; h= 17; ox=423; oy= 0; break; // 0 or 1
case 1: w= 26; h= 23; ox=423; oy= 34; break; // ボタン
}
gx.clipRect(x,y,w,h);
gx.clearRect(x,y,w,h);
gx.drawImage(Img, x-(ox+m*w), y-(oy+n*h), this);
gx.dispose();
}
public void dsp_bin(int n) // 回答の表示
{
int i,j,k=0,l=0;
for(i=0; i<5; i++)
{
l=0;
for(j=0; j<4; j++)
{
if(Ans[i][j]<2) {dsp_g(144+60*i, 71+31*j, Ans[i][j]==0?0:1, n, 0);} // 回答の表示
else {k++; l++;}
}
Clo[i]=(l>0)?2:0;
}
Fin=(k>0)?2:0;
}
public void paint(Graphics g)
{
g.clearRect(0,0,size().width,size().height);
g.clipRect(0,0,423,189);
g.drawImage(Img, 0, 0, this);
dsp_bin(0);
dsp_g(438,130, Fin, 0, 1); // 「○×」の表示
dsp_g(438,161, Fin, 1, 1); // 「?」の表示
for(int i=0; i<5; i++) dsp_g(134+60*i,200, Clo[i], 1, 1);
}
public boolean mouseDown(Event e, int x, int y)
{
int i,j,k;
if(Clr)
{
Graphics gx=gr.create();
paint(gx);
gx.dispose();
Clr=false;
}
if(inside(x, 120, 423) && inside(y, 62, 188)) // 0,1 の入力
{
i=(x-120)/60; j=(y-62)/31;
Ans[i][j]=(Ans[i][j]==0)? 1:0;
dsp_bin(0);
dsp_g(438,130, Fin, 0, 1); // 「○×」の表示
dsp_g(438,161, Fin, 1, 1); // 「?」の表示
for(i=0; i<5; i++) dsp_g(134+60*i,200, Clo[i], 1, 1); // 「?」の表示
}
else if(inside(x, 438, 464) && inside(y, 130, 184) && Fin==0) // ボタンを押す
{
k=0; // 誤答数
for(i=0; i<5; i++)
{
for(j=0; j<4; j++)
{
if(inside(y,161,184)) // 「?」
{
dsp_g(144+60*i, 71+31*j, Ans[i][j], Ans[i][j]==Cor[i][j]?0:1, 0); // 誤答部を赤表示
}
if(Ans[i][j]!=Cor[i][j]) k++;
}
}
if(inside(y, 130, 153)) // 「○×」
{
dsp_g(438,130, 1, 0, 1); // 「○×」の緑表示
gr.setColor(new Color(255,170,155));
if(k>0) {
Boouu.play();
gr.fillPolygon(Xx, Xy, Xx.length);
}
else {
Pinpon.play();
for(i=0; i<20; i++)
{
gr.drawOval(217+i,71+i,109-2*i,109-2*i); // きれいに塗りつぶせないので、
gr.drawOval(217+i,72+i,109-2*i,109-2*i); // ずらせて描く
gr.drawOval(218+i,71+i,109-2*i,109-2*i); // ずらせて描く
}
}
Clr=true;
}
else dsp_g(438,161, 1, 1, 1); // 「?」の緑表示
}
else if(inside(x, 134, 422) && y>200) // 「○×」
{
i=x-134;
if(i%60 < 26 && Clo[i/60]==0)
{
i/=60; Qx=i;
for(j=0; j<4; j++)
{
dsp_g(144+60*i, 71+31*j, Ans[i][j], Ans[i][j]==Cor[i][j]?0:1, 0);
}
dsp_g(134+60*i,200, 1, 1, 1); // 「?」の緑表示
}
}
else dsp_bin(0);
return true;
}
public boolean mouseUp(Event e, int x, int y) // 「?」の緑表示を元に戻す
{
dsp_g(438,130, Fin, 0, 1);
dsp_g(438,161, Fin, 1, 1);
dsp_g(134+60*Qx,200, Clo[Qx], 1, 1);
return true;
}
}
//戻る