http://u7.getuploader.com/kerotan/downl ... TRIS01.exe
構造体の使い方をまた忘れてしまったので本を読みながら無理やり使ってみました。
ブロックのデータなどはグローバル変数で宣言するのは好ましいのでしょうかね…。
かといってmain関数にブロックデータを全て書き込んだらきたないし…。
他の方のプログラムをいくつか見ていたら、tetris.h なんていうヘッダーを作っている方が何人かいた。
あと悩んでいるのが処理速度が不安定ということ。
キーボードの入力を受付けている間はタイマーがカウントされず、ブロックも落下しない…。
コレに関してはどうすればよいか想像もつきません。
高校生の時に先生に頂いた「ネコでも分かるゲームプログラミング」なんていう本が手元にあるので、WINAPIを勉強してみようかなと思っています。
やっと勉強してみようと思えるようになりました。
/***** ヘッダー ****/
#include
#include //exit(),rand()
#include //time()
#include //getch(),kbhit()
#include //Sleep()
/**** 定数 ****/
#define HIGHT 20
#define WIDTH 15
#define SUMBLOCKS 7
/**** プロトタイプ宣言 ****/
void Draw_map(void); //ステージ(メイン)の出力
void Draw_block(int b); //空白かブロックの出力
void Check_map(); //ブロックの固定、新規ブロックの取得
int Check_wall(int dir); //ブロック移動の制限
int Check_roll(int dir); //回転時の壁判定
void Check_line(); //ラインが揃ってるか調べる
void Del_line(int line); //ラインを一行削除
void Sort_block(int line); //消されたラインを詰める
void Set_block(int mode); //回転用ブロックのセット
void Move_block(int dir); //ブロックの移動
void Turn_block(int dir); //ブロックの回転
void Hold_block(); //ブロックの固定
void Output_test(int type);
void Key_inp();
void Timer_funk();
void Title(); //タイトルの表示
void Game_over(); //ゲームオーバー画面
struct BLOCKS{ //ブロックデータ
int block[4][4]; //最大4 * 4ドット
int block_size; //サイズ
};
struct BLOCKS block_data[SUMBLOCKS] =
{
{//四角 //ブロック0
{
{ 1, 1 },
{ 1, 1 }
}, 2
},
{//とつ //ブロック1
{
{ 0, 1, 0 },
{ 1, 1, 1 },
{ 0, 0, 0 }
}, 3
},
{//エル //ブロック2
{
{ 1, 0, 0 },
{ 1, 1, 1 },
{ 0, 0, 0 }
}, 3
},
{//逆エル //ブロック3
{
{ 0, 0, 1 },
{ 1, 1, 1 },
{ 0, 0, 0 }
}, 3
},
{//エヌ //ブロック4
{
{ 0, 1, 0 },
{ 1, 1, 0 },
{ 1, 0, 0 }
}, 3
},
{//逆エヌ //ブロック5
{
{ 0, 1, 0 },
{ 0, 1, 1 },
{ 0, 0, 1 }
}, 3
},
{//横棒 //ブロック6
{
{ 0, 1, 0, 0 },
{ 0, 1, 0, 0 },
{ 0, 1, 0, 0 },
{ 0, 1, 0, 0 }
}, 4
},
};
struct BLOCKS block_data2[SUMBLOCKS]; //回転処理後のデータ
struct STAGE{
int stage[20][15]; //ステージ全体 20*15
int x; //ブロックの現在位置 X
int y; //ブロックの現在位置 Y
int direction; //回転位置
int ground; //地面に付いているかいないか
int b_type; //落下中ブロックのタイプ
};
struct STAGE st = //マップデータ
{
{
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }
}, 5, 0, 0, 0, 3
};
struct SCORE {
int score;
int delline;
int turnnum;
};
struct SCORE score_data = {
200, //総合得点
0, //消したライン数
0 //回転した回数
};
int GAMEOVER = 0;
/***********************************************************/
/************************* MAIN関数 ************************/
/***********************************************************/
int main(void)
{
int c=0;
Set_block(8);
Title(); //タイトル
printf("[S]Key:Start!\n");
while (1){
if (_kbhit() != 0){
c = _getch();
if (c == 115){ //S_key
printf("Start!!!\n");
break;
}
}
}
system("cls");
Timer_funk();
system("cls");
Game_over();
system("pause");
return 0;
}
/**************** タイマー *******************/
void Timer_funk()
{
int time=0;
time = 0;
while (GAMEOVER != 1){
for (time = 0; time = st.y && i = st.x && j =15 && i != 19) {
Del_line(i); //1行すべてが揃っていたら
Sort_block(i); //ブロックを詰める
score_data.score += 100; //スコアを+100
score_data.delline += 1; //消したライン数を+1
}
}
printf("\n");
sum = 0;
}
// printf("X=%02d Y=%02d\n", st.x, st.y);
printf("DEL LINE: %d\n", score_data.delline);
printf("TURN BLOCK: %d\n", score_data.turnnum);
printf("TOTAL SCORE: %d", score_data.score);
}
/*************** 削除 *******************/
//呼び出し元:マップ描画
void Del_line(int line)
{
int i;
for(i = 1; i 0; i--){
for( j = 1; j = 1) printf("■");
else printf(" ");
}
/********** 回転用ブロックのセット ***********●*/
void Set_block(int mode) //mode:8 全初期化 mode:0~6 指定初期化
{ //初期ブロックデータを回転用データにセット
int i, j, k, size;
if (mode == 8){ //全初期化
for (i = 0; i = 0 && mode > 100 × %d = +%d point\n",score_data.delline, score_data.delline, 100 * score_data.delline);
printf("TURN BLOCK: %d >> -10 × %d = -%d point\n", score_data.turnnum, score_data.turnnum, 10 * score_data.turnnum);
printf("TOTAL: %d point\n", score_data.score);
}
/******* ブロック単体 出力テスト用 *********/
void Output_test(int type)
{
int i, j;
int size;
size = block_data[type].block_size;
for (i = 0; i < size; i++){
for (j = 0; j < size; j++){
if (st.direction % 2 == 0){
Draw_block(block_data2[type].block[i][j]);
}
else{
Draw_block(block_data[type].block[i][j]);
}
}
printf("\n");
}printf("\n");
}