#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番以降は餌を食べたときに追加される胴体、というふうにしようと配列にしました。
配列の中に配列と、ややこしくなってしまい、参照魚さんが示してくれたコードと入り交じってよくわからなくってしまいました・・・
一つ一つやるたびに躓くのですが・・・今回もよろしくおねがいします。