system("cls")の画面のちらつきについて
Q&A
解決したいこと
テトリスを小一時間で作ってみたⅡ【C言語ゲームプログラミング実況】Programming Tetrisの動画を見ながらテトリスを作成していたのですが、コンソール画面上ですさまじい画面の更新が行われちらつきがすごいです。投稿者の画面はそのようなことはありませんでした。
書いたプログラム
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define FIELD_WIDTH 10
#define FIELD_HIGHT 20
#define SHAPE_WIDTH_MAX 4
#define SHAPE_HIGHT_MAX 4
enum {
SHAPE_I,
SHAPE_0,
SHAPE_S,
SHAPE_Z,
SHAPE_MAX,
};
typedef struct {
int width, hight;
int patterm[SHAPE_HIGHT_MAX][SHAPE_WIDTH_MAX];
}SHAPE;
typedef struct {
int x, y;
SHAPE shape;
}MINO;
SHAPE shape[SHAPE_MAX] = {
{
4,4,
{
{0,0,0,0},
{1,1,1,1},
{0,0,0,0},
{0,0,0,0}
}
},
{
4,4,
{
{0,1,0,0},
{1,1,1,0},
{0,0,0,0},
{0,0,0,0}
}
},
{
2,2,
{
{1,1},
{1,1},
}
},
{
4,4,
{
{0,1,1},
{1,1,0},
{0,0,0}
}
},
};
int field[FIELD_HIGHT][FIELD_WIDTH];
int screen[FIELD_HIGHT][FIELD_WIDTH];
MINO mino;
void DrowScreen() {
memcpy(screen, field, sizeof field);
for (int y = 0; y < mino.shape.hight; y++) {
for (int x = 0; x < mino.shape.width; x++)
if (mino.shape.patterm[y][x])
screen[mino.y + y][mino.x + x] |= 1;
}
system("cls");
for (int y = 0; y < FIELD_HIGHT; y++) {
printf("□");
for (int x = 0; x < FIELD_WIDTH; x++)
printf("%s",screen[y][x]?"■":" ");
printf("□");
printf("\n");
}
for (int x = 0; x < FIELD_WIDTH+2; x++)
printf("□");
}
void InitMIno() {
mino.shape = shape[rand() % SHAPE_MAX];
mino.x = (FIELD_WIDTH - mino.shape.width) / 2;
mino.y = 0;
}
void Init() {
memset(field, 0, sizeof field);
InitMIno();
DrowScreen();
}
int main() {
srand((unsigned int)time(NULL));
Init();
while (1) {
if (_kbhit()) {
switch (_getch()) {
case 's':
mino.y++;
break;
case 'a':
mino.x--;
break;
case 'd':
mino.x++;
break;
; }
}DrowScreen();
}
}
自分で試したこと
画面のちらつきを抑えるためにダブルバッファリングという手法があるのを知りました。system("cls")が画面のちらつきの原因になっていると思いますが、どのようにこのプログラムを改善していけばよろしいですか。