【プログラムnsa6.java】**************************
import java.awt.*; import java.awt.event.*; import java.applet.*; import java.util.*; class Calculator{ double dPics(int x1,int y1,int x2,int y2){ int dx=x2-x1; int dy=y2-y1; return Math.sqrt(dx*dx+dy*dy); } double dPics(Point p1,Point p2){ return dPics(p1.x,p1.y,p2.x,p2.y); } double dCount(double speed,int x1,int y1,int x2,int y2){ return dPics(x1,y1,x2,y2)/(speed * Math.sqrt(2.0)); } double dCount(double speed,Point p1,int x,int y){ return dCount(speed,p1.x,p1.y,x,y); } double dCount(double speed,Point p1,Point p2){ return dCount(speed,p1.x,p1.y,p2.x,p2.y); } double[] iPics(double speed,int x1,int y1,int x2,int y2){ double count=dCount(speed,x1,y1,x2,y2); double xi=(x2-x1)/count; double yi=(y2-y1)/count; double ar[]={xi,yi}; return ar; } double[] iPics(double speed,Point p1,Point p2){ return iPics(speed,p1.x,p1.y,p2.x,p2.y); } } class MovingCharacter extends Calculator{ Point p; int mode; int r; boolean start; boolean arrive; double speed; double dx,dy,tx,ty; Color color; int clw,clh; int rw,rh; MovingCharacter(){ start=false; arrive=false; mode=0; dx=0;dy=0;tx=0;ty=0; } /* boolean reachArea(MovingCharacter mc){ if(mc.p.x>=(p.x-rw/2) && (p.x+rw/2)>=mc.p.x && mc.p.y>=(p.y-rh/2) && (p.y+rh/2)>=mc.p.y){ return true; } return false; } */ int punchNum(MovingCharacter mc){ int i1=0,i2=0; if(mc.p.x<(p.x-rw/2))i1=1;//もっと左 if((p.x+rw/2)<mc.p.x)i1=2;//もっと右 if(mc.p.y<(p.y-rh/2))i2=10;//早すぎる //if((p.y+rh/2)<mc.p.y)i2=20;//遅すぎる if((p.y)<mc.p.y)i2=20;//遅すぎる return i1+i2; } double[] moveCount(Point p1,Point p2){ return iPics(speed,p1.x,p1.y,p2.x,p2.y); } Point move(Point p1,Point p2){ if(!start){ double[] ar=moveCount(p1,p2); dx=ar[0]; dy=ar[1]; tx=p1.x; ty=p1.y; p.setLocation(p1); start=true; } else if(Math.abs(tx-p1.x)>=Math.abs(p2.x-p1.x) && Math.abs(ty-p1.y)>=Math.abs(p2.y-p1.y)){ dx=0;dy=0; arrive=true; } else if(!arrive){ tx+=dx; ty+=dy; p.setLocation(tx,ty); } return p; } Point action(Point p1,Point p2){ return p; } } class Ball extends MovingCharacter{ Ball(){ p=new Point(); start=false; arrive=false; r=4; speed=2.5; color=Color.white; clw=6*r; clh=6*r; mode=0; } Point action(Point p1,Point p2){ if(arrive){ start=false;arrive=false; } p=move(p1,p2); return p; } } class Keeper extends MovingCharacter{ boolean punch; Keeper(){ punch=false; p=new Point(); start=false; arrive=false; r=5; speed=1; color=Color.red; clw=60*r; clh=2*r; rw=35; rh=35; } Point action(Point p1,Point p2){//左右に動く if(arrive){ mode+=1; start=false; arrive=false; } if(mode%2==1){ p=move(p2,p1); } else{ p=move(p1,p2); } return p; } } class Line{ final int w=3; final Color lcolor=Color.white; } /* class coach{ Image im; String[] words; coach(){ } } */ public class nsa6 extends java.applet.Applet implements Runnable{ final int w=680; final int d=1050;//グランド、縦105m×横68m final int gw=74;//ゴールポストの内側が7.32m final int gd=15; final int ccr=92;//センターサークルの半径9.15m final int cpr=5;//センターマークの半径 final int pmr=1;//ペナルティーマークの半径 final int car=10;//コーナーアークの半径1m //final int car=100;//コーナーアークの半径1m final Color GC=new Color(50,125,50); final Color SC=Color.white; Line li=new Line(); final Color LC=li.lcolor; Ball ball=new Ball(); final Color BC=ball.color; int r=ball.r; Point bap=ball.p;//****************************************** Keeper kp=new Keeper(); final Color KC=kp.color; int kr=kp.r; Point kpp=kp.p; MovingCharacter[] mca=new MovingCharacter[2]; //mca[0]=ball; //mca[1]=kp; int spx; int spy; int i5=100; String sk; final Point ps=new Point(100,100);//******************************グランド上のラインの起点 final Point pe=new Point(ps.x+w,ps.y+d); final Point prs=new Point(ps.x+r,ps.y+r); final Point pre=new Point(pe.x-r,pe.y-r); final Point pce=new Point(ps.x,(prs.y+pre.y)/2);//センターライン final Point pccc=new Point(pce.x+w/2,pce.y);//センターマーク final Point pglb=new Point(pccc.x-gw/2,pe.y);//ゴール、下、左 final Point pgrb=new Point(pccc.x+gw/2,pe.y);//ゴール、下、右 final Point pgelb=new Point(pglb.x-55,pe.y);//ゴールエリア final Point pgerb=new Point(pgrb.x+55,pe.y);//ゴールエリア final Point ppelb=new Point(pglb.x-165,pe.y);//ペナルティーエリア final Point pperb=new Point(pgrb.x+165,pe.y);//ペナルティーエリア final Point ppm=new Point(pccc.x,pe.y-110);//ペナルティーマーク Point pks; Point pke; //Thread t_kp=new Thread(this); Point pbs=new Point(pccc.x,pccc.y); Point pbe=new Point(pccc.x+31,pe.y+10); Point pbe2=new Point(500,pccc.y); Thread t_ball=new Thread(this); final int STOP_TIME= 10; Image ibuff; /* 裏画面用Image */ Graphics gb; /* 裏イメージの描画領域用 */ public void init() { addMouseListener(new MA(this)); addMouseMotionListener(new MMA(this)); setBackground(GC); ibuff= createImage(900,1300); /* 横900×縦1300でImage生成 */ gb = ibuff.getGraphics(); /* 裏イメージの描画領域 */ gb.setFont(new Font("SansSerif",Font.BOLD,20)); pks=new Point(pglb.x,pglb.y); pke=new Point(pgrb.x,pgrb.y); kp.p.setLocation(pks); kpp=kp.p; } public void start(){ if (t_ball != null) t_ball.start(); } public void run() { Thread ct = Thread.currentThread(); while (t_ball == ct) { repaint(bap.x-12,bap.y-12,ball.clw,ball.clh); //repaint(); switch(ball.mode){ case 0: if(!ball.start){//************************************ int x=(int)(1 + Math.random() * gw); x+=(pccc.x-gw/2); pbe.setLocation(x,pbe.y); x=(int)(1 + Math.random() * w); x+=ps.x; pbs.setLocation(x,pbs.y); } bap=ball.action(pbs,pbe); if(ball.arrive)ball.start=false; break; case 1: bap=ball.action(kpp,pbe2); if(ball.arrive){ ball.mode=0; ball.start=false; } break; } try { Thread.sleep (STOP_TIME); } catch (InterruptedException e) {} } } public void update(Graphics g) {//********************************************************** // gb.setClip(bap.x-11,bap.y-11,ball.clw,ball.clh); paint(g); } public void paint(Graphics g) { gb.setColor(GC); gb.fillRect(0,0,900,1300); gb.setColor(LC); //gb.fillArc(prs.x-(car+li.w)/2,pre.y-(car+li.w)/2,car+li.w,car+li.w,0,90); gb.fillArc(prs.x-car/2-li.w,pre.y-car/2+li.w,car+li.w,car+li.w,0,90); gb.setColor(GC); gb.fillArc(prs.x-car/2-li.w,pre.y-car/2+2*li.w,car,car,0,90); gb.setColor(LC); gb.fillRect(ps.x,ps.y,li.w,d); gb.fillRect(ps.x+w,ps.y,li.w,d+li.w); gb.fillRect(ps.x,ps.y,w,li.w); gb.fillRect(ps.x,ps.y+d,w,li.w); gb.fillArc(ppm.x-ccr,ppm.y-ccr,ccr*2,ccr*2,36,108);//*** gb.setColor(GC); gb.fillArc(ppm.x-ccr+li.w,ppm.y-ccr+li.w,(ccr-li.w)*2,(ccr-li.w)*2,35,111); gb.setColor(LC); gb.fillRect(pccc.x-gw/2,pe.y,li.w,gd);//ゴール gb.fillRect(pccc.x+gw/2,pe.y,li.w,gd);//ゴール gb.fillRect(pccc.x-gw/2,pe.y+gd,gw+li.w,li.w);//ゴール gb.fillRect(pgelb.x,pgelb.y-55,li.w,55);//ゴールエリア gb.fillRect(pgerb.x,pgelb.y-55,li.w,55);//ゴールエリア gb.fillRect(pgelb.x,pgelb.y-55,pgerb.x-pgelb.x,li.w);//ゴールエリア gb.fillRect(ppelb.x,ppelb.y-165,li.w,165);//ペナルティーエリア gb.fillRect(pperb.x,pperb.y-165,li.w,165);//ペナルティーエリア gb.fillRect(ppelb.x,pgelb.y-165,pperb.x-ppelb.x,li.w);//ペナルティーエリア gb.fillOval(ppm.x-cpr,ppm.y-cpr,pmr*2,pmr*2); gb.fillOval(pccc.x-ccr,pccc.y-ccr,ccr*2,ccr*2); gb.setColor(GC); gb.fillOval(pccc.x-ccr+li.w,pccc.y-ccr+li.w,(ccr-li.w)*2,(ccr-li.w)*2); gb.setColor(LC); gb.fillOval(pccc.x-cpr,pccc.y-cpr,cpr*2,cpr*2); gb.fillRect(pce.x,pce.y,w,li.w); gb.setColor(BC); gb.fillOval(bap.x-r,bap.y-r,r*2,r*2); gb.setColor(KC); gb.fillOval(kpp.x-kr,kpp.y-kr,kr*2,kr*2); //gb.drawRect(kpp.x-kp.rw/2,kpp.y-kp.rh/2,kp.rw,kp.rh); gb.setColor(SC); gb.drawString("bap.x:"+bap.x,200,200); gb.drawString("bap.y:"+bap.y,200,230); gb.drawString("peb.x:"+pbe.x,pglb.x,pglb.y+90); gb.drawString("arrive:"+kp.arrive,200,320); //gb.drawString("Punch! : "+kp.punch,pgelb.x,pgelb.y+50); if(i5==0)sk="ナイスパンチ!!"; if(i5==100)sk=" "; if(i5==1)sk="もっと左!!"; if(i5==2)sk="もっと右!!"; if(i5==10)sk="早すぎる!!"; if(i5==20)sk="遅すぎる!!"; if(i5==21)sk="遅すぎる!!もっと左!!"; if(i5==22)sk="遅すぎる!!もっと右!!"; if(i5==11)sk="早すぎる!!もっと左!!"; if(i5==12)sk="早すぎる!!もっと右!!"; gb.drawString("Punch! : "+sk,pgelb.x,pgelb.y+50); g.drawImage(ibuff,0,0,this); } public void stop(){ if(t_ball != null) t_ball = null; } } class MA extends MouseAdapter{ nsa6 ap; Keeper kp; MA(nsa6 ap) { this.ap = ap; this.kp=ap.kp; } public void mouseClicked(MouseEvent e){//****************************** /* kp.punch=kp.reachArea(ap.ball); */ ap.i5=kp.punchNum(ap.ball); if(ap.i5==0){ ap.ball.mode=1; ap.ball.arrive=true; } ap.repaint(ap.pgelb.x-20,ap.pgelb.y,520,520); //ap.repaint(); } } class MMA extends MouseMotionAdapter{ nsa6 ap; MMA(nsa6 ap) { this.ap = ap; } public void mouseMoved(MouseEvent e){ if(e.getX()<ap.pgelb.x){ ap.kpp.x=ap.pgelb.x; } else if(e.getX()>ap.pgerb.x){ ap.kpp.x=ap.pgerb.x; } else{ ap.kpp.x=e.getX(); } //ap.repaint(); ap.repaint(ap.kpp.x-ap.kp.clw/2,ap.kpp.y-5,ap.kp.clw,ap.kp.clh); } }