マイコンArduinoを使って電光掲示板を作る。
続き
テトリスに挑戦の4回目はブロックの回転を作って行きます。
ボタンを押す度に90度ずつ右回転するプログラム
int x_pos = 6;
int y_pos = 0;
int select = 6;
int muki = 0;
int fall_speed_count = 0;
boolean rotate_flag = false;
short data_hex[] = {0x2004, 0x2004, 0x2004, 0x2004, 0x2004, 0x2004, 0x2004, 0x2004,
0x2004, 0x2004, 0x2004, 0x2004, 0x2004, 0x2004, 0x2004, 0x3ffc};
short block[7][4] = {{0x0660, 0x0660, 0x0660, 0x0660},
{0x4444, 0x00f0, 0x2222, 0x0f00},
{0x2640, 0x0c60, 0x0264, 0x0630},
{0x4620, 0x0630, 0x0462, 0x0360},
{0x0644, 0x0470, 0x2260, 0x0e20},
{0x0622, 0x0740, 0x4460, 0x02e0},
{0x04e0, 0x0262, 0x0720, 0x4640}};
short disp_hex[16];
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,INPUT_PULLUP);
}
void loop() {
// put your main code here, to run repeatedly:
rotate();
fall();
data_make();
disp();
}
void rotate(){
if (digitalRead(7) == 0){
if(!rotate_flag){
rotate_flag = true;
muki++;
if (muki > 3)
muki = 0;
}
}
else {
rotate_flag = false;
}
}
void fall(){
fall_speed_count++;
if (fall_speed_count > 100){
fall_speed_count = 0;
y_pos++;
if (y_pos > 15)
y_pos = 0;
}
}
void data_make(){
for (int i = 0;i < 16;i++)
disp_hex[i] = data_hex[i];
for (int i = 0;i < 4;i++)
disp_hex[i + y_pos] |= ((block[select][muki] >> 4 * i) & 0xf) << x_pos;
}
void disp(){
for (int i = 0;i < 16;i++) {
for (int j = 0;j < 16;j++) {
digitalWrite(2,LOW);
if ((disp_hex[i] & 0x8000 >> j) != 0)
digitalWrite(2,HIGH);
digitalWrite(4,HIGH);
digitalWrite(4,LOW);
}
digitalWrite(5,HIGH);
digitalWrite(5,LOW);
}
digitalWrite(6,HIGH);
digitalWrite(6,LOW);
}
太字が追加部分
ブロックが回転してる様子
ボタンを押すごとにmukiを+1して4になったら0に戻すプログラム
rotate_flagは長押し防止用
次回はブロックの移動を作って行きます。
では、また。