//
/* ----------------------------------------------------------------------------------------------
    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;
	}
}
//
戻る