//
/* ----------------------------------------------------------------------------------------------
logics.java 論理回路組合せ演習 ver. 1.01 (JDK 1.02)
ueyama@infonet.co.jp 2007.03.06
---------------------------------------------------------------------------------------------- */
import java.applet.*;
import java.awt.*;
public class logics extends Applet
{
int d[] ={2,2,2,2,2,2,2,2};
int X[] ={2,2,2,2,2,2,2,2};
int da[]=new int[8];
int Xa[]=new int[8];
int Lg;
int Fin=2;
int X_x[]={0, 41, 0, 14, 55, 96, 110, 69, 110, 96, 55, 14, 0}; // '×' 表示座標データ
int X_y[]={14, 55, 96, 110, 69, 110, 96, 55, 14, 0, 41, 0, 14}; // '×' 表示座標データ
int Xx[]=new int[13], Xy[]=new int[13]; // 同上
boolean Sc =true;
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));
String vds=getParameter("sol_d"); // 真理値表データの読み取り 'd'
int vd=Integer.valueOf(vds,16).intValue();
for(int i=7; i>0; i--){da[i]=vd % 2; vd/=2;}
vds=getParameter("sol_X"); // 真理値表データの読み取り 'X'
vd=Integer.valueOf(vds,16).intValue();
for(int i=7; i>0; i--){Xa[i]=vd % 2; vd/=2;}
vds=getParameter("logic"); // 論理式 No. 0: or_or 1: or_and
Lg=Integer.valueOf(vds,16).intValue(); // 2: and_or 3: and_and
String s=getParameter("check"); // 自己チェック用ボタン表示の指定
if(s.equals("0")) Sc=false;
for(int i=0; i<13; i++) {Xx[i]=X_x[i]+251; Xy[i]=X_y[i]+134;} // '×' 表示座標の換算
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=385; oy= 60; break; // 0 or 1
case 1: w= 39; h= 15; ox=385; oy= 0; break; // 論理式
case 2: w= 26; h= 23; ox=385; oy= 94; 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) // 真理値表 0,1 の表示
{
int i,k=0;
for(i=0; i<8; i++)
{
if(d[i]<2) dsp_g(261, 72+31*i, d[i]==0?0:1, n, 0); // 'd' の表示
else k++;
if(X[i]<2) dsp_g(337, 72+31*i, X[i]==0?0:1, n, 0); // 'X' の表示
else k++;
}
Fin=(k>0)?2:0;
}
public void paint(Graphics g)
{
g.clearRect(0,0,size().width,size().height);
g.clipRect(0,0,385,315);
g.drawImage(Img, 0, 0, this);
dsp_g(249, 42, 0, Lg, 1); // 真理値表 論理式の表示
dsp_g(325, 42, 1, Lg, 1);
dsp_bin(0);
if(Sc) dsp_g(400,260, Fin, 0, 2); // 「!」の表示
if(Sc) dsp_g(400,291, Fin, 1, 2); // 「?」の表示
}
public boolean mouseDown(Event e, int x, int y)
{
int i,m;
if(Clr)
{
Graphics gx=gr.create();
paint(gx);
gx.dispose();
Clr=false;
}
if(inside(x, 230, 382) && y>65) // 0,1 の入力
{
m=(x-230)/76; i=(y-65)/31;
if(m==0) d[i]=(d[i]==0)? 1:0;
if(m==1) X[i]=(X[i]==0)? 1:0;
dsp_bin(0);
if(Sc) dsp_g(400,260, Fin, 0, 2); // 「!」の表示
if(Sc) dsp_g(400,291, Fin, 1, 2); // 「?」の表示
}
else if(inside(x, 400, 426) && inside(y, 260, 309) && Fin==0 && Sc) // ボタンを押す
{
m=0; // 誤答数
for(i=0; i<8; i++)
{
if(y>286) // 「?」
{
dsp_g(261, 72+31*i, d[i], d[i]==da[i]?0:1, 0); // 誤答部を赤表示
dsp_g(337, 72+31*i, X[i], X[i]==Xa[i]?0:1, 0);
}
if(d[i]!=da[i]) m++;
if(X[i]!=Xa[i]) m++;
}
if(inside(y, 260, 286)) // 「!」
{
dsp_g(400,260, 1, 0, 2); // 「!」の緑表示
gr.setColor(new Color(255,170,155));
if(m>0) {
Boouu.play();
gr.fillPolygon(Xx, Xy, Xx.length);
}
else {
Pinpon.play();
for(i=0; i<20; i++)
{
gr.drawOval(251+i,134+i,109-2*i,109-2*i); // きれいに塗りつぶせないので、
gr.drawOval(251+i,135+i,109-2*i,109-2*i); // ずらせて描く
gr.drawOval(252+i,134+i,109-2*i,109-2*i); // ずらせて描く
}
}
Clr=true;
}
else dsp_g(400,291, 1, 1, 2); // 「?」の緑表示
}
return true;
}
public boolean mouseUp(Event e, int x, int y)
{
if(Sc) dsp_g(400,260, Fin, 0, 2);
if(Sc) dsp_g(400,291, Fin, 1, 2);
return true;
}
}
//戻る