//
/* ---------------------------------------------------------------------------------------------- bin2hex.java 16進数への変換 ver. 2.00 (JDK 1.02) ueyama@infonet.co.jp 2000.03.20 update: 2007.06.03 ---------------------------------------------------------------------------------------------- */ import java.applet.*; import java.awt.*; import java.util.*; public class bin2hex extends Applet implements Runnable { int Bx=0, By=138, Qx=24, Qy=13; int Qn,Qq; // 出題、出題数 int T,Te; AudioClip Pinpon, Boouu; int Bgc; Color Bs[]=new Color[5]; Image Img; Graphics gr; Random Rnd=new Random(); Thread th=null; public void start() { if(th==null) { th=new Thread(this); th.start(); } } public void init() { String bg=getParameter("BgColor"); Bgc=Integer.valueOf(bg,16).intValue(); setBackground(new Color(Bgc)); Pinpon=getAudioClip(getCodeBase(), "pinpon.au"); Pinpon.play(); Pinpon.stop(); Boouu=getAudioClip(getCodeBase(), "boouu.au"); Boouu.play(); Boouu.stop(); MediaTracker mt=new MediaTracker(this); Img=getImage(getCodeBase(), getParameter("figure")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; gr=getGraphics(); Bs[0]=new Color(255,255,255); Bs[1]=new Color(232,232,232); Bs[2]=new Color(102,102,102); Bs[3]=new Color( 51, 51, 51); Bs[4]=new Color(180,180,204); Qn=Math.abs(Rnd.nextInt())%16; Qq=0; T=0; Te=0; } 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_b(int x, int y, int n, int c) // 図、文字の表示 { Graphics gx=gr.create(); int w=12, h=16, ox=632, oy=0; switch(n) { case 0: w=36; h=37; ox= 0; oy= 0; break; // 白16進数 case 1: w=36; h=37; ox= 0; oy= 37; break; // 緑16進数 case 2: w=37; h=57; ox=576; oy= 0; break; // 数字 0 or 1 case 3: w=18; h=16; ox= 0; oy= 74; break; // 白数字 ボタン用 case 4: w=11; h=16; ox=576; oy= 57; break; // 灰数字 case 5: w=26; h=24; ox=650; oy= 0; break; // RUN ボタン case 6: w=33; h=12; ox=576; oy= 73; break; // "Start" case 7: w=32; h=12; ox=609; oy= 73; break; // "Time" case 8: w=29; h=12; ox=642; oy= 73; break; // "Sec." } gx.clipRect(x,y,w,h); gx.clearRect(x,y,w,h); gx.drawImage(Img,x-(ox+c*w),y-oy,this); gx.dispose(); } public void dsp_q() // 問題の表示 { int i,j=8,m=0; for(i=0; i<4; i++,j/=2) { m=((Qn&j)==0)? 0:1; dsp_b(Qx+i*50,Qy,2,m); } } public void button(int n, boolean s) // 16進キーの表示 { int x=(n%4)*60+Bx, y=((15-n)/4)*60+By; gr.setColor(Bs[(s)?3:0]); gr.drawLine(x,y,x+54,y); gr.drawLine(x,y,x,y+54); gr.setColor(Bs[(s)?2:1]); gr.drawLine(x+1,y+1,x+53,y+1); gr.drawLine(x+1,y+1,x+1,y+53); gr.setColor(Bs[(s)?1:2]); gr.drawLine(x+2,y+53,x+53,y+53); gr.drawLine(x+53,y+2,x+53,y+53); gr.setColor(Bs[(s)?0:3]); gr.drawLine(x+1,y+54,x+54,y+54); gr.drawLine(x+54,y+1,x+54,y+54); gr.setColor(Bs[4]); gr.fillRect(x+2,y+2,51,51); dsp_b(x+9,y+9,(s)?1:0,n); } public void dsp_t() // 時間の表示 { int m, x=18; if(inside(Te,1,9999)) { dsp_b(x,97,7,0); x+=38; m=Te/1000; if(m>0) {dsp_b(x,93,4,m); x+=13;} m=Te/100; m%=10; dsp_b(x,93,4,m); x+=13; m=Te/10; m%=10; dsp_b(x,93,4,m); x+=12; dsp_b(x,93,4,10); x+=8; m=Te%10; dsp_b(x,93,4,m); x+=18; dsp_b(x,97,8,0); } } public void paint(Graphics g) { int i; g.clearRect(0,0,size().width,size().height); g.setColor(new Color(204,204,204)); g.fillRoundRect(4,0,227,83,20,20); // 出題 '枠' g.setColor(new Color(Bgc)); g.fillRoundRect(8,4,219,75,16,16); for(i=0; i<16; i++) button(i,false); dsp_b(201,91,5,(Qq==0)?0:1); if(Qq>0) { dsp_b(206,95,3,Qq-1); dsp_q(); } else dsp_b(161,97,6,0); dsp_t(); } public void run() { while(true) { try { Thread.sleep(100); } catch (InterruptedException e){} T++; if(Te>0 && T-Te==5) Pinpon.play(); } } public boolean mouseDown(Event e, int x, int y) { int mx=(x-Bx)/60, nx=(x-Bx)%60, my=(y-By)/60, ny=(y-By)%60, n=(3-my)*4+mx; if(inside(x,201,227) && inside(y,91,115) && Qq==0) // Start ボタン { Qq=1; dsp_b(201,91,5,1); Qn=Math.abs(Rnd.nextInt())%16; dsp_q(); gr.clearRect(16,93,180,17); // 時間表示の消去 T=0; Te=0; } if(inside(nx,0,55) && inside(ny,0,55) && Qq>0) // 16進キーをクリック { button(n,true); if(n==Qn) // 正解 { Pinpon.play(); Qq++; dsp_b(206,95,3,Qq-1); // 出題 No. の表示 if(Qq>10) // 終了 { Qq=0; Te=T; dsp_b(201,91,5,0); gr.clearRect(24,13,187,57); dsp_b(161,97,6,0); } else { while(Qn==n) Qn=Math.abs(Rnd.nextInt())%16; // 問題(16進数)を乱数で作成 dsp_q(); // 問題の表示 } } else Boouu.play(); } dsp_t(); return true; } public boolean mouseUp(Event e, int x, int y) { int mx=(x-Bx)/60, nx=(x-Bx)%60, my=(y-By)/60, ny=(y-By)%60, n=(3-my)*4+mx; if(inside(x,201,227) && inside(y,91,115) && Qq==1) dsp_b(206,95,3,0); if(inside(nx,0,55) && inside(ny,0,55)) button(n,false); return true; } public void stop() { if(th!=null) { th.stop(); th=null; } } } //戻る