一部だけ表示されない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cupa
記事: 117
登録日時: 2年前

一部だけ表示されない

#1

投稿記事 by cupa » 2年前

コード:

#include "../../DxLib/DxLib.h"

#define FIELD_SIZE		20

#define CHIP_SIZE		20

#define CHIP_TEX_NONE	0
#define CHIP_TEX_SHARP	1
#define CHIP_TEX_PLAYER	2
#define CHIP_TEX_FOOD	3

int mField[ FIELD_SIZE + 2 ][ FIELD_SIZE + 2 ] = {
	//1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11,12,13,14,15,16,17,18,19,20,21,22
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },//1,
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//2
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//3
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//4
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//5
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//6
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//7
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//8
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//9
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//10
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//11
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//12
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//13
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//14
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//15
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//16
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//17
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//18
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//19
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//20
	{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },//21
	{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },//22
};

int getMinToMaxRand( int min, int max );

void init();	//初期化処理
void update();	//計算処理
void draw();	//描画処理

int mX, mY;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode( TRUE );
	SetDrawScreen( DX_SCREEN_BACK );
	if ( DxLib_Init() == -1 ) return -1;
	
	init();
	
	while ( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		ClearDrawScreen();
		
		update();
		draw();	
		
		ScreenFlip();
	}
	WaitKey();
	DxLib_End();
	return 0;
}

int getMinToMaxRand( int min, int max ) {
	int r;
	r = GetRand( max - min ) + min;
	return r;
}

void init() {
	mX = getMinToMaxRand( CHIP_SIZE, FIELD_SIZE * CHIP_SIZE - CHIP_SIZE );
	mY = getMinToMaxRand( CHIP_SIZE, FIELD_SIZE * CHIP_SIZE - CHIP_SIZE );
	mField[ mY ][ mX ] = CHIP_TEX_PLAYER;//初期座標に書き込み
}

void update() {
}

void draw() {
	//フィールドの描画
	for ( int y = 0; y < FIELD_SIZE + 2; y++ ) {
		for ( int x = 0; x < FIELD_SIZE + 2; x++ ) {
			int chip = mField[ y ][ x ];
			char* chipTex[ 4 ] = { " ", "#", "●", "◯" };
			DrawString( x * CHIP_SIZE, y * CHIP_SIZE, chipTex[ chip ], GetColor( 255, 255, 255 ) );
		}
	}
	//DrawFormatString( 100, 100, GetColor( 255, 255, 255 ), "%d,%d", mX, mY );
	//DrawFormatString( 100, 100, GetColor( 255, 255, 255 ), "%d", mField[ mY ][ mX ] );
}

スネークゲームを作っているのですが、プレイヤーの「●」が表示されません。
壁である、「#」は表示されるのですが・・・
init()で初期化した後、その後に不正に書き換えられていないかなど確認してみましたが私の技術じゃわからず・・・

init()で指定した座標に「●」が表示されれば成功です。
よろしくおねがいします。

アバター
usao
記事: 1887
登録日時: 11年前

Re: 一部だけ表示されない

#2

投稿記事 by usao » 2年前

> 確認してみました

っていうなら,確認してみたという作業の内容とその結果を示せと.

・init() によって mX と mY の値はそれぞれいくつになったの?
・その値はそもそも正当なの?
・その後に書きかえられていないかをチェックした結果はどうなったの? 未知の値に書き換わったの? それともずっとそのままだったの?

それらの振る舞いを確認した結果として,何がわかっていて何がわからない状態にあるっていう話なの?

アバター
usao
記事: 1887
登録日時: 11年前

Re: 一部だけ表示されない

#3

投稿記事 by usao » 2年前

例えば,

「動作を追ってみたところ,mX の値がマイナス7千万,mY の値が 3億 になっていたのですが,その座標に「●」が表示されないんです」

っていうのと,

「動作を追ってみたところ,mX の値が 6,mY の値が 10 になっていたのですが,その座標に「●」が表示されないんです」

っていうのとでは,「どこが疑わしいのか」が全然違ってくるっしょ.

cupa
記事: 117
登録日時: 2年前

Re: 一部だけ表示されない

#4

投稿記事 by cupa » 2年前

すみません・・・

mX,mYに関しては、DrawFormatString()で確認済みです。
Init()で乱数を取得しているので、毎回異なりますが・・・

コード:

DrawFormatString( 100, 100, GetColor( 255, 255, 255 ), "mX:%d  mY:%d", mX, mY );
(draw()の中で呼んでいます)
結果:mX:260 mY:20(もちろん、ランダム取得しているので毎回結果は異なります)
値は正当です。(座標)
その後何も処理がされていないので書き換えられていないです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 一部だけ表示されない

#5

投稿記事 by みけCAT » 2年前

cupa さんが書きました:
2年前
結果:mX:260 mY:20(もちろん、ランダム取得しているので毎回結果は異なります)
値は正当です。(座標)
この値は正当ではありません。
mField の各次元の要素数は FIELD_SIZE + 2 すなわち 22 しかありません。
mY:20 は大丈夫ですが、 mX:260 は範囲外になってしまいます。
範囲外にならないよう、配列の要素数を大きくするか、
座標の値が範囲内 (0以上 FIELD_SIZE + 2 未満) になるようにするべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1887
登録日時: 11年前

Re: 一部だけ表示されない

#6

投稿記事 by usao » 2年前

> int mField[ FIELD_SIZE + 2 ][ FIELD_SIZE + 2 ]

これのサイズって,22x22 しか無いんじゃないの?
それに対して,

> 結果:mX:260 mY:20

というとき,この値を

> mField[ mY ][ mX ] = CHIP_TEX_PLAYER;//初期座標に書き込み

みたく用いることが正当なのですか?
mField[ 20 ][ 260 ] というアクセスをする話になりますが.

---

要は, mX と mY っていうのは「どんな値なの?」っていう:

少なくともこのプログラムには

・データの座標系(mField のindex)
・表示の座標系(pixel単位)

の2つの座標系があると思うけど,「 mX と mY っていうのは一体どっち側の座標系の値なのか?」
ということを考えてみる(というか,きっちり定める)ことが必要そうに思えます.

#個人的には,座標系の間の座標変換を陽にコードで表現することをお勧めする.
各々がどの座標系の値なのかを区別できるように変数名を徹底するとか,
座標変換が必要な場所では(その場に変換計算を埋め込むのではなくて)必ず変換関数を通すとか.

アバター
usao
記事: 1887
登録日時: 11年前

Re: 一部だけ表示されない

#7

投稿記事 by usao » 2年前

mX, mY がどの座標系の値なのか? というのは他者には判断つかない
(だって,そこがあやふやになっていると見えるコードが目の前に示されているのだからね).

そこはあなた自身がきっちりと定めねばならない.
どこをどう修正すべきなのか? という話は,その定義に完全に依存することになる.

> ・その値はそもそも正当なの?

っていうのは,「あなたが定めた定義の上で」正当な値なのか? っていう話だよ.

cupa
記事: 117
登録日時: 2年前

Re: 一部だけ表示されない

#8

投稿記事 by cupa » 2年前

勘違いをしていました。
描画する座標と、配列に入れる値を間違えていました。
範囲外なのにエラーでないのですね・・・
ありがとうございました。

返信

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