[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
一応ここにも置いておきます。
ランダムに画像が出て3コマ漫画になる。
--->kadai_randomcomic.java
package application;
import javafx. application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx. scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx. stage.Stage;
public class kadai_randomcomic extends Application {
Image[] myImage = new Image[12];
int boxX = 300;
int boxY = 180;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage myStage) {
Canvas canvas = new Canvas(300,600);
GraphicsContext gc = canvas.getGraphicsContext2D();
BorderPane pane = new BorderPane();
pane.setStyle("-fx-background-color:white;");
//画像に関して
myImage[0] = new Image("img1.png");
myImage[1] = new Image("img2.png");
myImage[2] = new Image("img3.png");
myImage[3] = new Image("img4.png");
myImage[4] = new Image("img5.png");
myImage[5] = new Image("img6.png");
myImage[6] = new Image("img7.png");
myImage[7] = new Image("img8.png");
myImage[8] = new Image("img9.png");
myImage[9] = new Image("img10.png");
myImage[10] = new Image("img11.png");
myImage[11] = new Image("img12.png");
//ボタンに関して
Button btn01 = new Button("random comic start");
btn01.setOnAction((ActionEvent event)->{
int ran = (int)(Math.random()*3);//ランダム
int ran2 = (int)(Math.random()*5+3);
int ran3 = (int)(Math.random()*4+8);
System.out.println("ran is"+ran);
gc.drawImage(myImage[ran], 0, 0, boxX, boxY);
gc.drawImage(myImage[ran2], 0, 200, boxX, boxY);
gc.drawImage(myImage[ran3], 0, 400, boxX, boxY);
});
HBox hbox = new HBox();
hbox.getChildren().addAll(btn01);
hbox.setAlignment(Pos.CENTER);
pane.setTop(hbox);
pane.setCenter(canvas);
Scene scene = new Scene(pane,300,600);
myStage.setTitle("Exe28 random comic");
myStage.setScene(scene);
myStage.show();
}
}
共有にありますが一応ここにもコード置いておきます。
EXE28の発展形。
--->kadai_EXE28.java
package application;
import javafx. application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx. scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx. stage.Stage;
public class kadai_EXE28 extends Application {
Image[] myImage = new Image[5]; //配列で画像をランダム決定
int boxX = 50; //画像を表示させるときの枠のサイズ 初期値50
int boxY = 50;
int setY = 10; //画像初期表示位置
int cnt = 0; //ボタンを押した回数
int last_ran; //最後に出たランダムの数を格納する
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage myStage) {
Canvas canvas = new Canvas(300,240);
GraphicsContext gc = canvas.getGraphicsContext2D();
//画像に関して
myImage[0] = new Image("tako.png");
myImage[1] = new Image("oosan.png");
myImage[2] = new Image("human.png");
myImage[3] = new Image("panda.png");
myImage[4] = new Image("abura.png");
//ボタンに関して
Button btn01 = new Button("このボタンを5回押す");
Button btn02 = new Button("画像を消す");
Label l1 = new Label(" "); //はじめはからっぽ
Label l2 = new Label(" ");
BorderPane pane = new BorderPane();
pane.setStyle("-fx-background-color:white;");
HBox hbox = new HBox();
hbox.getChildren().addAll(btn01); //,btn02);
VBox vbox = new VBox();
vbox.getChildren().addAll(l1,l2,btn02); //まずここでVboxのpaneを作っていれる
btn01.setAlignment(Pos.CENTER);
hbox.setAlignment(Pos.CENTER);
vbox.setAlignment(Pos.CENTER);
pane.setTop(hbox);
pane.setBottom(vbox);
pane.setCenter(canvas);
//関数
btn01.setOnAction((ActionEvent event)->{
if(cnt<5) { //5回押してないとき
int ran = (int)(Math.random()*5);//ランダム
System.out.println("ran is"+ran);
gc.drawImage(myImage[ran], 10, setY, boxX, boxY);
boxX *= 1.65;
boxY *= 1.65;
setY += -2;
cnt ++;
last_ran = ran;//ランダムの数を格納
System.out.println("cnt is"+cnt);
}
if(cnt==5) { //5回押したときにメッセージを出す
if(last_ran==0) {
l1.setText("あなたの今日のラッキーいきものはタコ!");
l2.setText("賢いコーティングを心がけるといいでしょう");
}else if(last_ran==1) {
l1.setText("あなたの今日のラッキーいきものはオオサンショウウオ!");
l2.setText("水気のあるコーティングを心がけるといいでしょう");
}else if(last_ran==2) {
l1.setText("あなたの今日のラッキーいきものは人間!");
l2.setText("人間味のあるコメントを入れるといいでしょう");
}else if(last_ran==3) {
l1.setText("あなたの今日のラッキーいきものはパンダ!");
l2.setText("白黒はっきりしたデザインを組んでみるといいでしょう");
}else if(last_ran==4) {
l1.setText("あなたの今日のラッキーいきものはアブラボウズ!");
l2.setText("おいしいご飯をたべて元気を出しましょう");
}
}
});
btn02.setOnAction((ActionEvent event)->{
//System.out.println("here is in clear");
gc.clearRect(0, 0, 500, 500);
boxX = 50;//初期値に戻す
boxY = 50;
setY = 10;
cnt = 0;
l1.setText("");
l2.setText("");
System.out.println("cnt is"+cnt);
});
Scene scene = new Scene(pane,300,350);
myStage.setTitle("Exe28 今日の占い");
myStage.setScene(scene);
myStage.show();
}
}
自習
まだ考えるところ:
スライムA、B、Cという名前を付けるには??
先生に解決してもらったエラー:
1.
主人公がおなくなりになるpublic void death() をstaticにしていた。(ばってんがついてエクリプスがstaticにしましょうといった)
ここはstaticだと、主人公パーティーヒーロー全滅になるらしい。なぜだかまだわからない。staticでまずいのはわかった。
実はstaticの説明を読んでもよくわかってない。要再考。
2.
1.に関連し、Slimeのpublic void attack(Hero h) { で、
h.death();に直す。ここはHero.death();としていた。
とりあえずもう一度自分で1から作ってみる。
package hukusyu;
public class Main01 {
public static void main(String[] args) {
//主人公生成
Hero h = new Hero();
h.name = "みなと";
h.hp = 25;
h.ap = 100;
System.out.println("Hero "+h.name+"生成しました");
System.out.println("hp:"+h.hp+" ap:"+h.ap);
System.out.println("");
//モンスター生成
Monster[] monsters = new Monster[3];
monsters[0] = new Slime();
monsters[1] = new Slime();
monsters[2] = new Slime();
//おそらくこの前に武器装備とかの選択がある。
//目的地に移動(選択)
//主人公がフィールドにいればランダムで敵に遭遇する
//別の町で新たな装備ゲット
//とかか。
System.out.println("モンスターに遭遇、戦闘開始します---");
for(Monster m : monsters) {
h.attack(m);
m.attack(h);
}
}
}
package hukusyu;
public class Hero {
//基本フィールド
String name;
int hp;
int ap;
Hero(){//何も設定されてないテスト用主人公なら
this.hp = 10000;
this.ap = 10000;
this.name = "テスト用主人公";
}
//voidは戻り値なしの意味
//publicは事実上の制限範囲なし
//public voidの次にメソッド名を記述する
public void attack(Monster m) {
System.out.println(this.name+"の攻撃!");
System.out.println(this.ap+"のダメージ!");
m.hp -= this.ap;
}
//staticはnewされなくてもメモリに生成される
public void death() {
System.out.println(this.name+"はしんでしまった!");
System.out.println("game over");
}
//自動生成
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getAp() {
return ap;
}
public void setAp(int ap) {
this.ap = ap;
}
}
package hukusyu;
public abstract class Monster{
//Monsterに関する「ざっくりした」設定
//abstractは抽象メソッドの意味
//すなわち通常下位になにかある
int hp;
int ap;
String name;
public void attack(Hero h) {
System.out.println(this.name + "の反撃!");
System.out.println("主人公側に10ポイントのダメージをあたえた!");
h.hp -= 5;
}
public void run(Monster m) {
System.out.println(m + "は逃げ出した!");
}
}
package hukusyu;
public class Slime extends Monster{
String name = "スライム";
int hp = 120;
int ap = 10;//スライムの攻撃力
//char suffix;
public void attack(Hero h) {//override
System.out.println(this.name + "のでろでろ攻撃!");
System.out.println(h.name+"に"+this.ap+"のダメージをあたえた!");
h.hp -= this.ap;
if(h.hp <= 0) {
h.death();
}
}
//getter/setter自動生成
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getAp() {
return ap;
}
public void setAp(int ap) {
this.ap = ap;
}
}
android stadio
SDKがみつからない
→保留で!
多態性の続き
p508
wizard,Main509をつくる
--->Main512.java
public class Main512 {
public static void main(String[] args) {
Slime s = new Slime();
Monster m = new Slime();
s.run();
m.run();
}
}
--->Monster.java
public abstract class Monster {
public void run() {
System.out.println("モンスターは逃げ出した");
}
}
--->Slime.java
public class Slime extends Monster{
public void run() {//override
System.out.println("スライムはぴょんぴょん逃げ出した");
}
}
最初ばってんがMainのMonster m = new Slime();部分についたが、
①Monster.javaのabstractが抜けていた
②Slime.javaのextends Monsterが抜けていた
実行結果
スライムはぴょんぴょん逃げ出した
スライムはぴょんぴょん逃げ出した
箱の型:どのメソッドを呼べるか
中身の型:メソッドが呼ばれたらどう動くか
奥の手が「キャスト」
キャスト? 聞いたことあるな?
あまり手段としてはよろしくないらしい
--->Main517.java
public class Main517 {
public static void main(String[] args) {
Character c = new SuperHero();
//Character c = new Wizard();
if(c instanceof SuperHero) {//trueのときのみキャスト
SuperHero sh=(SuperHero) c;//キャスト
System.out.println("c is SuperHero ins.");
sh.fly();
}else {
System.out.println("c is not SuperHero ins.");
}
}
}
多態性のメリット
スライム、ゴブリン、蝙蝠を配列Monsterにぶちこんでfor文でまとめて攻撃できる
ところでHeroにエラーが出るようになりますね。
エラーが出るHero.java--->
public class Hero extends Character{
String name = "ミナト";
int hp = 100;
public void attack(Monster m){
System.out.println(this.name + "の攻撃!");
System.out.println("10ポイントのダメージをあたえた!");
m.hp -= 5;
}
public void run() {
System.out.println(this.name + "は逃げ出した!");
}
public final void slip(){ /* finalがついているslip()メソッドは子クラスでオーバーライド禁止 */
this.hp -= 5;
System.out.println(this.name + "は転んだ!");
System.out.println("5のダメージ");
}
public int getHp() {
return this.hp;
}
public void setHp(int hp) {
this.hp = hp;
System.out.println("Heroポイント" + hp);
}
}
エラー2件ですね。
どう解決する??
ヒント:直すのはHeroではない
→
Character.javaのここを修正
→
public abstract void attack(Monster m);
Monster.javaの
→
int hp;
さて配列をfor文でぶん回して敵を一掃しますよ
--->Main523.java
public class Main523 {
public static void main(String[] args) {
Monster[] monsters = new Monster[3];
monsters[0] = new Slime();
monsters[1] = new Goblin();
monsters[2] = new DeathBat();
for(Monster m : monsters) {
m.run();
}
}
}
--->出力結果
スライムはぴょんぴょん逃げ出した
ゴブリンはだだだと逃げ出した
蝙蝠は逃げ出した
これが「ゆるく定義」することのメリット。
呼び出す側はざっくりMonsterというくくりで呼び出し、
呼び出された側はそれぞれの種族による逃げ方で逃げるという動作をしている
インターフェース:
public class Creature{
}
のかわりに
public interface Creature{
}
とインターフェースは宣言できる
・とにかくあいまい
・子クラスが普通たくさん
インターフェースはimplementsというキーワードを使って継承する(extendsじゃない)
・ふつうのextendsの時は多重継承を許可していない
・implementsは多重継承ができる。2つでも3つでも可。なぜか。親がふたつともインターフェースということは、中身はからっぽのメソッドだから混乱が発生しない。
どうせ自分の中でオーバーラードするため。
android stadio
最新版をDLする
https://developer.android.com/studio/?hl=ja
とりあえずインストは午後から
教科書p491
打ち込みはしたが何にも理解できないな?
しゃあない上から見ていってみましょう。
①最上位インターフェース
--->Things.java
public interface Things {
double getWeight();
void setWeight(double weight);
}
・double型でgetWeightを宣言。なかみはない。たぶん。
・そのsetterをつくってる。おわり。
②レベル2の「すべての資産」クラス
public abstract class Asset {
private String name;
private int price;//無形資産に値段はあるとのこと!
public Asset(String name, int price) {
this.name=name;
this.price=price;
}
//automatic create
public String getName() {
return this.name;
}
public int getPrice() {
return this.price;
}
}
ここで起こっていること:
・このひとは最上位インターフェースを受け継ぐ宣言がないな?
・abstractがclassの前に付いているので、これが抽象クラスと分かる。よってこの部分はインスタンス化できずミスから保護される。
・private String name;
private int price;
が宣言。
③レベル3の「有形資産」のクラス
--->TanbibleAsset.java
public abstract class TanbibleAsset extends Asset implements Things{
private String color;
private double weight;
public TanbibleAsset(String name, int price, String color) {
super(name, price);
this.color = color;
}
//自動生成
public String getColor() {
return this.color;
}
public double getWeight() {
return this.weight;
}
public void setWeight(double weight) {//たぶんオーバーライド
this.weight = weight;
}
}
ここで行われていること:
extends Assetとimplements Thingsの二重継承
abstractがclassの前に付いているので抽象クラスである。newできない。
colorとweightの宣言
びっくりするぐらいざっくりとsuperで継承。どっちから継承するかすら書いてない。スゴイ。これがjavaか。(可能性的に)継承先はAssetしかない。
④レベル4の「本」とか「こんぴゅーた」のクラス
--->Book.java
//package exercise;
public class Book extends TanbibleAsset{
private String isbn;
public Book(String name, int price, String color, String isbn) {
//this.name = name;
//this.price = price;
//this.color = color;
super(name,price,color);
this.isbn = isbn;
}
public String getIsbn() { return this.isbn; }
}
・TanbibleAssetをextends
・bookが新たに持たされたフィールドは、isbnだけである。
--->computer.java
//package exercise;
public class Computer extends TanbibleAsset{
//親クラスに持たせたためコメントアウトす
//private String name;
//private int price;
//private String color;
private String makerName;
public Computer(String name, int price, String color, String makerName) {
//this.name = name;
//this.price = price;
//this.color = color;
super(name,price,color);
this.makerName = makerName;
}
//public String getName() { return this.name; }
//public int getPrice() { return this.price; }
//public String getColor() { return this.color; }
public String getMakerName() { return this.makerName; }
}
TanbibleAssetをextendsしている
ここでも親が持ってるものはsuperでぶん投げ。
コンピュータで新たに持たされたフィールドはMakerNameのみ。
◎実行用
--->Main491.java
public class Main491 {
public static void main(String[] args) {
Book b = new Book("本1",1000,"黄色","1234");
Computer c = new Computer("PC1",1000,"黒","SONY");
b.setWeight(10);
c.setWeight(20);
System.out.println(b.getName()+ "の重さ:" + b.getWeight());
System.out.println(c.getName()+ "の重さ:" + c.getWeight());
}
}
色と太字をつけてやっと構造が理解できた。
多態性:
とりあえず親の型の箱に入れるという性質
Character - SuperHero
今まで:
SuperHero h = new SuperHero();
多態性の記述:
Character c = new SuperHero();
is-aの関係
superhero is a character → ok
スーパーヒーローはキャラクターだ。ありだ。
ただにんげんさんは聞けば常識で判断できるが、コンピューターさんはハテナなので、javaにおいて継承関係でクラスがつながっていればすっとび代入( Character c = new SuperHero(); )ができる。というわけ。
親の箱には入れることができるということ。この場合親がインターフェースであっても可能である(newはできない)
Life hoge = new Wizard();
//Lifeはインターフェース
android stadio インストール:
うさぎをぐーぐるにおくるか?とか聞かれたときだけ
Don't sendで。
あとはnextでインストール。