ブロック崩しその2

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ヨシタケ

ブロック崩しその2

#1

投稿記事 by ヨシタケ » 13年前

少し前に頂いたアドバイスに従ってstaticな変数を使ってできるだけ変数をそのソースコード内だけで使うようにまとめて見ました。
ただ、バーの内容とボールの内容をひとつのソースファイルにまとめたのですが、そのソースファイル(player.cpp)
がとても長くなってしまいました。
ファイルは以下のサイトにアップしました。パスワードは「YT2013」です。

http://www1.axfc.net/uploader/so/2815940

さすがにここまで長いと見づらいのではと不安に思ったので書き込ませていただきました。

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

Re: ブロック崩しその2

#2

投稿記事 by dic » 13年前

boss.cpp と rank.cpp がないんですね

気になったというか、気づいたところは
player.cpp の 630行目

コード:

	//バーの長さ変更
	if(change ==2){
		if(changeobj>0){
			if(bar.longth != 4){
				if(bar.x > FIELD_MAX_X - 9.5*(bar.longth -1))
					bar.x -=9.5;
					bar.longth +=changeobj ;
			}
		}
		if(changeobj<0){
			if(bar.longth != 0)
				bar.longth--;
		}
	}
で、changeobj == 0 のときどちらの条件も通りません
という、こまか~い バグが入り込みそうです。

ほかの箇所ではやっているようですが、 if - else 文を使うといいかもしれません

コード:

	//バーの長さ変更 変更(dic)
	if(change ==2){
		if(changeobj>0){
			if(bar.longth != 4){
				if(bar.x > FIELD_MAX_X - 9.5*(bar.longth -1))
					bar.x -=9.5;
					bar.longth +=changeobj ;
			}
		}
		else{
			if(bar.longth != 0)
				bar.longth--;
		}
	}

よみやすいか?というところは、私は、まだこのくらいの量なら読めます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ブロック崩しその2

#3

投稿記事 by softya(ソフト屋) » 13年前

アップロードする時は、Debugフォルダやipchフォルダとblocktower.sdfを削除してもらうとかなり軽量になります。

気になるところですが、
1)ご自身が言われる通りバーの内容とボールの内容を分けたほうが良いです。

2)main.hのグローバル変数がまだかなり残っています。もっと減らせると思います。あとstruct.hの構造体でグローバル公開しなくて良い物もないか確認して下さい。
使っていないものもあるような。

3)ローカル変数でstaticにして良い変数もかなりあると思います。ファイルスコープからローカルスコープにすることで見かけ上の変数が整理出来ます。

4)プログラムの規模の割に変数が多いという印象があります。全体を見なおして変数を減らす工夫も考えてみて下さい。

5)前回も書きましたが、constやenumも積極的に使いましょう。
「ブロック崩し • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=12591#p101066

6)これも前回書きましたが、同じようなコードが散見されます。一度書いたものは2度描かないを徹底し関数化を心がけて下さい。
徹底すればstaticな関数が絶対発生するはずです。

簡単な例ですが、これが元の処理で

コード:

		for(int i = 0;i<3;i++){
			if(sp2pos[i] <5){
				sp2hit[i].lt.x = 30+70*sp2pos[i];	sp2hit[i].lt.y =30;
				sp2hit[i].rb.x = 90+70*sp2pos[i];	sp2hit[i].rb.y =90;
				sp2hit[i].height=60;	sp2hit[i].width = 60;
			}
			if(sp2pos[i] >=5 && sp2pos[i] < 10){
				sp2hit[i].lt.x = 30+70*(sp2pos[i] -5);	sp2hit[i].lt.y =130;
				sp2hit[i].rb.x = 90+70*(sp2pos[i] -5);	sp2hit[i].rb.y =190;
				sp2hit[i].height=60;	sp2hit[i].width = 60;
			}
			if(sp2pos[i] >= 10){
				sp2hit[i].lt.x = 30+70*(sp2pos[i] -10);	sp2hit[i].lt.y =230;
				sp2hit[i].rb.x = 90+70*(sp2pos[i] -10);	sp2hit[i].rb.y =290;
				sp2hit[i].height=60;	sp2hit[i].width = 60;
			}
		}
ほとんど同一のようなので、こんな風にしてみるとか。

コード:

		for(int i = 0;i<3;i++){
			int ofsX=0,ofsY=0;
			if(sp2pos[i] >=5 && sp2pos[i] < 10){
				ofsX = -5;
				ofsY = 100;
			}
			if(sp2pos[i] >= 10){
				ofsX = -10;
				ofsY = 200;
			}
			sp2hit[i].lt.x = 30+70*(sp2pos[i]+ofsX);	sp2hit[i].lt.y =ofsY+30;
			sp2hit[i].rb.x = 90+70*(sp2pos[i]+ofsX);	sp2hit[i].rb.y =ofsY+90;
			sp2hit[i].height=60;	sp2hit[i].width = 60;
		}
あるいは、こう書くとか

コード:

		for(int i = 0;i<3;i++){
			int baisu = 0;
			if(sp2pos[i] >=5 && sp2pos[i] < 10)	{
				baisu = 1;
			}
			if(sp2pos[i] >= 10)	{
				baisu = 2;
			}
			sp2hit[i].lt.x = 30+70*(sp2pos[i]+baisu*-5);	sp2hit[i].lt.y =baisu*100+30;
			sp2hit[i].rb.x = 90+70*(sp2pos[i]+baisu*-5);	sp2hit[i].rb.y =baisu*100+90;
			sp2hit[i].height=60;	sp2hit[i].width = 60;
		}
私は部分的にか見ていないので、全体を見なおせば上のコード自体もっと別の書き方が有るかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ヨシタケ

Re: ブロック崩しその2

#4

投稿記事 by ヨシタケ » 13年前

たくさんのアドバイスありがとうございます。

頂いたアドバイスを元に変更前のブロック崩しのところまで直していこうと思います。

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

Re: ブロック崩しその2

#5

投稿記事 by dic » 13年前

ひょっとして、オブジェクト指向を意識してプログラムされてます?

設計さえ見直せば、オブジェクト指向っぽくなるのかなと思いました。
(私なりの思うオブジェクト指向です。プロが使っているものとはかけはなれているかもしれません。)

そう考えると、DxLibは、まったくオブジェクト指向向けではないですね。
私は、やっとWindows95時代ぐらいにやっと到達したのでしょうかね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ブロック崩しその2

#6

投稿記事 by softya(ソフト屋) » 13年前

dic さんが書きました:ひょっとして、オブジェクト指向を意識してプログラムされてます?

設計さえ見直せば、オブジェクト指向っぽくなるのかなと思いました。
(私なりの思うオブジェクト指向です。プロが使っているものとはかけはなれているかもしれません。)

そう考えると、DxLibは、まったくオブジェクト指向向けではないですね。
私は、やっとWindows95時代ぐらいにやっと到達したのでしょうかね。
DXLIBのフレームワークはオブジェクト指向では出来ていませんが、それをオブジェクト指向で包み込むことは可能ですよ。
「龍神録プログラミングの館」の最後の方にある龍神録C++版とか。
http://dixq.net/rp/
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 658
登録日時: 15年前
住所: 宮崎県
連絡を取る:

Re: ブロック崩しその2

#7

投稿記事 by dic » 13年前

たしかに、構造体が先にあって(DxLib)オブジェクト指向を扱うのは難しいかもしれないですけど、
オブジェクト指向があって、構造体のライブラリ(DxLib)を扱うのは、できますね。

勉強になりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: ブロック崩しその2

#8

投稿記事 by softya(ソフト屋) » 13年前

dic さんが書きました:たしかに、構造体が先にあって(DxLib)オブジェクト指向を扱うのは難しいかもしれないですけど、
オブジェクト指向があって、構造体のライブラリ(DxLib)を扱うのは、できますね。

勉強になりました。
VisualStudioのMFCや.NetFrameWorkもC言語インターフェイスであるWin32APIをラップしてオブジェクト指向で扱っているわけですから前からごく普通に行われていますよね。
まぁ、古い新しいとかオブジェクト指向であるとか、うまく付き合っていけば良いので気にしすぎてもしょうが無いと思いますが。

オブジェクト指向にしたからと言っていきなりすごいプログラムが書けるわけでもないので、手続き型だろうとオブジェクト指向だろうと書けるプログラムは本人の能力次第です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る