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