じゃんけんゲームを作ってみよう8

 

Javaのプログラムを配布する場合には、jar という形式をつかいます。
jarファイルは zip圧縮ファイルの親戚なので、zipで展開(解凍)することもできます。

毎度、ブログ管理人イガジーです。

コマンドでjarファイルを作るには→コマンドで jar を作る方法、あるいは
Eclipseでjarファイルを作るには→Eclipseでjarを作るを参照してください。

じゃんけんゲームで使用している画像(pngファイル)は、これまでのコードだと
jarファイルの外に置く形になってしまうので、jarファイルに取り込んでみましょう。

基本的には
imc = f.createImage((ImageProducer)url.getContent());として、urlで指定するリソースファイルを取り込むのですが、
例外処理などが必要になるので次のような感じのコードになります。

Image imc=null; // ← BufferedImage imc=null;
//... (中略)
Janken(){ // constructor
	String picname="/janken.png";
	read_imc(picname);
	wait_imc();
	// ....(中略)
} // end of constructor
void sleep(long msec) {
	try {
		Thread.sleep(msec);
	} catch (InterruptedException e) {}
}
void read_imc(String pname) {
	URL url = f.getClass().getResource(pname);
	try {
		imc = f.createImage((ImageProducer)url.getContent());
	} catch(Exception ex){
		System.out.println("not found Imagefile!");
		System.exit(1);
	}
}
void wait_imc() {
	int t;
	for (t=0;!f.prepareImage(imc,f);++t){
		sleep(10);
	}
//	System.out.printf("prepare %d0 ms\n", t);
}

何をしているかよくわからなくても、気にせず read_imc()や
wait_imc(), sleep() などを丸々コピペして使ってください。
jarにする時には、janken.png 自体も忘れずに jarに取り込んでください。

さて、次は勝敗の%表示ですが、少数点第1位まで出したいので
浮動小数点(float)を使ってみましょう。
書式指定は、”%3.1f”などとします。
ここの 3.1 というのは、整数部3桁で、小数点以下1桁 という意味です。
.2 とすると、整数部は適当(必要な桁)で、小数点以下2桁になります。
f は、float の fで、浮動小数点型という意味です。
実際のコードは次のような感じになります。

int round=ywin+pwin+draw;
resl.setText(String.format("%d戦 あなたの %d勝 %d敗 %d分け 勝率%.1f%%",
		round,ywin,pwin,draw,(float)100*ywin/round));

“%%”は%自体の表示です。

最後に、窓の大きさの調整例です(なくても別にかまいません)。
FrameやJFrameは、窓の装飾を含むサイズを指定しなければなりません。
そして、困ったことに装飾のサイズはOSやOSの設定によって変わるので
いくつにすればよいかは実行してみないとわからないのです。

ここでは、Canvasの大きさを目的のサイズになるように、Frameの大きさを
補正するメソッド例を示します。

void adjsize(){
	Dimension csz=cv.getSize();
	if ((csz.width!=CVWIDTH)||(csz.height!=CVHEIGHT)) {
		Dimension fsz=f.getSize();
		f.setSize(CVWIDTH+fsz.width-csz.width,CVHEIGHT+fsz.height-csz.height);
	}
}

ここでCVWIDTHは、キャンバスの幅、CVHEIGHTは高さです。
MyCanvas cv に対して getSize()で実際のサイズを得て、
期待しているサイズと異なっていれば、JFrame f のサイズを補正しています。
f のサイズから、cv のサイズを引くと、縁(窓装飾)の大きさが分かります。
cv として確保したいサイズに、その「縁(窓装飾)の大きさ」を加えた値を
f のサイズとしてセットすれば、最適なサイズにできる。というわけです。

このadjsize()メソッドは、MouseAdapterのmouseClicked()メソッドの
末尾あたりに置けばよいでしょう。

最初(コンストラクタ)の setVisible(ture);の後に置けばよさそうに思える
のですが、setVisible(ture)自体は(少々)時間がかかってしまいます。
従って、直後に書いた adjsize()実行時には、f や cv の正しいサイズが
得られないので書いても無駄になってしまいます。

	f.setVisible(true);
	sleep(100);
	adjsize();
}// constructor

と待ちを入れると大丈夫ですが、100ms待ちで良いかどうかは
環境によって異なります。

いかがでしたでしょうか? 単純なゲームでも、色々と工夫が必要に
なるんだな、と感じて頂ければ幸いです。

ご意見、ご感想、リクエスト、などはお気軽に、コメント欄か
メールフォームをご利用ください。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。