//
/* ----------------------------------------------------------------------------------------------
    and_gate.java	AND回路								ver. 2.00 (JDK 1.02)
    														ueyama@infonet.co.jp  1999.05.05
    														update: 2007.10.02
---------------------------------------------------------------------------------------------- */

import java.applet.Applet;
import java.awt.*;
import java.lang.Math;


public class and_gate extends Applet
{
	int			A=0, B=0, X=0;											// 入出力値
	int			Tx=286, Cx=456;											// 真理値表 表示X座標
	int			Tt[][]={{0,0,0},{0,1,0},{1,0,0},{1,1,1}};				// 真理値表
	Image		Img;
	Graphics	gr;
	
	public void init()
	{
		String bg=getParameter("bgcolor");								// 背景色の読み込み
		int bgc=Integer.valueOf(bg,16).intValue();
		setBackground(new Color(bgc));
		MediaTracker mt=new MediaTracker(this);
		Img=getImage(getCodeBase(), getParameter("figure"));			// gif ファイルの読み込み
		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_p(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=15; h=21; ox=258; oy=  0; break;				// 数値 (大)
			case	 1: w=32; h=21; ox=273; oy=  0; break;				// スイッチ
			case	 2: w=21; h=21; ox=305; oy=  0; break;				// 電球
			case	 3: w= 8; h=11; ox=258; oy= 42; break;				// 数値 (小)
			case	 4: w=28; h=11; ox=274; oy= 42; break;				// OFF/ON
			case	 5: w=28; h=13; ox=258; oy= 64; break;				// 消灯/点灯
			case	 6: w=10; h=12; ox=258; oy= 90; break;				// A, B, X
			case	 7: w=63; h=15; ox=258; oy=102; 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_s()													// 数値、スイッチ、電球の表示
	{
		int	i,j, m=A*2+B+2;
		dsp_p(32,5,0,A,0); dsp_p(32,34,0,B,0); dsp_p(190,20,0,X,0);		// 数値 の表示
		dsp_p(64,82,0,A,1); dsp_p(137,82,0,B,1);						// スイッチ の表示
		dsp_p(220,126,0,X,2);											// 電球 の表示
		dsp_p(322,10,0,0,12); dsp_p(492,10,0,1,13);						// "真理値表", "電球回路" の表示
		gr.setColor(new Color(153,153,153));
		for(i=0;i<6;i++)
		{
			gr.drawLine(Tx,35+i*27,421,35+i*27);						// 真理値表罫線の表示
			gr.drawLine(Cx,35+i*27,591,35+i*27);
			if(i>1)
			{
				for(j=0;j<4;j++)
				{
					gr.drawLine(Tx+j*45,35,Tx+j*45,170);				// 真理値表罫線の表示
					gr.drawLine(Cx+j*45,35,Cx+j*45,170);
					if(j<3) dsp_p(Tx+j*45+17,42,j,0,6);					// "A","B","X" の表示
					if(j<3) dsp_p(Cx+j*45+17,42,j,0,6);
				}
				dsp_p(Tx+0*45+17,70+(i-2)*27,(m==i)?1:0,Tt[i-2][0],3);	// A の表示 (真理値表)
				dsp_p(Tx+1*45+17,70+(i-2)*27,(m==i)?1:0,Tt[i-2][1],3);	// B の表示     〃
				dsp_p(Tx+2*45+17,70+(i-2)*27,(m==i)?1:0,Tt[i-2][2],3);	// X の表示     〃
				dsp_p(Cx+0*45+8, 70+(i-2)*27,(m==i)?1:0,Tt[i-2][0],4);	// A の表示 (電球回路)
				dsp_p(Cx+1*45+8, 70+(i-2)*27,(m==i)?1:0,Tt[i-2][1],4);	// B の表示     〃
				dsp_p(Cx+2*45+8, 70+(i-2)*27,(m==i)?1:0,Tt[i-2][2],5);	// X の表示     〃
			}
		}
	}
	
	public void paint(Graphics g)
	{
		g.clearRect(0,0,size().width,size().height);
		Graphics gx=gr.create();
		gx.clipRect(0,0,257,177);
		gx.drawImage(Img,0,0,this);
		gx.dispose();
		dsp_s();
	}
	
	public boolean mouseDown(Event e, int x, int y)
	{
		int	m=0, n=(y>62)?(y-62)/27:-1;									// n はクリックされた真理値表の行数
		if(inside(x, 20, 85) && inside(y, 0, 30)) m=1;					// 入力 A をクリック
		if(inside(x, 20, 85) && inside(y,30, 60)) m=2;					// 入力 B をクリック
		if(inside(x, 60,100) && inside(y,80,114)) m=1;					// スイッチ A をクリック
		if(inside(x,132,172) && inside(y,80,114)) m=2;					// スイッチ B をクリック
		if((inside(x,Tx,Tx+135) || inside(x,Cx,Cx+135)) && inside(n,0,3))	// 真理値表をクリック
		{
			A=Tt[n][0]; B=Tt[n][1]; X=Tt[n][2]; m=3;					// A, B, X 値の処理
		}
		if(m>0)															// 入力, スイッチをクリック時の処理
		{
			if(m==1) A=(A==0)?1:0;
			if(m==2) B=(B==0)?1:0;
			X=(A+B==2)?1:0;
			dsp_s();
		}
		return true;
	}
}
//
戻る