/* Name:Teruyuki Imai ID-No.:040704E 画像を表示するJavaプログラム*/ //まず,必要なクラスをimport import java.awt.*; import java.awt.event.*; class Kadai1108 extends Frame{//Windowを開くため,Frameを継承 int eventno[]=new int[4];//状態を識別する番号. //[0]:空;[1]:雪だるま;[2]:月;[3]:地面. public Kadai1108(String title){ super(title);//"title"というタイトルになる(SuperClassのFrameで) for(int i=0;i<4;i++)eventno[i]=0;//defaultは0. /*GUI部品とEvent Listenerの関連づけ KeyAdapter:KeyListenerを実装し中身はなし new ClassName(){}で"ClassName"で名無しの子クラスを定義, 同時にインスタンスを作る*/ addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent k){ char key=k.getKeyChar(); System.out.println("The key("+key+") is pressed."); if(key=='q'){ System.out.println("Exit."); System.exit(0);//qを押すとexit. } } }); /*Mouseの挙動に反応する部分の定義 MouseをClickした点による挙動, MouseがWindowをはずれた時の挙動を決める.*/ addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent m){ /*ここで,MouseをClickしたときの定義. Clickした点の座標と名称を表示し, Clickした部分の絵を変化するようにする.*/ Point click=m.getPoint(); System.out.println("Clicked at ("+click.x+","+click.y+")"); int clickwhere=where(click, eventno[0],eventno[1],eventno[2],eventno[3]);//Clickした点が何か. eventno[clickwhere]=(eventno[clickwhere]+1)%4; /*clickした場所に応じて状態の番号を変化させる. eventno[clickwhere]++; if(eventno[clickwhere]>=4) eventno[clickwhere]-=4; とどっちが良いでしょうか?*/ switch(clickwhere){ case 1: System.out.println("A snowman."); break; case 2: System.out.println("A moon"); break; case 3: System.out.println("Ground."); break; default: System.out.println("Sky."); break; } repaint(); } public void mouseExited(MouseEvent m){ System.out.println("Exit."); System.exit(0);//MousePointerがWindow外に出るとexit. } int where(Point c,int sk,int sn,int mo,int gr){ /*どこをclickしたか判定するメソッド. 返す値.0:空;1:雪だるま;2:月;3:地面.*/ if(((c.x-80)*(c.x-80)+(c.y-320)*(c.y-320)<=2500)|| ((c.x-80)*(c.x-80)+(c.y-240)*(c.y-240)<=1600)) return 1;//まずは雪だるまかどうか else{ if((c.x-315)*(c.x-315)+(c.y-105)*(c.y-105)<=635){ switch(mo){ case 1: if(c.x<=315) return 2; break; case 2: if((c.x-325)*(c.x-325)+(c.y-105)*(c.y-105) >=625) return 2; break; case 3: if((c.x-300)*(c.x-300)+(c.y-105)*(c.y-105) >=625) return 2; break; default: return 2; } } } if(c.y>=350)return 3; return 0; } }); } public static void main(String[] args){ Kadai1108 frame=new Kadai1108("Kadai1108"); frame.setSize(400,400); frame.setVisible(true); System.out.println("If you press \"q\" or MouseCursor exit,"); System.out.println("The window close and This Program end."); } public void paint(Graphics g){ //ここで描画 //まずは空から int re,gr,bl; switch(eventno[0]){ case 1: re=160;gr=150;bl=210; break; case 2: re=160;gr=170;bl=210; break; case 3: re=160;gr=170;bl=240; break; default: re=160;gr=180;bl=255; break; } g.setColor(new Color(re,gr,bl)); g.fillRect(0,0,400,350); //次に地面 switch(eventno[3]){ case 1: g.setColor(new Color(100,160,128)); break; case 2: g.setColor(new Color(100,120,96)); break; case 3: g.setColor(new Color(100,80,70)); break; default: g.setColor(new Color(64,30,36)); break; } g.fillRect(0,350,400,50); //雪だるまを塗る #雪だるまの変化は残念ながら思いつきませんでした. //1.まず本体を作る g.setColor(Color.white); g.fillOval(30,270,100,100); g.fillOval(40,200,80,80); //2.次は目を付けよう g.setColor(Color.black); g.fillOval(65,225,10,10); g.fillOval(85,225,10,10); //3.鼻をつける int nose1[]={80,70,85}; int nose2[]={240,250,245}; g.fillPolygon(nose1,nose2,3); //月を塗る.月の順番を忘れました.順番がばらばらで残念. g.setColor(Color.yellow); g.fillOval(290,80,50,50); /*手抜きのため,まずは丸く塗る. それ故defaultはなしで満月. で,空の色で一部を塗りつぶしてそれらしく見せかける.*/ g.setColor(new Color(re,gr,bl)); switch(eventno[2]){ case 1: g.fillArc(290,80,50,50,-90,180); break; case 2: g.fillOval(300,80,50,50);//まさに誤魔化し! break; case 3: g.fillOval(275,80,50,50);//これも誤魔化し! break; } } }