//
/* ---------------------------------------------------------------------------------------------- adder_4bit.java 4ビット加算器 ver. 1.00 (JDK 1.02) ueyama@infonet.co.jp 2005.01.12 update: 2007.08.02 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; public class adder_4bit extends Applet { int A=0, B=0; int P[] = {0,5,2,1,1,0,5,1,2,1,5,4,1,2,1,5,3,1,1,2}; // 表示回路部品 // 0: スイッチ A 1: コイル A 2: 接点 A(b) 3: 接点 A(a) 4: 接点 A(a) // 5: スイッチ B 6: コイル B 7: 接点 B(a) 8: 接点 B(b) 9: 接点 B(a) // 10: コイル C 11: 電球 C 12: 接点 C(a) 13: 接点 C(b) 14: 接点 C(a) // 15: コイル S 16: 電球 S 17: 接点 S(a) 18: 接点 S(a) 19: 接点 S(b) int L[][]= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, // 各部品データ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; int X0[] = {571, 383, 195, 7}; // 表示基準座標値 int X[] = { 33,112, 16, 16, 16, 33,112, 52, 52, 52,112,112, 16, 16, 16,112,112, 52, 52, 52}; // X 座標 int Y[] = { 34, 34,127,163,208, 79, 79,127,163,208,205,245,248,289,326,142,304,248,289,326}; // Y 座標 int Xb=320, Yb=362; // 2進数表示基準 X,Y 座標 Image Img; 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")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; } 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 n, int c) { int w=0, h=0, ox=0, oy=0; switch(c) { case 0: w= 25; h=15; ox=745; oy= 0; break; // 押しボタンスイッチ case 1: w= 25; h=17; ox=745; oy= 30; break; // a接点 case 2: w= 25; h=17; ox=745; oy= 64; break; // b接点 case 3: w= 22; h=22; ox=745; oy= 98; break; // 電球 S case 4: w= 22; h=22; ox=745; oy=142; break; // 電球 C case 5: w= 22; h=22; ox=745; oy=186; break; // リレーコイル case 6: w= 26; h=25; ox=745; oy=230; break; // 2進数 case 7: w= 19; h=18; ox=745; oy=287; break; // キャリー case 8: w= 17; h=17; ox=745; oy=323; break; // + case 9: w= 62; h= 1; ox=573; oy=346; break; // line case 10: w= 17; h=30; ox=770; oy= 0; break; // C,A,B,S case 11: w= 26; h=23; ox=770; oy=120; break; // クリアボタン } Graphics gx=getGraphics(); gx.clipRect(x,y,w,h); gx.clearRect(x,y,w,h); gx.drawImage(Img,x-ox,y-(oy+n*h),this); gx.dispose(); } public boolean dspchk(int i, int j) // 表示不要部品のチェック { if((i==0 && (inside(j,12,14) || j==15 || inside(j,17,19))) || (i==3 && j==10)) return false; else return true; } public void dsp_p(int i, int n) { int j,k,x,y; for(j=0; j<20; j++) // 回路図部品の表示 { k=(i>0 && inside(j,12,14))?i-1:i; x=X0[i]+X[j]; y=Y[j]; if(i==0 && (j==1 || j==6 || j==10 || j==11 || j==16)) x+=12;// 例外処理(コイル、電球を右に寄せる) if(dspchk(i,j)) dsp_g(x, y, L[k][j], P[j]); } dsp_g(Xb+(3-i)*32, Yb+24, L[i][0], 6); // 2進数 A の表示 dsp_g(Xb+(3-i)*32, Yb+53, L[i][5], 6); // 2進数 B の表示 dsp_g(Xb+(3-i)*32, Yb+96, L[i][16], 6); // 2進数 S の表示 dsp_g(Xb-32, Yb+96, (L[3][10]==0)?2:1, 6); // 2進数 S4の表示 dsp_g(Xb+(2-i)*32+3, Yb, L[i][10], 7); // 2進数 キャリーの表示 dsp_g(280, 423, 0, 8); // + の表示 for(j=0; j<3; j++) dsp_g(267+62*j, 450, 0, 9); // 直線 の表示 for(j=0; j<4; j++) dsp_g(230, 355+32*j, j,10); // 文字 C,A,B,S の表示 if(n>0) dsp_g(493, 386, (A==0)?2:0, 11); // クリアボタン の表示 if(n>0) dsp_g(493, 386+32, (B==0)?2:0, 11); // クリアボタン の表示 } public void sum_ab(int i) { for(int n=i; n<4; n++) { L[n][15]=L[n][16]=(L[n][0]+L[n][5]==1)?1:0; // リレー S if(n==0) L[n][10]=(L[n][0]+L[n][5]==2)?1:0; // リレー C else { L[n][10]=((L[n][0]+L[n][5]==2) || (L[n][15]+L[n-1][10]==2))?1:0; // リレー C L[n][16]=(L[n][15]+L[n-1][10]==1)?1:0; // 電球 S } L[n][ 1]=L[n][ 2]=L[n][ 3]=L[n][ 4]=L[n][ 0]; // A L[n][ 6]=L[n][ 7]=L[n][ 8]=L[n][ 9]=L[n][ 5]; // B L[n][11]=L[n][12]=L[n][13]=L[n][14]=L[n][10]; // C L[n][17]=L[n][18]=L[n][19]=L[n][15]; // S } A=L[3][0]*8+L[2][0]*4+L[1][0]*2+L[0][0]; B=L[3][5]*8+L[2][5]*4+L[1][5]*2+L[0][5]; for(int n=i; n<4; n++) dsp_p(n,1); } public void paint(Graphics g) { int i; g.clearRect(0, 0, size().width, size().height); g.drawImage(Img, 0, 0, this); for(i=0; i<4; i++) dsp_p(i,1); } public boolean mouseDown(Event e, int x, int y) { int i=3-(x-35)/188, j=X0[i]+112, k=-1; // 188 は表示ピッチ if(((inside(x%188, 35, 71) || inside(x, j, j+34)) && inside(y, 29, 57)) // スイッチ A || (inside(x, 316, 444) && inside(y, 383, 415))) // 2進数 A { if(y>=383) i=3-(x-316)/32; L[i][0]=(L[i][0]==0)?1:0; k=1; } if(((inside(x%188, 35, 71) || inside(x, j, j+34)) && inside(y, 74, 102)) // スイッチ B || (inside(x, 316, 444) && inside(y, 416, 448))) // 2進数 B { if(y>=416) i=3-(x-316)/32; L[i][5]=(L[i][5]==0)?1:0; k=1; } if(inside(x, 493, 519) && inside(y, 386, 441)) // クリアボタン { if(A>0 && inside(y, 386, 409)) // A をクリア { dsp_g(493, 386, 1, 11); A=k=L[0][0]=L[1][0]=L[2][0]=L[3][0]=0; } if(B>0 && inside(y, 418, 441)) // B をクリア { dsp_g(493, 386+32, 1, 11); B=k=L[0][5]=L[1][5]=L[2][5]=L[3][5]=0; } } if(k>=0) sum_ab((k==0)?0:i); return true; } public boolean mouseUp(Event e, int x, int y) { if(inside(x, 493, 519)) { if(inside(y, 386, 409)) dsp_g(493, 386 , 2, 11); if(inside(y, 418, 441)) dsp_g(493, 386+32, 2, 11); } return true; } } //戻る