ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Javaの課題丸投げコミュのランダムな色と大きさの長方形をランダムな位置に次々に表示するフレーム

  • mixiチェック
  • このエントリーをはてなブックマークに追加
課題
ランダムな色と大きさの長方形をランダムな位置に次々に表示するフレームを作りなさい.なお,表示の終了条件は描画した長方形の総面積がフレームの面積を超えた時とする(長方形が重なった場合も表示総面積に加えることとする)。


教科書を見ながら書きましたが、コンパイル時にエラーが出るのでこれに手を加える感じでよろしくお願いします。


import java.awt.*;
import java.util.*;

class R5_1
{
public void paint( Graphics g )
{
Random random = new Random();
double area = 0.0;

while( area < 250000.0 )
{
int red = random.nextInt( 256 );
int green = random.nextInt( 256 );
int blue = random.nextInt( 256 );
Color c = new Color( red, green, blue );

int px = random.nextInt( 200 );
int py = random.nextInt( 300 );
g.setColor( c );
area += px * py;
}
}

public static void main( String [] args )
{
R5_1 rcf = new R5_1();

rcf.setSize( 500, 500 );
rcf.setTitle( "ランダムな長方形" );
rcf.setVisible( true );
}
}

コメント(25)

> 教科書を見ながら書きましたが、コンパイル時にエラーが出るのでこれに手を加える感じでよろしくお願いします。
手を加えました。

package iceman;

/* remove
import java.awt.*;
import java.util.*;
*/

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.UIManager;

public class R5_1 extends JFrame {

 private static final long serialVersionUID = -4569467927269047759L;

 public R5_1() {
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

 @Override
 public void update(Graphics g) {
  paint(g);
 }

 @Override
 public void paint(Graphics g) {
  /* remove
   Random random = new Random();
   double area = 0.0;

   while( area < 250000.0 )
   {
   int red = random.nextInt( 256 );
   int green = random.nextInt( 256 );
   int blue = random.nextInt( 256 );
   Color c = new Color( red, green, blue );

   int px = random.nextInt( 200 );
   int py = random.nextInt( 300 );
   g.setColor( c );
   area += px * py;
   }
   */
  super.paint(g);
  int frameArea = getWidth() * getHeight();
  int totalRectArea = 0;
  Random r = new Random();
  while (totalRectArea < frameArea) {
   Rectangle rect = new Rectangle();
   rect.setLocation(r.nextInt(getWidth()), r.nextInt(getHeight()));
   rect.setSize(r.nextInt(getWidth() - rect.x), r.nextInt(getHeight()
     - rect.y));
   g.setColor(randomColor(r));
   g.drawRect(rect.x, rect.y, rect.width, rect.height);
   System.out.println(getWidth() + ", " + getHeight());
   System.out.println(rect);
   totalRectArea += rect.width * rect.height;
  }
 }

 private Color randomColor(Random r) {
  return new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
 }

 public static void main(String[] args) {
  EventQueue.invokeLater(new Runnable() {

   public void run() {
    try {
     UIManager.setLookAndFeel(UIManager
       .getSystemLookAndFeelClassName());
    } catch (Exception e) {
     e.printStackTrace();
    }
    R5_1 rcf = new R5_1();

    rcf.setSize(500, 500);
    rcf.setTitle("ランダムな長方形");
    rcf.setVisible(true);
   }
  });
 }
}
教科書に載っているのはこんな感じのランダムな円に関するプログラムでそれを参照してプログラムを書くという課題なんですが、教科書のものでも同じエラーが出ます。
これに沿った形で一部を換えるだけで書いて欲しいです。


import java.awt.*;
import java.util.*;

class RandomCircleFrame
{
public void paint( Graphics g )
{
Random random = new Random();
double area = 0.0;

while( area < 1000000.0 )
{
int red = random.nextInt( 256 );
int green = random.nextInt( 256 );
int blue = random.nextInt( 256 );
Color c = new Color( red, green, blue );

int px = random.nextInt( 500 );
int py = random.nextInt( 500 );
int r = random.nextInt( 20 )+1;
g.setColor( c );
g.fillOval( px, py, 2 * r, 2 * r);
area += Math.PI * r * r;
}
}

public static void main( String [] args )
{
RandomCircleFrame rcf = new RandomCircleFrame();

rcf.setSize( 500, 500 );
rcf.setTitle( "ランダムな円" );
rcf.setVisible( true );
}
}
java始めて10時間ぐらいなので間違っているかもしれませんが、
class RandomCircleFrame
を
class RandomCircleFrame extends Frame
にしてあげるとコンパイルとおりましたよ。

java /*file name*/ では何故か実行できなかったですけど。
ほんとだ。ありがとう。
でも私の書いたものは長方形が表示されない。
>4
書いていないから表示されない。
2とトピックのg.setColorのあとの書き方を見比べて見てください。
何かが足りない。

>3
java /*class name*/
です。
.classはつけません。
ありがとうございます。
実行できました。
でも終了が出来ませんでした。

まだコンソールでしか扱ったことが無いので、早く
グラフィックスで描けるようになりたいです。
俺の書いたやつのpaintメソッドの中身を氷男さんのpaintに書くのじゃ駄目ですか?
>7
あとrandomColorも追加ですね。

たぶん、その理由で使えなかったのかなとか考えます。

よくわからない記述や、特殊(本来は全然そんなことないんですけど)な起動方法のため、実行できなかったのかなと思います。

javaコマンドを打ちたいフォルダ(コマンドプロンプトなら左側に書いてある)の下にicemanフォルダを作って
そのというフォルダの中にjavacしてでできた.classをいれて、
java iceman.R5_1
とうてば実行できます。
(1行目のpackageという記述のためです)

・・・難しいなぁ

ちなみに、javaのバージョンが1.50以上でなければコンパイルできません。
これじゃ何に対して書いているのか分かりませんね

かずきちさんのプログラムを起動する方法です。
>かずきちさん
せっかく書いてくれて申し訳ないですが、私のを数行書き換えと付け足しするだけでいけるように思います。
あとかずきちさんのでやってみると次々に表示されるのではなくて、表示し終わった状態が現われるように思います。
(長方形の面積が大きいからすぐにフレームの面積に辿り着いて表示が終わってしまっているだけかな)
だから俺のを参考に付け足せないですか?

次々に表示ってぱらぱらぱら〜〜っとアニメーションしないと駄目なのでしょうか?

# 難しいだろうと思われるのは、ある程度意図的にやってたりします
付け足してみました。
四角形にしてみました。
ウィンドウ閉じれるようにしてみました。
そのまま実行すると無限ループします。
一文字くらい足して実行してください。

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;

class RandomCircleFrame extends Frame {
 public void paint(Graphics g) {
  Random random = new Random();
  int area = 0;
  int frameArea = getWidth() * getHeight();

  while (area < frameArea) {
   int red = random.nextInt(256);
   int green = random.nextInt(256);
   int blue = random.nextInt(256);
   Color c = new Color(red, green, blue);

   int px = random.nextInt(500);
   int py = random.nextInt(500);
   int width = random.nextInt(20) + 1;
   int height = random.nextInt(20) + 1;
   g.setColor(c);
   g.fillRect(px, py, width, height);
   area = width * height;
  }
 }

 public static void main(String[] args) {
  final RandomCircleFrame rcf = new RandomCircleFrame();
  rcf.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });
  rcf.setSize(500, 500);
  rcf.setTitle("ランダムな四角");
  rcf.setVisible(true);
 }
}
> 氷男さん
2の教科書を元にするのであれば
アニメーションはありえないと思いますけどね。

もし"アニメーションに見える"のであれば
paintの処理が重く、表示に追いついていないだけなので。
(ん?この表現でいいのかな?)

非常によくない方法ですけど
while (area < frameArea) {
/*中略*/
try {
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
とすればそれっぽく表示できます。
似た課題ですが、
ランダムな色と大きさの長方形をランダムな位置に次々に表示し続けるフレームを作りなさい.ただし,表示されている図形の情報を全て記録しておき,表示されている図形の数が100を越えないよう,古いものから消去するようにしなさい.

だとどうなりますか?
これに少し手を加えるだけでシンプルにお願いします。


import java.awt.*;
import java.util.*;

class R5_2 extends Frame {
public void paint(Graphics g) {
Random random = new Random();
int area = 0;
int frameArea = getWidth() * getHeight();

while (area < frameArea) {
int red = random.nextInt(256);
int green = random.nextInt(256);
int blue = random.nextInt(256);
Color c = new Color(red, green, blue);

int px = random.nextInt(500);
int py = random.nextInt(500);
int width = random.nextInt(20) + 1;
int height = random.nextInt(25) + 1;
g.setColor(c);
g.fillRect(px, py, width, height);
area += width * height;
}
}

public static void main(String[] args) {
R5_2 rcf = new R5_2();

rcf.setSize(500, 500);
rcf.setTitle("ランダムな四角");
rcf.setVisible(true);
}
}
前と同じノリの手のくわえかたじゃ無理だと思います

いくつか質問があるので答えて下さい
1.次々って具体的にどれくらいの間隔ですか?
2.これもアニメーションしないと駄目なんですか?
3.個人的にはスレッド使いたいのですが習ってますか?
4.課題の文章は一字一句あますことなくここに書いてますか?少しでも自分で変えた箇所があるばあいは、お手数ですが問題文を一字一句間違えずに教えて下さい

次は書き直したくないので答えて下さい
宜しくお願いします
1、2は早くてもいいです。教科書に載っている例のプログラムは早いので。100を越えたら消えていくのでかなり早いアニメーションになると思います。
3は授業では習ってません。
4は課題の文章では「好きな図形」となっていますが、前と同じでもいいので四角としました。
基本的にこの課題が出されているのはJAVA言語でのプログラミングの初心者なので、数行書き換えるだけでいけるように思っていますが無理なのでしょうか。
あと回答のソースコードを書いていただけるなら使った知識が載っている本を紹介して欲しいです。私もこのコミュニティの回答者さんのようにプログラムを書けるようになりたいので。
宜しくお願いします。

私のJAVA言語プログラミング知識は「やさしいJAVA」を自主的に読んだくらいです。教科書は不親切な感じなのであんまり読んでないし、読んだ所で課題が解決するのは一部だけなので、アシスタントなしで課題をこなす為に教科書とは別に「やさしいJAVA」を買いましたが、授業の課題の解決に繋がるような事は書いてませんでした。
プログラムを書けるようになりたいなら…
最初のうちは1冊や2冊じゃなくて10冊20冊くらい読む意気込みでいたほうがいいと思いますよ。
本を見ながら色々試行錯誤して書いてると、あるとき一気に理解度が高まるときがくると思います。
大体最初は、書いたコードがトータルで五万行になるくらいを目指せばいいと思います。

やさしいJavaにある内容をちゃんと理解してれば十分解ける程度の問題だと思います。
後、わざわざmainメソッドの中からWindowListenerの登録メソッドを消してくれてますが、これだとウィンドウ閉じてもアプリケーションが終了しなくないですか?
「やさしいJAVA」のどこを読めば解けるのでしょうか。
全部。
あれに書いてある内容でいらない部分を探すほうが難しい。
消したのはコンパイル時にエラーが出たからです。
それにフレームを消せるようにする技術は習ってないので。
Ctrl+C で強制的に消す、という手段が教科書に書いてありました。
ちなみに101個目を表示するときに1個目に表示した四角形はどうやって消せって先生言ってました?
その回の授業を欠席していたので聞いてません。
「やさしいJAVA」では該当箇所がどこかも分かりません。
だからここで聞きました。
あぁそう…欠席ですか。

やさしいJavaは一通り穴があくくらい読んですべて理解するといですよ。
やさしいJavaの内容はJavaやるなら全部しっとかないと駄目ってくらいの内容だと思ってるので。

それと、プログラムは同じ動作を実現するために無限の書き方があります。
アルゴリズムが違ったり、アルゴリズムが同じでも違う表現を使っていたり…
ということで、やさしいJavaみたいなJavaの基本が解説してあるだけの本に課題の答えそのものに該当するコードがあることなんてありません。

しいて言えばコレクションクラスについて言及してるあたりが参考になると思います。
あとは描画部分はAppletについて書いてある所に、ひょっとしたら参考になるものがあるかもしれません。
GUIのプログラムについて知りたいなら、SwingやAWTについて書かれてる書籍を自分のわかりやすいものを選んで買うといいです。
私はSwingの本買ったことないんで、どれがいいかはお勧めできません。

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

class R5_2 extends Frame {
 public void paint(Graphics g) {
  List<Rectangle> rects = new LinkedList<Rectangle>();
  
  Random random = new Random();

  while (true) {
   if (rects.size() >= 100) {
    Rectangle eraseRect = rects.remove(0);
    g.setColor(this.getBackground());
    g.fillRect(eraseRect.x, eraseRect.y, eraseRect.width, eraseRect.height);
   }
   int red = random.nextInt(256);
   int green = random.nextInt(256);
   int blue = random.nextInt(256);
   Color c = new Color(red, green, blue);
   
   Rectangle current = new Rectangle();
   current.x = random.nextInt(500);
   current.y = random.nextInt(500);
   current.width = random.nextInt(20) + 1;
   current.height = random.nextInt(25) + 1;
   g.setColor(c);
   g.fillRect(current.x, current.y, current.width, current.height);
   rects.add(current);
  }
 }

 public static void main(String[] args) {
  R5_2 rcf = new R5_2();
  
  rcf.setSize(500, 500);
  rcf.setTitle("ランダムな四角");
  rcf.setVisible(true);
 }
}

とりあえず厳密には課題をクリアしてないコードです。
101個目が描画される前に、1個目に該当する矩形を背景色で塗りつぶしています。
101個目が表示されるまえに1個目の四角形に重なって表示された四角形があるとおかしくなります。
まぁ早いんで人間の目ではわからないと思いますが。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Javaの課題丸投げ 更新情報

Javaの課題丸投げのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。