ぷよぷよっぽいゲーム開発1日目

5/26の出来事について書いています

今日からゲームの開発に取り組む。

どのようなゲームを作るのか?

ぷよぷよ的なゲームを作りたいと思っている。今頻繁に遊んでいる『ぷよぷよesports』に「とことんぷよぷよ」(一人でひたすら連鎖を作るモード)が搭載されてないため、自分で作りたいと思った。

構想

いきなり本格的なぷよぷよの再現をするのは難しいだろう。なので以下のような簡易版のぷよぷよを作ってみたいと思う。

  • まずは一つずつぷよを降らせる形にしようと思う(本来は2つで一組のぷよが降ってくる)。
  • いわゆる13段目(最上段の見えないところ)は再現せず12段目までにする
  • 本家ぷよぷよで見られる細かい挙動(ぷよどうしがぶつかると揺れるなど)の再現はとりあえず目指さない

とりあえず構想について今思いつくのはこれくらい。

今日やったこと

とりあえずこんな感じのソースコードを書いた

#include "DxLib.h"
using namespace std;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			 LPSTR lpCmdLine, int nCmdShow )
{
	//フルスクリーンの表示をやめる
	ChangeWindowMode(true);
	
	
	// DXライブラリ初期化
	if( DxLib_Init() == -1 ) return -1 ;
	
	
	//画面の解像度などを設定
	SetGraphMode( 640 , 480 , 16 ) ;
	
	
	//画像ハンドルの宣言
	int StageHandle,KiroHandle,AkaHandle,AoHandle,MidoriHandle;
	
	
	//ステージ画像の読み込み
	StageHandle=LoadGraph("stage2.png");
	//ぷよの画像の読み込み
	KiroHandle=LoadGraph("kiro.png");
	AkaHandle=LoadGraph("aka.png");
	AoHandle=LoadGraph("ao.png");
	MidoriHandle=LoadGraph("midori.png");
	
	//ステージ画像のサイズを取得
	int stagew,stageh;
	GetGraphSize(StageHandle,&stagew,&stageh);
	//ステージ画像を拡大
	double stager=(double)480.0/stageh;
	stagew=stagew*stager;
	stageh=stageh*stager;
	//ステージの左端の位置
	int a=150;
	
	
	//ぷよ画像のサイズを取得
	int puyow,puyoh;
	GetGraphSize(AkaHandle,&puyow,&puyoh);
	//ぷよ画像を拡大
	double puyor=(double)stagew/6.0/puyow;
	puyow=puyow*puyor;
	puyor=(double)stageh/12.0/puyoh;
	puyoh=puyoh*puyor;
	
	
	//ステージの各列の高さ
	int hi[6];
	for(int i=0;i<6;i++)
	  hi[i]=11*puyoh;
	
	
	//ぷよの初期位置
	int inix=a+2*puyow;
	int iniy=-puyoh/2;
	
	
	//ぷよの位置の変数
	int x,y;
	
	//ぷよに関するフラグ
	int puyoflag=0;
	int puyoxflag=0;
	
	
	//test
	int puyox[78];
	int puyoy[78];
	int ipuyo=0;
	
	//描画先を裏画面に設定
	SetDrawScreen( DX_SCREEN_BACK ) ;
	
	
	while(1){
	  //画面をクリア
	  ClearDrawScreen() ;
	
	  //ステージ画像の処理
	  {
	    //ステージ画像を拡大して表示
	    DrawExtendGraph(a,0,stagew+a-0.5,stageh,StageHandle,false);
          }
	  
	  //ぷよの処理
	  {
	     //ぷよを操作し終わったら新しいぷよを降らせる
	     if(puyoflag==0){
	       x=inix;
	       y=iniy;
	       DrawExtendGraph(x,y,x+puyow,y+puyoh,AkaHandle,true);
	       puyoflag=1;
	     }
	     
	     else{
	       //キーボードから入力に応じてぷよを動かす
	       if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ){
	         if(puyoxflag==0){
	           x-=puyow;
		   puyoxflag=7;
		 }
	       }
	       if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ){
	         if(puyoxflag==0){
	           x+=puyow;
		   puyoxflag=7;
		 }
	       }
	       if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) y += 12 ;
	       //壁際の処理
	       if(x<a)x=a;
	       if(x>a+5*puyow)x=a+5*puyow;
	       
	       //着地したら操作フラグをしまう
	       if(y>hi[(x-a)/puyow]){
	         y=hi[(x-a)/puyow];
		 puyox[ipuyo]=x;
		 puyoy[ipuyo]=y;
		 hi[(x-a)/puyow]-=puyoh;
		 ipuyo++;
		 puyoflag=0;
	       }
	       
	       
	       //ぷよを横方向に小刻みに動かすための処理
	       if(puyoxflag!=0)
	         puyoxflag--;
	     DrawExtendGraph(x,y,x+puyow,y+puyoh,AkaHandle,true);

	     //堆積したぷよの描画
	     if(ipuyo!=0){
	       for(int i=0;i<ipuyo;i++)
	         DrawExtendGraph(puyox[i],puyoy[i],puyox[i]+puyow,puyoy[i]+puyoh,AkaHandle,true);
	     }
	     
	    }
	     
	     //自由落下
	     y+=1;
	   } 
	  
	  
	  //ゲームオーバー
	  if(hi[2]==-puyoh){
	    ScreenFlip();
	    break;
	  }  
	  
	  //表画面への描画
	  {
	    ScreenFlip();
	  }
	  
	  
	  //仮の終了処理
	  {
	    // Windows特有の面倒な処理をDXライブラリにやらせる
	    // -1 が返ってきたらループを抜ける
	    if( ProcessMessage() < 0 ) break ;
	    // もしESCキーが押されていたらループから抜ける
	    if( CheckHitKey( KEY_INPUT_ESCAPE ) ) break ;
	  }
	}
	
	//ゲームオーバーの処理
	DrawString(0,0,"ゲームオーバー",GetColor( 255 , 0 , 0 )) ;
	ScreenFlip();
	WaitTimer(5*1000);

	// DXライブラリ使用の終了
	DxLib_End() ;

	// ソフトの終了
	return 0 ;
}
  • ぷよ(ただの四角形)とステージの画像を読み込むようにした
  • ぷよを操作できるようにした
懸念点
  • どんどんとたまっていくぷよの情報を配列に格納しているが、いまの配列サイズのままだと連鎖してぷよが消えた時にオーバーフローしてしまう。どうしたらよいか?
  • ぷよの上にぷよを乗せる処理がうまくできていない
  • ぷよを設置した時に画面がちらつく
展望

懸念点の解消と降ってくるぷよの色をランダムにしたい。明日できれば連鎖の実装まで行きたい。

実行ファイル

Debug-20200527T123220Z-001.zip - Google ドライブ
windows用のexeファイルを格納したzipファイルがダウンロードできます。未完成です。