//
/* ---------------------------------------------------------------------------------------------- add_ws.java 2進数の加算 (演習) ver. 1.01 (JDK 1.02) ueyama@infonet.co.jp 2007.04.04 ---------------------------------------------------------------------------------------------- */ import java.applet.*; import java.awt.*; import java.util.*; public class add_ws extends Applet { int Exe[][]=new int[3][9]; // 被加数[0]・加数[1]・和[2] の2進形式データ int Dgt[]={0,0,0}; // 被加数[0]・加数[1]・和[2] の桁数 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,2,2,2}}; // 回答 int Aug, Add, Sum; // 被加数, 加数, 和 int Dmx; // 桁数の最大値 int Ax[]=new int[3]; // 数値の表示X座標 int Bx; //「○×」「?」の表示X座標 int Dx; // 基準X座標 int Fin=2; // Fin==0: 入力完了 int Xx[]={0, 41, 0, 14, 55, 96, 110, 69, 110, 96, 55, 14, 0}; // '×' 表示x座標データ int Xy[]={14, 55, 96, 110, 69, 110, 96, 55, 14, 0, 41, 0, 14}; // '×' 表示y座標データ int X_x[]=new int[13], X_y[]=new int[13]; // 同上 boolean Sc =true; //「○×」「?」ボタンの表示 boolean Ac =true; // true: 音を出す boolean Ae =false; // 加数 Add の入力・編集モード boolean Clr=false; boolean Com=false; // true: 正解 boolean Da=false; // true:「?」ボタンが押された AudioClip Pinpon, Boouu; Image Img; Graphics gr; public void init() { int i,n; String s,bg,vds; Random rnd=new Random(); bg=getParameter("BgColor"); n=Integer.valueOf(bg,16).intValue(); setBackground(new Color(n)); vds=getParameter("augend"); // ** 被加数データの読み取り 'Aug' Aug=Integer.valueOf(vds,16).intValue(); if(Aug==0) Aug=Math.abs(rnd.nextInt())%255+1; // 0 のときは被加数を乱数で発生させる for(i=0,n=Aug; i<8; i++){Exe[0][i]=n % 2; n/=2;} // 被加数の2進形式データ for(i=Aug,Dgt[0]=0; i>0; i/=2) Dgt[0]++; // 被加数の桁数 vds=getParameter("addend"); // ** 加数データの読み取り 'Add' Add=Integer.valueOf(vds,16).intValue(); if(Add==0) Add=Math.abs(rnd.nextInt())%255+1; // 0 のときは加数を乱数で発生させる if(Add<0) { Ae=true; // 加数 Add の入力・編集モード Add*=-1; // Add は負の数で指定されている } for(i=0,n=Add; i<8; i++){Exe[1][i]=n % 2; n/=2;} // 加数の2進形式データ for(i=Add,Dgt[1]=0; i>0; i/=2) Dgt[1]++; // 加数の桁数 s=getParameter("check"); //「○×」「?」ボタンの表示 if(s.equals("0")) Sc=false; s=getParameter("sound"); //「○×」ボタンが押されたときの音の有無 if(s.equals("0")) Ac=false; Sum=Aug+Add; for(i=0,n=Sum; i<9; i++){Exe[2][i]=n % 2; n/=2;} // 和の2進形式データ for(i=Sum,Dgt[2]=0; i>0; i/=2) Dgt[2]++; // 和の桁数 Dmx=Math.max(Dgt[0],Dgt[1]); // 桁数の最大値 Dx=(8-Dmx)*20; // 基準X座標 Ax[1]=Dx+(1-(Dgt[1]-Dmx))*40; // 加数の表示X座標 Ax[2]=Dx+(1-(Dgt[2]-Dmx))*40; // 和の表示X座標 Bx=Dx+(Dmx+1)*40+30; // 「○×」「?」ボタンの表示X座標 for(i=0; i<13; i++) {X_x[i]=Xx[i]+125; X_y[i]=Xy[i]+20;} // '×' 表示座標の換算 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= 20; h= 31; ox= 0; oy= 0; break; // 0 or 1 case 1: w= 27; h= 27; ox=60; oy= 0; break; // + or - case 2: w= 26; h= 23; ox= 0; oy=124; 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_exe(int n) // 演習問題の表示 { int i, k=0; gr.setColor(new Color(224,215,200)); // 加数入力欄背景色 for(i=0;i108) Ans[2][m]=(Ans[2][m]==0)?1:0; for(i=0,n=0; i 0)?2:0; // Fin==0: 入力完了 dsp_ans(2); if(Sc) dsp_g(Bx, 94, Fin, 0, 2); // 「!」の表示 if(Sc) dsp_g(Bx,124, Fin, 1, 2); // 「?」の表示 } if(inside(x, Bx, Bx+26) && Fin==0 && Sc) // ボタンを押す { if(Ae) for(i=0, n=0; i 戻る