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