解答例(1)
作品
g410412
プログラム
////////////////////////////////////////////////////////////////////////////////
// プログラム名 : Kadai1109
// 作成者 : gXXXXXX XXXX
// プログラムの説明 : 月と雪だるまを描画するプログラム
// コメント : お絵かきは嫌いですw雪だるまの原案はクラスの人に書いてもら
// いました。あまり再現できてないかも。
// 無駄にオブジェクト指向なのはオプション課題で拡張するときに
// 動かすことを考えたから。だんだん、(プログラム中の)コメント
// が手抜きになっていく
////////////////////////////////////////////////////////////////////////////////
import java.awt.*;
import java.awt.event.*;
import java.util.*;
abstract class Obje{//描画オブジェクトの基底クラス
protected int px,py;
protected int psize;
Obje(int x,int y,int size){
move(x,y,size);
}
abstract public void draw(Graphics g);
public void move(int x,int y ,int size){
px=x;
py=y;
psize=size;
}
protected void drawCircle(int x,int y,int size,Graphics g){//グラデーションのかかった円を描く関数
while(size>0){
g.setColor(new Color(255-size/2,255-size/2,255-size/4));//ちょっと青っぽく
g.fillOval(x,y,size,size);
x++;y++;size-=2;
}
}
}
class Info extends Obje{//著作権表示?用オブジェクト、クラスの人に雪だるまの原案を書いてもらったのでw
Info(){
super(350,450,0);
}
public void draw(Graphics g){
g.setColor(Color.green);
g.setFont(new Font("Courier",Font.BOLD,20));
g.drawString("(C) 22組の暇なかたがた",px,py);
}
}
class Moon extends Obje{//月クラス
Moon(int x,int y){
super(x,y,80);
}
public void draw(Graphics g){
int size=psize;
int x=px;
int y=py;
while(size>0){
g.setColor(new Color(255-size,255-size,100));
g.fillOval(x,y,size,size);
x++;y++;size-=2;
}
}
}
class Yuki extends Obje{//雪クラス
Yuki(int x,int y){
super(x,y,10);
}
public void draw(Graphics g){
drawCircle(px,py,psize,g);
}
}
class Yukidaruma extends Obje{//雪だるまクラスその1
Yukidaruma(int x,int y,int size){
super(x,y,size);
}
public void draw(Graphics g){
g.setColor(new Color(185,122,0));//腕
int[] armxs1={px+psize*60/60,px+psize*58/60,px+psize*73/60,px+psize*75/60};
int[] armys1={py+psize*60/60,py+psize*57/60,py+psize*47/60,py+psize*50/60};
g.fillPolygon(armxs1,armys1,4);
int[] armxs2={px+psize*2/60,px+psize*5/60,px-psize*5/60,px-psize*8/60};
int[] armys2={py+psize*50/60,py+psize*48/60,py+psize*33/60,py+psize*35/60};
g.fillPolygon(armxs2,armys2,4);
g.setColor(Color.red);//帽子
int[] hatxs={px+psize*45/60,px+psize*60/60,px+psize*70/60,px+psize*60/60};
int[] hatys={py+psize*5/60,py-psize*5/60,py+psize*5/60,py+psize*20/60};
g.fillPolygon(hatxs,hatys,4);
drawCircle(px,py+psize/2,psize,g);//本体
drawCircle(px+psize/3,py,psize*2/3,g);//頭
drawCircle(px-psize*55/600-psize/12,py+psize*34/60-psize/12,psize/6,g);
drawCircle(px+psize*74/60-psize/12,py+psize*485/600-psize/12,psize/6,g);
g.setColor(Color.black);//眼
g.fillOval(px+psize*7/12-psize/30,py+psize*2/12-psize/30,psize/15,psize/15);
g.fillOval(px+psize*10/12-psize/30,py+psize*3/12-psize/30,psize/15,psize/15);
g.setColor(Color.red);//ボタン
g.fillOval(px+psize*13/24-psize/30,py+psize*9/12-psize/30,psize/15,psize/15);
g.fillOval(px+psize*6/12-psize/30,py+psize*12/12-psize/30,psize/15,psize/15);
g.fillOval(px+psize*11/24-psize/30,py+psize*15/12-psize/30,psize/15,psize/15);
}
}
class Yukidaruma2 extends Obje{//雪だるまクラスその2
Yukidaruma2(int x,int y,int size){
super(x,y,size);
}
public void draw(Graphics g){
g.setColor(new Color(185,122,0));//腕
int[] armxs={px+psize*6/40,px+psize*6/40,px-psize*9/40,px-psize*9/40};
int[] armys={py+psize*44/40,py+psize*46/40,py+psize*46/40,py+psize*44/40};
g.fillPolygon(armxs,armys,4);
int[] armxs2={px+psize*6/40,px+psize*7/40,px-psize*3/40,px-psize*6/40,px-psize*7/40,px-psize*4/40};
int[] armys2={py+psize*41/40,py+psize*39/40,py+psize*29/40,py+psize*24/40,py+psize*26/40,py+psize*31/40};
g.fillPolygon(armxs2,armys2,6);
int[] armxs3={px+psize*6/40,px+psize*7/40,px-psize*3/40,px-psize*6/40,px-psize*7/40,px-psize*4/40};
int[] armys3={py+psize*49/40,py+psize*51/40,py+psize*61/40,py+psize*66/40,py+psize*64/40,py+psize*59/40};
g.fillPolygon(armxs3,armys3,6);
int[] armxs4={px+psize*34/40,px+psize*34/40,px+psize*49/40,px+psize*49/40};
int[] armys4={py+psize*44/40,py+psize*46/40,py+psize*46/40,py+psize*44/40};
g.fillPolygon(armxs4,armys4,4);
int[] armxs5={px+psize*34/40,px+psize*33/40,px+psize*43/40,px+psize*46/40,px+psize*47/40,px+psize*44/40};
int[] armys5={py+psize*41/40,py+psize*39/40,py+psize*29/40,py+psize*24/40,py+psize*26/40,py+psize*31/40};
g.fillPolygon(armxs5,armys5,6);
int[] armxs6={px+psize*34/40,px+psize*33/40,px+psize*43/40,px+psize*46/40,px+psize*47/40,px+psize*44/40};
int[] armys6={py+psize*49/40,py+psize*51/40,py+psize*61/40,py+psize*66/40,py+psize*64/40,py+psize*59/40};
g.fillPolygon(armxs6,armys6,6);
drawCircle(px,py+psize*5/4,psize,g);//胴
drawCircle(px+psize*1/8,py+psize*3/4,psize*3/4,g);//胸
drawCircle(px,py,psize,g);//頭
g.setColor(new Color(185,122,0));//眼
int[] eyexs={px+psize*10/40,px+psize*8/40,px+psize*13/40,px+psize*15/40};
int[] eyeys={py+psize*20/40,py+psize*18/40,py+psize*13/40,py+psize*15/40};
g.fillPolygon(eyexs,eyeys,4);
int[] eyexs2={px+psize*30/40,px+psize*32/40,px+psize*27/40,px+psize*25/40};
int[] eyeys2={py+psize*20/40,py+psize*18/40,py+psize*13/40,py+psize*15/40};
g.fillPolygon(eyexs2,eyeys2,4);
}
}
class Yukidaruma3 extends Obje{//雪だるまクラスその3
Yukidaruma3(int x,int y,int size){
super(x,y,size);
}
public void draw(Graphics g){
g.setColor(new Color(185,122,0));//首
g.fillRect(px+psize*27/60,py+psize*25/60,psize*6/60,psize*40/60);
g.fillRect(px+psize*10/60,py+psize*105/60,psize*5/60,psize*25/60);//足
g.fillRect(px+psize*20/60,py+psize*105/60,psize*5/60,psize*25/60);
g.fillRect(px+psize*35/60,py+psize*105/60,psize*5/60,psize*25/60);
g.fillRect(px+psize*45/60,py+psize*105/60,psize*5/60,psize*25/60);
drawCircle(px+psize*15/60,py,psize*30/60,g);//頭
drawCircle(px,py+psize,psize,g);//本体
g.setColor(Color.black);//眼
g.fillOval(px+psize*25/60-psize/30,py+psize*10/60-psize/30,psize/15,psize/15);
g.fillOval(px+psize*35/60-psize/30,py+psize*10/60-psize/30,psize/15,psize/15);
}
}
class Kadai1109 extends Frame{
private Obje obje[];
private void init(){//初期化関数、オブジェクト生成
obje = new Obje[100];
Random r=new Random();
obje[0]=new Yukidaruma(50,180,180);
obje[1]=new Yukidaruma2(300,100,100);
obje[2]=new Yukidaruma3(450,130,130);
obje[3]=new Moon(50,50);
for(int i=4;i< 99;i++){
obje[i]=new Yuki(r.nextInt(600),r.nextInt(480));
}
obje[99]=new Info();
}
public Kadai1109(String title){
super(title);
setResizable(false);//ウィンドウサイズを変えちゃダメ
init();//初期化、オブジェクト生成
//以下イベント処理
addKeyListener(new KeyAdapter(){//キーボード入力
public void keyPressed(KeyEvent e){//qで終了
int key=e.getKeyChar();
if(key=='q'){
System.exit(0);
}
}
});
addWindowListener(new WindowAdapter(){//ウィンドウイベント?
public void windowClosing(WindowEvent e) {//閉じる印で終了
System.exit(0);
}
});
}
//メイン関数
public static void main(String[] args){
Kadai1109 frame=new Kadai1109("Kadai1109");
frame.setSize(600,480);
frame.setVisible(true);
}
//描画関数
public void paint(Graphics g){
//背景描画
g.setColor(Color.black);
g.fillRect(0,0,600,240);
for(int i=240;i < 480;i++){
g.setColor(new Color(i-240,i-240,i-225));//少し青っぽく
g.fillRect(0,i,600,1);
}
//オブジェクト描画
for(int i=0;i < 100;i++){
obje[i].draw(g);
}
}
}
コメント
「無駄にオブジェクト指向 」と謙遜していますが,クラスの切り分け方やメソッドの
分け方も良い感じです.
解答例(2)
作品
g420198
プログラム
// 名前:XXXX
// 学生証番号:XXXXXX
// 説明:Kadai1109
import java.awt.*;
import java.awt.event.*;
import java.util.*;//乱数
class Kadai1109 extends Frame{
Random random=new Random(); //乱数の宣言
public Kadai1109(String title){
super(title);
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int key=e.getKeyChar();
if(key=='q') System.exit(0);
}
});
}
public static void main(String[] args){
Kadai1109 frame=new Kadai1109("Kadai1109");
frame.setSize(400,400);
frame.setVisible(true);
}
public void paint(Graphics g){
//背景描画
for (int i=0;i < 300;i++){
g.setColor(new Color((int)(255-0.15*i),(int)(255-0.15*i),(int)(255-0.2*i)));
g.fillOval((int)(-100+i),(int)(-100+i),600-2*i,600-2*i);
}
//月の描画
for(int i=10;i>=1;i--){
g.setColor(new Color(248-3*i,(int)(240-2*i),224-4*i));
g.fillOval((int)(320-1*i),(int)(80-0.7*i),3*i,3*i);
}
//雪だるま下部描画
for (int i=0;i <= 10;i++){//胴体
g.setColor(new Color(240+1*i,(int)(244+1*i),(int)(244+1*i)));
g.fillOval((int)(60+4*i),(int)(190+4*i),280-8*i,350-8*i);
}
for (int i=0;i <= 10;i++){ //ボタン
g.setColor(new Color((int)(80+17*i),(int)(90+16*i),(int)(80+17*i)));
g.fillOval((int)(195+0.5*i),(int)(295+0.5*i),(int)(17-0.7*i),(int)(14-1*i));
g.fillOval((int)(195+0.5*i),(int)(350+0.5*i),(int)(17-0.7*i),(int)(14-1*i));
}
g.setColor(new Color(165,175,145));//帽子の鍔の裏側
g.fillArc(133,144,130,20,202,140);
g.setColor(new Color(185,195,165));
for (int i=0;i <= 10;i++){//マフラー左
g.drawArc((int)(175-0.5*i),(int)(235+0.5*i),(int)(65-1.2*i),(int)(120+1.2*i),10,70);
}
for (int i=0;i <= 15;i++){//マフラー右
g.drawArc((int)(190-1.3*i),(int)(225-0.5*i),85+8*i,140-i,90+2*i,90-2*i);
}
//雪の描画
g.setColor(Color.white);
for (int i=0;i < 300;i++){
int snowX=random.nextInt(400);
int snowY=random.nextInt(400);
int snowR=random.nextInt(5)+1;
g.fillOval(snowX,snowY,snowR,snowR);
}
//雪だるま上部描画
for (int i=0;i<=10;i++){
g.setColor(new Color((int)(230+2.4*i),(int)(244+1*i),(int)(244+1*i)));//顔全体
g.fillOval((int)(140+1*i),(int)(129+4*i),120-2*i,115-5*i);
}
for (int i=0;i<=10;i++){
g.setColor(new Color((int)(240+1.4*i),(int)(170+7*i),(int)(60+15*i)));//鼻
g.fillOval((int)(188+0.35*i),(int)(183+0.4*i),(int)(27-0.7*i),(int)(14-0.9*i));
}
g.setColor(new Color(100,110,100));//目
g.fillOval(182,173,7,6);
g.fillOval(214,173,7,6);
g.setColor(Color.white);
g.fillOval(185,175,1,1);
g.fillOval(217,175,1,1);
g.setColor(new Color(200,200,200));//口
g.drawArc(168,176,60,30,228,103);
g.setColor(new Color(180,190,160));
for (int i=0;i<=20;i++){//帽子本体
g.drawArc(162,117+i,75,20,355,190);
}
for (int i=0;i<=15;i++){//帽子の鍔
g.setColor(new Color(180+i,190+i,160+i));
g.drawArc((int)(163-1.7*i),135+i,(int)(80+3.3*i),20,30,150);
}
g.setColor(Color.white);
for (int i=0;i< 10;i++){
int snowX=random.nextInt(400);
int snowY=random.nextInt(400);
g.drawLine(snowX,snowY-1,snowX,snowY+29);//結晶
g.drawLine(snowX+12,snowY+7,snowX-12,snowY+21);
g.drawLine(snowX+12,snowY+21,snowX-12,snowY+7);
g.drawLine(snowX,snowY+8,snowX+3,snowY+5);//結晶細部
g.drawLine(snowX,snowY+8,snowX-3,snowY+5);
g.drawLine(snowX+5,snowY+11,snowX+6,snowY+8);
g.drawLine(snowX+5,snowY+11,snowX+9,snowY+13);
g.drawLine(snowX+5,snowY+17,snowX+9,snowY+15);
g.drawLine(snowX+5,snowY+17,snowX+6,snowY+20);
g.drawLine(snowX,snowY+20,snowX+3,snowY+23);
g.drawLine(snowX,snowY+20,snowX-3,snowY+23);
g.drawLine(snowX-5,snowY+17,snowX-6,snowY+20);
g.drawLine(snowX-5,snowY+17,snowX-9,snowY+15);
g.drawLine(snowX-5,snowY+11,snowX-9,snowY+13);
g.drawLine(snowX-5,snowY+11,snowX-6,snowY+8);
}
}
}
コメント
解答例(3)
作品
g440882
プログラム
//XXXX
//XXXX
//雲のかかった月と雪だるまと降っている雪の絵
import java.awt.*; //AWTを使うため
import java.awt.event.*; //イベント駆動関係のクラスのため
import java.util.*; //Randomクラスを使うため
class Kadai1109 extends Frame{
public Kadai1109(String title){
super(title);
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
int key=e.getKeyChar();
System.out.println("keyPressed("+e+","+key+")");
if(key=='q') System.exit(0);
}
});
}
public static void main(String[] args){
Kadai1109 frame=new Kadai1109("Kadai1109");
frame.setSize(400,400);
frame.setVisible(true);
}
public void paint(Graphics g){
//背景
for(int i=0;i< 30;i++){
g.setColor(new Color(200+i,190,240));
g.fillRect(0,7*i,400,400);
}
//地面
g.setColor(new Color(230,230,230));
g.fillRect(0,240,400,400);
//月
g.setColor(new Color(255,255,110));
g.fillOval(270,50,70,70);
//雲
g.setColor(new Color(240,240,255,150));
g.fillOval(170,90,150,30);
g.fillOval(270,55,100,20);
//陰
g.setColor(new Color(0,0,0,100));
g.fillOval(50,350,100,40);
//雪だるま
g.setColor(Color.white);
g.fillOval(70,200,90,90);
g.fillOval(60,270,110,110);
g.setColor(Color.black);
g.fillOval(100,235,5,5);
g.fillOval(130,235,5,5);
//枝
g.setColor(new Color(140,80,40));
g.drawLine(150,310,200,280);
g.drawLine(180,292,200,295);
g.drawLine(80,310,30,280);
g.drawLine(55,295,35,292);
g.drawLine(40,286,35,274);
//雪
g.setColor(new Color(255,255,255,200));
Random r=new Random();
for(int i=0;i< 20;i++){
int px=r.nextInt(400);
int py=r.nextInt(400);
g.fillOval(px,py,10,10);
}
}
}
コメント
雲や雪が半透明になっているのが奇麗ですね.これは,講義では扱いませんでしたが,
g.setColor(new Color(240,240,255,150));
のように,色を指定する時に,アルファ値(不透明度,0は透明,255は不透明)も
与えていることで実現しています.
その他の作品
g410151
g410416
g440009
g440052
g440138
g440157
g440387
g440396
g440513
g440535
g440538
g440539
g440545
g440554
g440564
g440565
g440568
g440574
g440584
g440587
g440608
g440654
g440701
g440773
g440806
g440881
g440904
g441096
g441101
g441132
g441163
g441169
g450246
g450302
g460002
g460026
g460032
オプション課題
- 5名が提出
- g410412 雪だるまを動かせる.タイマーを使って,表示する画像ファイルを入れ替え
- g440157 アニメーションでバケツが降ってくる.月が満ち欠けする
- g440387 雪の画像を書く
- g440396 マウスの動きに合わせて,雪だるまの眉が動く
// XXXXXX
// XXXXX
// (オプション課題)
// マウスをウィンドウ内で移動させると、雪だるまの眉毛が動きます。
// 長方形のクラスRectangleをKadai1109のものから少し変えていますが、
// このクラスを使ってKadai1109も動作するので、問題はありません。
// 現在はKadai1109のソースを書き換えてこのクラスに統一しています。
// AWTとイベント処理を扱うためのimport
import java.awt.*;
import java.awt.event.*;
// Frameクラスのサブクラスとする
class Option1109 extends Frame implements KeyListener, MouseMotionListener{
// コンストラクタ
Option1109(String name){
super(name);
// KeyListenerを関連づける
addKeyListener(this);
// MouseMotionListenerを関連づける
addMouseMotionListener(this);
}
// KeyListenerを実装するためのメソッド
// キーが押されているとき
public void keyPressed(KeyEvent e){
// 'q'キーが押されたらプログラムを終了する
if(e.getKeyChar()=='q')
System.exit(0);
}
// キーが離されたとき
public void keyReleased(KeyEvent e){
}
// キーがタイプされたとき
public void keyTyped(KeyEvent e){
}
// MouseMotionListenerを実装するためのメソッド
// マウスがドラッグされたとき
public void mouseDragged(MouseEvent e){
}
// マウスが移動したとき
public void mouseMoved(MouseEvent e){
rectangle[1].remake(220,180,e.getY()-e.getX(),8,16,Color.black);
rectangle[2].remake(180,180,e.getX()-e.getY(),8,16,Color.black);
repaint();
}
// 円(満月、雪だるま上下、目左右)を管理
Circle[] circle={
new Circle(500,60,20,Color.yellow),
new Circle(200,200,50,Color.white),
new Circle(200,280,70,Color.white),
new Circle(220,190,5,Color.black),
new Circle(180,190,5,Color.black)};
// 長方形(雪だるま口、眉左右)を管理
Rectangle[] rectangle={
new Rectangle(200,210,0,10,20,Color.black),
new Rectangle(220,180,160,8,16,Color.black),
new Rectangle(180,180,20,8,16,Color.black)};
// 描画メソッド
public void paint(Graphics g){
// 空、地面、円、長方形の順に描く
g.setColor(Color.black);
g.fillRect(0,0,600,400);
g.setColor(Color.lightGray);
g.fillRect(0,230,600,180);
for(int i=0;i<=4;i++){
g.setColor(circle[i].color);
g.fillOval(circle[i].x,circle[i].y,circle[i].a,circle[i].a);
}
for(int i=0;i<=2;i++){
g.setColor(rectangle[i].color);
g.fillPolygon(rectangle[i]);
}
}
// main
public static void main(String[] args){
Option1109 frame=new Option1109("Option1109");
frame.setSize(600,400);
frame.setVisible(true);
}
}
// 円のクラス
class Circle{
// 始点の座標x、y、直径a
int x,y,a;
// 色color
Color color;
// コンストラクタ
Circle(int x0,int y0,int r0,Color color0){
x=x0-r0;
y=y0-r0;
a=r0*2;
color=color0;
}
}
// 長方形のクラス
class Rectangle extends Polygon{
Color color;
// コンストラクタ
// 中心の座標、角度、幅、長さを受けて座標を決定する
Rectangle(int x0,int y0,int a,int w,int l,Color color0){
super();
remake(x0,y0,a,w,l,color0);
}
// 再定義
void remake(int x0,int y0,int a,int w,int l,Color color0){
reset();
addPoint((int)(x0+l*Math.cos(a*Math.PI/180)/2+w*Math.sin(a*Math.PI/180)/2),
(int)(y0-l*Math.sin(a*Math.PI/180)/2+w*Math.cos(a*Math.PI/180)/2));
addPoint((int)(x0+l*Math.cos(a*Math.PI/180)/2-w*Math.sin(a*Math.PI/180)/2),
(int)(y0-l*Math.sin(a*Math.PI/180)/2-w*Math.cos(a*Math.PI/180)/2));
addPoint((int)(x0-l*Math.cos(a*Math.PI/180)/2-w*Math.sin(a*Math.PI/180)/2),
(int)(y0+l*Math.sin(a*Math.PI/180)/2-w*Math.cos(a*Math.PI/180)/2));
addPoint((int)(x0-l*Math.cos(a*Math.PI/180)/2+w*Math.sin(a*Math.PI/180)/2),
(int)(y0+l*Math.sin(a*Math.PI/180)/2+w*Math.cos(a*Math.PI/180)/2));
color=color0;
}
}
- g440608 目をドラッグできる.目以外からドラッグすると,
java.lang.NullPointerExceptionが発生してしまう.