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