BCCでSDL テトリスを作ろう

C言語+SDLテトリス



いつ完成するか分かりませんが、テトリスを作ろうと思います。



何から手をつけてよいのかサッパリなので先ずはこちらを参考にしましょう。http://www5f.biglobe.ne.jp/~kenmo/program/tetris/tetris.html



課題形式で作成を進めたいと言う方はこちらを参考に。


Loading...





では今回のソースです。取りあえずプレイフィールドだけ表示してみました。


TetrisCanvas.cpp

#include "TetrisCanvas.h"

//フィールド変数
static SDL_Surface *screen;
static Uint8 playField[H_SIZE][W_SIZE];
static BlockArr Block[BLOCK_TYPE_ALL];

bool InitializeTetris(Uint8 initType)
{
	//SDLの初期化
	if( TetrisVideoMode(initType) == false ){
		return false;
	}
	//キャプション設定(Videoモードを設定する前に先に設定する必要がある)
	SDL_WM_SetCaption(TITLE,NULL);
	//ビデオモード設定
	screen = NULL;
	screen = SDL_SetVideoMode(
		WIDTH, HEIGHT, BPP, 
		SDL_HWSURFACE | SDL_DOUBLEBUF
	);
	
	return true;
}

bool TetrisVideoMode(Uint8 type){
	switch(type){
	case VIDEO:
		if( SDL_Init(SDL_INIT_VIDEO) < 0 ){
			return false;
		}break;
	case TIMER:
		if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0 ){
			return false;
		}break;
	case JOYSTICK:
		if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0 ){
			return false;
		}break;
	case ALL:
		if( SDL_Init(SDL_INIT_VIDEO | 
		SDL_INIT_JOYSTICK | 
		SDL_INIT_TIMER) < 0 ){
			return false;
		}break;
	}//end initVIdeo
	
	return true;
}

void paintOut(void){
	
	SDL_Rect dst;
	dst.w = dst.h = BLOCK_SIZE;
	
	for(int y=0; y<H_SIZE; y++){
		for(int x=0; x<W_SIZE; x++){
			if(playField[y][x]==1){
				dst.x = x*BLOCK_SIZE;
				dst.y = y*BLOCK_SIZE;
				SDL_FillRect(screen,&dst,0xffffffff);
			}
		}
	}
	
}

void init_mapTest(void){
	
	for(int y=0;y<H_SIZE;y++){
		for(int x=0;x<W_SIZE;x++){
			if(x==0||x==11|| y >= 21 ){
				playField[y][x] = WALL;
			}
			else{
				playField[y][x] = PLAY_FIELD;
			}
		}
	}
	
}

void init_map(Uint8 (*field)[]){//マップの初期化
	/*PLAYFIELD = 0
	**WALL = 1
	**BLOCK_FIXATION = 2*/
	Uint8 map[H_SIZE][W_SIZE] = {
	//	 0 1 2 3 4 5 6 7 8 9 1011
		{1,0,0,0,0,0,0,0,0,0,0,1},/*0*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*1*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*2*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*3*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*4*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*5*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*6*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*7*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*8*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*9*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*10*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*11*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*12*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*13*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*14*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*15*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*16*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*17*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*18*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*19*/
		{1,0,0,0,0,0,0,0,0,0,0,1},/*20*/
		{1,1,1,1,1,1,1,1,1,1,1,1}/*21*/
	};
	
	memcpy(field,map,sizeof(map));//コピー
}

void initTetris(void){
	init_map( playField );
	//init_mapTest();
	initBlock();
}

void initBlock(void){
	//三次元配列
	Uint8 Blocks[BLOCK_TYPE_ALL][4][4] = 
	{
		{
			{0,0,0,0},
			{0,1,1,0},
			{0,1,1,0},
			{0,0,0,0}
		},
		{
			{0,0,0,0},
			{0,0,0,0},
			{1,1,1,1},
			{0,0,0,0}
		},
		{
			{0,0,0,0},
			{0,1,0,0},
			{0,1,1,1},
			{0,0,0,0}
		},
		{
			{0,0,0,0},
			{0,0,1,0},
			{1,1,1,0},
			{0,0,0,0}
		},
		{
			{0,0,0,0},
			{0,1,1,1},
			{0,0,1,0},
			{0,0,0,0},//注意
		}
	};
	for(int idx=0; idx < BLOCK_TYPE_ALL; idx++){
		//配列情報コピー
		memcpy(Block[idx].Arr,Blocks[idx],sizeof(Blocks[0]));
	}
}

void TetrisScreenUpdate(void){
	if(screen != NULL){
		SDL_Flip(screen);
	}
	return;
}

void TetrisFreeCanvas(void){
	if(screen != NULL){
		SDL_FreeSurface(screen);
		screen = NULL;//CleanUp
	}
	return;
}

TetrisCanvas.h

#ifndef _INCLUDE_TETRIS
#define _INCLUDE_TETRIS

#include "SDL_defined.h"

#define BLOCK_TYPE_ALL 5

//ブロック情報
typedef struct block{
	Uint8 Arr[4][4];
}BlockArr;

enum{
	PLAY_FIELD = 0,
	WALL=1,
	FIXATION,
	BLOCK_VIEW
};//マップの状態を再現

bool InitializeTetris(Uint8 initType);
bool TetrisVideoMode(Uint8 initType);
void TetrisScreenUpdate(void);
void TetrisFreeCanvas(void);
void TetrisMapInit(void);
void initTetris(void);
void init_map(void);
void init_mapTest(void);
void initBlock(void);
void paintOut(void);


#endif




次はブロックを表示する所までやってみたいと思います。