#include "../DxLib/DxLib.h"
#define FIELD_SIZE 20
#define CHIP_SIZE 20
byte 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
};
enum {
eScene_Game,
eScene_Clear,
eScene_GameOver
}eScene = eScene_Game;
int getMinToMaxRand( int min, int max );
int toChipSize( int n );
void Init();
void OnTimer();
void Update();
void Draw();
int mNowClock, mLastClock;
int mPX[ 200 ], mPY[ 200 ], mPMuki, mPLength, mLastPX, mLastPY;
int mMoveX[ 4 ] = { 0, -1, 0, 1 }, mMoveY[ 4 ] = { -1, 0, 1, 0 };
int mFX, mFY, mFoodFlag;
int mOnKey;
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE );
SetDrawScreen( DX_SCREEN_BACK );
if ( DxLib_Init() == -1 ) return -1;
Init();
mLastClock = GetNowCount();
while ( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
ClearDrawScreen();
OnTimer();
Draw();
ScreenFlip();
}
DxLib_End();
return 0;
}
int getMinToMaxRand( int min, int max ) {
int r;
r = GetRand( max - min ) + min;
return r;
}
int toChipSize( int n ) {
int cs, s = CHIP_SIZE;
cs = n / s;
return cs;
}
void Init() {
for ( byte i = 0; i < 200; i++ ) {
mPX[ i ] = 6, mPY[ i ] = 10;
}
}
void Update() {
mField[ mPY[ 0 ] ][ mPX[ 0 ] ] = 0;
if ( mFoodFlag != 1 ) { //もし食べ物がないのなら
//mField[ mFY ][ mFX ] = 0; // ①ここでクリアすると1回目はmFYとmFXは0なので、(0,0)の壁が消える
mFX = getMinToMaxRand( 1, 19 );
mFY = getMinToMaxRand( 1, 19 );
mField[ mFY ][ mFX ] = 3;
mFoodFlag = 1;
}
if ( mFX == mPX[ 0 ] && mFY == mPY[ 0 ] ) {
mField[ mFY ][ mFX ] = 0; // ①当たり判定があったらクリアする
mPLength++;
mFoodFlag = 0;
}
if ( CheckHitKey( KEY_INPUT_UP ) == 1 ) mOnKey = 0;
if ( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) mOnKey = 1;
if ( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) mOnKey = 2;
if ( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) mOnKey = 3;
/* ②
if ( 1 < mPX && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPX ) {
mPX += mMoveX[ mOnKey ];
} else if ( 1 < mPY && toChipSize( FIELD_SIZE - CHIP_SIZE ) < mPY ) {
mPY += mMoveY[ mOnKey ];
}
*/
for ( byte i = 0; i < mPLength; i++ ) {
mField[ mPY[ i ] + i ][ mPX[ i ] ] = 0;
mField[ mPY[ i ] ][ mPX[ i ] + i ] = 0;
mField[ mPY[ i ] - i ][ mPX[ i ] ] = 0;
mField[ mPY[ i ] ][ mPX[ i ] - i ] = 0;
switch ( mOnKey ) {
case 0: if ( mPY[ 0 ] > 0 && mField[ mPY[ 0 ] - 1 ][ mPX[ 0 ] ] != 1 ) { mPY[ i ]--; } break;
case 2: if ( mPY[ 0 ] < FIELD_SIZE && mField[ mPY[ 0 ] + 1 ][ mPX[ 0 ] ] != 1 ) { mPY[ i ]++; } break;
case 1: if ( mPX[ 0 ] > 0 && mField[ mPY[ 0 ] ][ mPX[ 0 ] - 1 ] != 1 ) { mPX[ i ]--; } break;
case 3: if ( mPX[ 0 ] < FIELD_SIZE && mField[ mPY[ 0 ] ][ mPX[ 0 ] + 1 ] != 1 ) { mPX[ i ]++; } break;
}
mField[ mPY[ i ] + i ][ mPX[ i ] ] = 2;
mField[ mPY[ i ] ][ mPX[ i ] + i ] = 2;
mField[ mPY[ i ] - i ][ mPX[ i ] ] = 2;
mField[ mPY[ i ] ][ mPX[ i ] - i ] = 2;
mField[ mPY[ i ] ][ mPX[ i ] ] = 2;
}
}
void OnTimer() {
mNowClock = GetNowCount();
if ( mNowClock >= mLastClock + 200 ) {
mLastClock = mNowClock;
Update();
}
}
void Draw() {
for ( byte y = 0; y < FIELD_SIZE + 2; y++ ) {
for ( byte 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( 500, 10, GetColor( 255, 255, 255 ), "長さ:%d", mPLength );
}
for ( byte i = 0; i < mPLength; i++ ) {
mField[ mPY[ i ] + i ][ mPX[ i ] ] = 0;
mField[ mPY[ i ] ][ mPX[ i ] + i ] = 0;
mField[ mPY[ i ] - i ][ mPX[ i ] ] = 0;
mField[ mPY[ i ] ][ mPX[ i ] - i ] = 0;
switch ( mOnKey ) {
case 0: if ( mPY[ 0 ] > 0 && mField[ mPY[ 0 ] - 1 ][ mPX[ 0 ] ] != 1 ) { mPY[ i ]--; } break;
case 2: if ( mPY[ 0 ] < FIELD_SIZE && mField[ mPY[ 0 ] + 1 ][ mPX[ 0 ] ] != 1 ) { mPY[ i ]++; } break;
case 1: if ( mPX[ 0 ] > 0 && mField[ mPY[ 0 ] ][ mPX[ 0 ] - 1 ] != 1 ) { mPX[ i ]--; } break;
case 3: if ( mPX[ 0 ] < FIELD_SIZE && mField[ mPY[ 0 ] ][ mPX[ 0 ] + 1 ] != 1 ) { mPX[ i ]++; } break;
}
mField[ mPY[ i ] + i ][ mPX[ i ] ] = 2;
mField[ mPY[ i ] ][ mPX[ i ] + i ] = 2;
mField[ mPY[ i ] - i ][ mPX[ i ] ] = 2;
mField[ mPY[ i ] ][ mPX[ i ] - i ] = 2;
mField[ mPY[ i ] ][ mPX[ i ] ] = 2;
}
はじめは、mPX, mPYは配列ではなかったのですが、0番目は頭、1番以降は餌を食べたときに追加される胴体、というふうにしようと配列にしました。
配列の中に配列と、ややこしくなってしまい、参照魚さんが示してくれたコードと入り交じってよくわからなくってしまいました・・・
一つ一つやるたびに躓くのですが・・・今回もよろしくおねがいします。