第8講 テトリス開発(4つのブロックを一元的に描くまで)
第9話 第9話第1話課題
第9講第1話の課題です。
for(i=0;i<4;i++)chizu[x+p[s][k][i]][y+q[s][k][i]]=2; //sはブロックの種類、kはブロックの回転状態を表す
のsとkを制御すれば、
ブロックの種類と回転状態を選べるということを、
第8講第6話で説明しました。
gamemain()
void gamemain(){ //ゲーム画面
chizusakusei(); //地図作成(壁建設)
block(); //ブロックを描く
}
を改良して、
時間の進行とともに
→→→
とランダムにブロックが次々と出てくるように変更して下さい。
第4講第6話で学んだ
int f(){
srand((unsigned) time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
return(rand() % 101); //100以下のランダム整数を返す
}
を思い出して下さい。
rand()とtime()を使うためには、
#include<stdlib.h> //乱数を発生させるrand()を使うために必要
#include<time.h> //time()使用するために必要
という2つのファイルをインクルードしなければなりませんでしたね。
srand((unsigned) time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
は
void gamemain(){ //ゲーム画面
chizusakusei(); //地図作成(壁建設)
srand((unsigned) time(NULL)); //乱数の系列決定するシード値を現在時刻から取得
・
block(); //ブロックを描く
}
に入れて下さい。
これを
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
のどこかに入れたりすると、
1秒に60個のブロックが次々に現れてしまいますから。
制御するsとkは引数にして送るという手もありますが、
プログラムが複雑になりますので、
初心者の方は、グローバル変数にする方がよいでしょう。
0,1,2,3の値しか取りませんので、char型にして下さい。
また、回転の中心になる正方形の座標(x,y)もすべての関数で使えるように、
グローバル変数に変更しておいて下さい。
void block(){
int x,y;
int i;
for(i=0;i<4;i++)chizu[3+p[0][3][i]][4+q[0][3][i]]=2;
for(i=0;i<4;i++)chizu[7+p[1][2][i]][8+q[1][2][i]]=2;
for(i=0;i<4;i++)chizu[3+p[2][0][i]][16+q[2][0][i]]=2;
for(i=0;i<4;i++)chizu[8+p[3][1][i]][20+q[3][1][i]]=2;
for (x = 0; x < 12; x++) {
for (y = 0; y < 27; y++) {
if (chizu[x][y] == 2) {
DrawBox(20 * x, 20 * y, 20 * (x + 1) - 1, 20 * (y + 1) - 1, kiiro, true);
}
}
}
}
の
for(i=0;i<4;i++)chizu[3+p[0][3][i]][4+q[0][3][i]]=2;
for(i=0;i<4;i++)chizu[7+p[1][2][i]][8+q[1][2][i]]=2;
for(i=0;i<4;i++)chizu[3+p[2][0][i]][16+q[2][0][i]]=2;
for(i=0;i<4;i++)chizu[8+p[3][1][i]][20+q[3][1][i]]=2;
は
for(i=0;i<4;i++)chizu[4+p[s][k][i]][5+q[s][k][i]]=2+s;
に一本化して、
for (x = 0; x < 12; x++) {
for (y = 0; y < 27; y++) {
if (chizu[x][y] == 2) {
DrawBox(20 * x, 20 * y, 20 * (x + 1) - 1, 20 * (y + 1) - 1, kiiro, true);
}
}
}
は変更して、ブロックごとに色を変えて下さい。
ヒントとしてインクルード文・グローバル変数(配列)・社員紹介(プロトタイプ宣言)部分を記述しておきましょう。
#include "DxLib.h"
#include<stdlib.h> //乱数を発生させるrand()を使うために必要
#include<time.h> //time()使用するために必要
void hajimennogamen(); //ゲームの最初の画面を担当する社員
void gamemain(); //ゲーム画面を担当する社員
void make(); //ゲームオーバー画面を担当する社員
void kachi(); //ゲームクリア画面を担当する社員
char m; //ゲームモードを決定する整数 0:ゲームの最初の画面 1:ゲーム画面 2:ゲームオーバー 3:ゲームクリア画面
int x,y; //整数型の箱xとyを用意
int h ; //画像に付けられた出席番号を収納する箱を用意
int siro = GetColor(255, 255, 255); //白色の出席番号収納する箱
int kiiro = GetColor(255, 255, 0); //黄色の出席番号収納する箱
int aka = GetColor(255, 0, 0); //赤色の出席番号を収納する箱
int midori = GetColor(0, 255, 0); //白色の出席番号収納する箱
int ao = GetColor(0, 0, 255); //青色の出席番号収納する箱
int mizuiro = GetColor(0, 255, 255); //水色の出席番号を収納する箱
int murasaki = GetColor(255, 0, 255); //紫色の出席番号収納する箱
char taisyoutonarukey_mae[100];
char jyu(int taisyoutonarukey);
void chizusakusei(); //地図作成(壁建設)社員
char chizu[12][27]; //配置担当
void block(); //ブロックを描く社員
char p[4][4][4] = {
-1,0,1,2,
0,0,0,0,
-2,-1,0,1,
0,0,0,0,
0,1,1,0,
0,1,1,0,
-1,0,0,-1,
-1,0,0,-1,
0,0,0,1,
0,0,1,2,
-1,0,0,0,
-2,-1,0,0,
0,0,1,1,
-1,0,0,1,
-1,-1,0,0,
-1,0,0,1
};
char q[4][4][4] = {
0,0,0,0,
-1,0,1,2,
0,0,0,0,
-2,-1,0,1,
-1,-1,0,0,
0,0,1,1,
0,0,1,1,
-1,-1,0,0,
-2,-1,0,0,
1,0,0,0,
0,0,1,2,
0,0,0,-1,
-1,0,0,1,
1,1,0,0,
-1,0,0,1,
0,0,-1,-1
};
//sはブロックの種類 0:長方形 1:正方形 2:L字 3:N字
//kは回転状態 0:元の状態 1:90°回転 2:180°回転 3:270°回転
int s,k;
現在使わない色も入っていますが、
将来は、ブロックの種類にかかわらずランダムに7色に塗り分けますので、
コピペしておいて下さい。
もちろん、全角スペースが入っていませんので、
紺色はまとめてコピペできます。
第8話へ 第9講第1話へ
初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
ecliqse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
ecliqse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ