古い課題1

ランダムにカードを引いて集めることを考える。 そのために、部分的に開発したソフトウェア gacha の仕様の一部 の説明を別に示した。 さて、以下の設問において kotae パッケージを作り、 その中に指定されたクラスを作成せよ。

なお、テストクラスを用意したので、各設問 において、指示のあるテストクラスを用いてテストを行い、正常であった旨を 報告せよ。

課題1-1

player/Statistics1 を10回実行して、3種類のカードが揃うまでの回数を計測 し、平均値を求めなさい。

課題1-2

レア度 100 のカードを表す クラス Rare をkotae パッケージに作成しなさい。 なお、 kotae.Rare.getList() により、 (id=10, name="RareAka"), (id=11, name="RareAo"), (id=12, name="RareKuro"), となる 3 つのインスタンスの List<Card> 型のインスタンスが得られ るようにすること。

なお、テスト用にRareTestプログラムを 用意したので、活用すること。

課題1-3

作成した RareAka, RareAo, RareKuro と既存の Aka, Ao, Kuro を混ぜた Deck2 と、それを使う Main2, Statistics2 を示す。

gacha/Deck2.java


package gacha;
import java.util.List;
import kotae.Rare;
import card.Card;
import card.Zako;
public class Deck2 extends AbstractDeck {
	public static List<Card> getList(){
		List<Card> list= Zako.getList();
		list.addAll(Rare.getList());
		return list;
	}
	public Deck2(){
		super(getList());
		bunpu = new Bunpu1(this);
	}
}

player/Main2.java


package player;
import gacha.Deck2;
import java.io.IOException;
public class Main2 {
	public static void main(String[] args) throws IOException {
		new Player().play(new Deck2());
	}
}

player/Statistics2.java


package player;
import gacha.Deck2;
public class Statistics2 {
	public static void main(String[] arg){
		int[] watchlist = {0,1,2,10,11,12};
		Statistics s = new Statistics(watchlist, new Player(), new Deck2());
		s.calc();
	}	
}

Statistics2 を10回実行して、6種類のカードが揃うまでの回数を計測 し、平均値を求めなさい。

課題1-4

次に、プレイヤーの手の揃い具合により、確率が変動するようなカード種 SuperRare を考える。 これは、カード種に対してプレイヤーの所持カードを見せることで、レア度を 変えるようにする。 つまり、まず、以下のようなメソッドを作成する。

  1. CardCollection クラスのインスタンスをコンストラクタに与える。
  2. そして、SuperRare クラスではこの CardCollection を使い、alreadyOwned メソッドにより、特定のカード種を持っているかどうかを調べられるようにす る。
  3. 揃えるべきカードが残り何枚かを数えるために、全カードの見本リストを 与える setMokuhyou メソッドを作る

ここまでを作成したクラスをAbstractSuperRareとして以下に示す。

card/AbstractSuperRare.java


package card;
import java.util.List;
import kotae.SuperRare;
import player.CardCollection;
public abstract class AbstractSuperRare extends AbstractCard {
	private CardCollection cardcollection;
	protected int zenmaisuu;
	protected List<SuperRare> mokuhyou;
	protected AbstractSuperRare(int id, String name,CardCollection cardcollection){
		super(id,name);
		this.cardcollection=cardcollection;
	}
	protected final boolean alreadyOwned() {
		return cardcollection.contains(this);
	}
	protected final void setMokuhyou(List<SuperRare> list) {
		this.mokuhyou = list;
		this.zenmaisuu = list.size();
	}
}

このクラスを継承し、次の仕様を持つ rate メソッドと、getList スタティッ クメソッドを実装する SuperRare クラスを kotae パッケージに作りなさい。

  1. rate は次の値を返す
    1. 基本的には 100 を返す
    2. 揃う残り2種類の時は、持っていないカードのレア度は 10倍
    3. 揃う残り1種類の時は、持っていないカードのレア度は 100倍
  2. kotae.SuperRare.getList() により、 (id=20, name="SuperRareAka"), (id=21, name="SuperRareAo"), (id=22, name="SuperRareKuro"), となる 3 つのインスタンスの List<SuperCard> List<SuperRare> 型のインスタンスが得られ るようにすること。

なお、テスト用 にSuperRareTestプログラム を用意したので、活用すること。

課題1-5

作成した SuperRareAka, SuperRareAo, SuperRareKuro と既存の Aka, Ao, Kuro を混ぜたDeck3 と、それを使う Main3, Statistics3 を示す。

gacha/Deck3.java


package gacha;
import java.util.List;
import kotae.SuperRare;
import player.CardCollection;
import card.Card;
import card.Zako;
public class Deck3 extends AbstractDeck {
	public static List<Card> getList(CardCollection cardcollection){
		List<Card> list= Zako.getList();
		list.addAll(SuperRare.getList(cardcollection));
		return list;
	}
	public Deck3(CardCollection cardcollection){
		super(getList(cardcollection));
		bunpu = new Bunpu3(this);
	}	
}

player/Main3.java


package player;
import gacha.Deck3;
import java.io.IOException;
public class Main3 {
	public static void main(String[] args) throws IOException {
		Player player = new Player();
		player.play(new Deck3(player.collection));
	}
}

player/Statistics3.java


package player;
import gacha.Deck3;
public class Statistics3 {
	public static void main(String[] arg){
		int[] watchlist = {0,1,2,20,21,22};
		Player player = new Player();
		Statistics s = new Statistics(watchlist, player, new Deck3(player.collection));
		s.calc();
	}	
}

Statistics3 を10回実行して、6種類のカードが揃うまでの回数を計測 し、平均値を求めなさい。

課題1-6

「不当景品類及び不当表示防止法」4条の2や、告示された 「懸賞による景品類の提供に関する事項の制限」の第5項などを参照し、 本課題における実験結果と比較して、なぜこのような法律があるのか考察しな さい。

発展課題1-7

3種類のカードがそれぞれ確率1/3で出るとき、繰り返し引いて全種類揃うまで の平均試行回数を求めなさい。

なお、以上の提供したファイルをすべてまとめた 課題ファイル集 を用意した。

おまけ

Eclipse のセッティングの方法

  1. Java のプロジェクトを作成する
  2. 右クリックで properties を選択し、Text file encoding を UTF-8 にする。
  3. 課題ファイル集(5月16日版) をダウンロードする。
  4. プロジェクトを右クリックし、import を選ぶ
  5. General の中の Archive file を選ぶ
  6. ダウンロードしたファイルを選択すると、 src の中にファイルが取り込 まれる
  7. test パッケージ中のエラーが出ているファイルを開き、ソースコードの上部の org.junit の波線付近にカーソルを当てると、いくつか改善のための選択肢が出る。そのうち fix Project setup を選ぶと、Add JUnit4 Library ... の表示が出るので、 Ok を押す

なお、問題訂正などでプログラムが変更になった場合、上記の最新のファイル 集をダウンロードした後で、作業中のプロジェクトでもう一度importして下さ い。 上書きするファイルが検出されるとダイアログが表示されますが、 Yes ALL で問題だけ最新の状態になるはずです。


坂本直志 <[email protected]>
東京電機大学工学部情報通信工学科