//
/* ----------------------------------------------------------------------------------------------
    half_adder.java	半加算器演習							ver. 1.01 (JDK 1.02)
    														ueyama@infonet.co.jp  2007.03.06
---------------------------------------------------------------------------------------------- */

import java.applet.*;
import java.awt.*;


public class half_adder extends Applet
{
//						 'd'       'e'       'f'       'g'        'C'       'S'
	int			Cor[][]={{1,0,1,0},{1,1,0,0},{0,0,1,0},{0,1,0,0},{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},{2,2,2,2}};	// 回答
	int			Clo[]={2,2,2,2,2,2};													// 列回答完了
	int			Fin=2;																	// 全回答完了
	int			Xx[]={247, 288, 247, 261, 302, 343, 357, 316, 357, 343, 302, 261, 247};	// '×' 表示 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=483; oy=  0;	break;		// 0 or 1
			case	 1:	w= 26; h= 23; ox=483; 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<6; 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,483,189);
		g.drawImage(Img, 0, 0, this);
		dsp_bin(0);
		dsp_g(498,130, Fin, 0, 1);									// 「○×」の表示
		dsp_g(498,161, Fin, 1, 1);									// 「?」の表示
		for(int i=0; i<6; 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, 483) && 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(498,130, Fin, 0, 1);								// 「○×」の表示
			dsp_g(498,161, Fin, 1, 1);								// 「?」の表示
			for(i=0; i<6; i++) dsp_g(134+60*i,200, Clo[i], 1, 1);	// 「?」の表示
		}
		else if(inside(x, 498, 524) && inside(y, 130, 184) && Fin==0)	// ボタンを押す
		{
			k=0;													// 誤答数
			for(i=0; i<6; 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(498,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(247+i,71+i,109-2*i,109-2*i); // きれいに塗りつぶせないので、
								gr.drawOval(247+i,72+i,109-2*i,109-2*i); // ずらせて描く
								gr.drawOval(248+i,71+i,109-2*i,109-2*i); // ずらせて描く
							}
						}
				Clr=true;
			}
			else dsp_g(498,161, 1, 1, 1);							// 「?」の緑表示
		}
		else if(inside(x, 134, 482) && 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(498,130, Fin, 0, 1);
		dsp_g(498,161, Fin, 1, 1);
		dsp_g(134+60*Qx,200, Clo[Qx], 1, 1);
		return true;
	}
}
//
戻る