linuxの下でC言語を使ってロシアのブロックゲームを実現します
実現構想:
キーはアラーム信号を使用し、アラームタイミングを一定時間トリガして信号関数をトリガし、信号関数の中で相手のブロックを自動的に落下操作し、主線制御インタフェースの表示とユーザーの入力を処理することである.
2つのファイル
注意:コンパイル中にdata.hというファイルが見つからないか見つからない場合:1、2つのファイルが同じパスの下にあることを確認し、data.hというファイルの名前が正しいかどうかを確認します(data.hの後ろにスペースや他の空白文字が複数ある場合があります).このファイルが見つからない場合があります. 2、本当に解決できない場合は、data.hの中のデータをmain.cファイルの を削除します.
ヒント:もし途中で問題が発生したら、伝言、評論、私信を書くことができて、私はオンラインで見た後にみんなの疑問に答える時間があります(しかし、私の暇な時間は限られていて、すべての問題が返事するわけではありません.コードはきっと完全で、正常に運行することができて、自分のパソコンがどうして起きられないのか、自分で問題を探すことを学ぶ必要があります).同時に、みんなが見終わった後に真剣にコードの構想(コードの中の注釈はすでにとても詳しくなった)を勉強することを望んで、このようにみんながやっと進歩することができます!
main.c-これはメインプログラムです.次の
Data.h-これはデータファイルを格納し、
キーはアラーム信号を使用し、アラームタイミングを一定時間トリガして信号関数をトリガし、信号関数の中で相手のブロックを自動的に落下操作し、主線制御インタフェースの表示とユーザーの入力を処理することである.
2つのファイル
main.c
とdata.h
があり、2つのファイルを同じディレクトリの下に配置し、直接変更ディレクトリの下でコマンドを実行する必要があります.gcc main.c -o main
注意:コンパイル中にdata.hというファイルが見つからないか見つからない場合:
#include "data.h"
の下に直接コピーし、#include "data.h"
というコードヒント:もし途中で問題が発生したら、伝言、評論、私信を書くことができて、私はオンラインで見た後にみんなの疑問に答える時間があります(しかし、私の暇な時間は限られていて、すべての問題が返事するわけではありません.コードはきっと完全で、正常に運行することができて、自分のパソコンがどうして起きられないのか、自分で問題を探すことを学ぶ必要があります).同時に、みんなが見終わった後に真剣にコードの構想(コードの中の注釈はすでにとても詳しくなった)を勉強することを望んで、このようにみんながやっと進歩することができます!
main.c-これはメインプログラムです.次の
data.h
ファイルを使用する必要があります./*************************************************
* name: main
* :
* :
* :2018-3-21
* :2019-7-3
**************************************************/
#include
#include
#include
#include
#include
#include
#include "data.h"
#define ROW 21 //
#define COL 18 //
/* */
enum key {
DOWN, //
LEFT, //
RIGHT, //
CHANGE, //
STOP, //
EXIT, //
UNKNOW, //
};
/***** ******/
void initalGameArea(void); //
void drawBlock(char bl[NR][NR]); //
void cleanBlock(char bl[NR][NR]); //
void turnBlock(char bl[NR][NR]); //
void gameEnd(void); //
void gameStop(void); //
void showGame(void); //
void gameSelf(int signo); //
void checkDeleteLine(void); //
void checkGameOver(char bl[NR][NR]); //
int checkMove(char bl[NR][NR], int flag); //
int getInput(void); //
/* */
static char gameArea[ROW][COL] = {
0}; //
static int startX = 7, startY = 6; //
static int type = 0; //
static int nextType = 0; //
static int diret = 0; //
char *state = "\033[32m ...\033[0m"; //
static unsigned int level = 0; //
static unsigned int score = 0; //
static unsigned int maxScore = 0; //
static FILE *fp = NULL; //
/*
* :
*/
int main(void)
{
/*
* :
* 0.7 , 0.7
*/
struct itimerval timer = {
{
0,700000},{
0,700000}};
setitimer(ITIMER_REAL, &timer,NULL);
/* */
initalGameArea();
/* */
signal(SIGALRM, gameSelf);
/* */
srand(time(NULL));
type = rand()%7;
nextType = rand()%7;
/* */
fp = fopen("./record","r+");
if (NULL == fp)
{
/*
*
* "w"
*/
fp = fopen("./record","w");
}
fscanf(fp,"%u",&maxScore);
/* */
int key;
while (1)
{
key = getInput();
switch (key)
{
case RIGHT : checkMove(bl[type][diret],RIGHT);
break;
case LEFT : checkMove(bl[type][diret],LEFT);
break;
case DOWN : checkMove(bl[type][diret],DOWN);
break;
case CHANGE: turnBlock(bl[type][(diret+1)%4]);
break;
case STOP : gameStop();
break;
case EXIT : gameEnd();
break;
case UNKNOW: continue;
}
/* */
drawBlock(bl[type][diret]);
/* */
showGame();
/* */
cleanBlock(bl[type][diret]);
}
return 0;
}
/*
* :initalGameArea
* :
* :
* :
*/
void initalGameArea(void)
{
int i;
/* */
printf("\033[2J"); //
system("stty -icanon"); //
system("stty -echo"); //
fprintf(stdout,"\033[?25l"); //
/* */
for (i = 0; i < COL; i++)
{
gameArea[0][i] = 8; // 0
gameArea[5][i] = 8; // 5
gameArea[ROW-1][i] = 8; //
}
/* */
for (i = 0; i < ROW; i++)
{
gameArea[i][0] = 8; // 0
gameArea[i][COL-1] = 8; //
}
/* */
for (i = 1; i < 5; i++)
{
gameArea[i][6] = 8;
}
}
/*
* :gameSelf
* : ,
* :
* :
*/
void gameSelf(int signo)
{
/* */
drawBlock(bl[type][diret]);
/* */
showGame();
/* */
cleanBlock(bl[type][diret]);
/* */
if (!checkMove(bl[type][diret],DOWN))
{
/* */
checkGameOver(bl[type][diret]);
/* */
drawBlock(bl[type][diret]);
/* */
showGame();
/* */
checkDeleteLine();
/* */
startY = 6;
startX = 7;
type = nextType;
nextType = rand()%7;
diret = 0;
}
}
/*
* :checkDeleteLine
* :
* :
* :
*/
void checkDeleteLine(void)
{
int i, j;
int x, y;
/* */
for (i = 3; i >= 0; i--)
{
for (j = 1; j < COL-1; j++)
{
/* */
if (gameArea[startY+i][j] == 0)
break;
/* */
else if (gameArea[startY+i][j] == 8)
break;
}
/* */
if (j == COL-1)
{
/* */
for (j = 1; j < COL-1; j++)
{
gameArea[startY+i][j] = 0;
}
/* */
score += 100;
/* */
if (score > maxScore)
{
maxScore = score;
/* */
rewind(fp);
fprintf(fp,"%u
",maxScore);
}
/* */
if (score%200 == 0)
{
/* 200 */
level++;
}
/* */
for (x = 1; x < COL-1; x++)
{
for (y = startY+i; y >= 7; y--)
{
gameArea[y][x] = gameArea[y-1][x];
}
}
/* */
i++;
}
}
}
/*
* :checkGameOver
* :
* :
* :
*/
void checkGameOver(char block[NR][NR])
{
int i;
for (i = 0; i < NR; i++)
{
/* */
if (block[0][i] != 0 && gameArea[startY-1][startX+i] == 8)
{
gameEnd();
}
}
}
/*
* :turnBlock
* :
* :
* :
*/
void turnBlock(char bl[NR][NR])
{
int x, y;
/* */
for (y = 0; y < NR; y++)
{
for (x = 0; x < NR; x++)
{
/* */
if (bl[y][x] != 0 && gameArea[startY+y][startX+x] != 0)
{
return;
}
}
}
/* */
diret = (diret+1)%4;
}
/*
* :gameStop
* : ,
* :
* :
*/
void gameStop(void)
{
/* */
struct itimerval stop = {
0}, older;
/* */
setitimer(ITIMER_REAL,&stop,&older);
/* */
state = "\033[31m ...\033[0m";
startY--; //
drawBlock(bl[type][diret]);
showGame();
cleanBlock(bl[type][diret]);
/* */
int key;
while (1)
{
key = fgetc(stdin);
/* */
if (key == ' ')
break;
/* q */
else if (key == 'q')
gameEnd();
}
/* */
setitimer(ITIMER_REAL,&older,NULL);
state = "\033[32m ...\033[0m";
}
/*
* :checkMove
* : ,
* :1. 2.
* : 1, 0
*/
int checkMove(char bl[NR][NR], int flag)
{
int m, n; //
int x, y; //
switch (flag)
{
case RIGHT : n = 0; m = 1; break;
case LEFT : n = 0; m = -1; break;
case DOWN : n = 1; m = 0; break;
}
/* */
for (y = 0; y < NR; y++)
{
for (x = 0; x < NR; x++)
{
/* */
if (bl[y][x] != 0 && gameArea[startY+y+n][startX+x+m] != 0)
{
return 0;
}
}
}
/* */
startY += n;
startX += m;
return 1;
}
/*
* :getInput
* :
* :
* :
*/
int getInput(void)
{
char key;
key = fgetc(stdin);
if (key == '\033' && fgetc(stdin) == '[') //
{
switch (fgetc(stdin))
{
case 'A': return CHANGE;
case 'B': return DOWN;
case 'C': return RIGHT;
case 'D': return LEFT;
}
}
else if (key == 'q') //
{
return EXIT;
}
else if (key == ' ') // -
{
return STOP;
}
else //
return UNKNOW;
}
/*
* :drawBlock
* :
* :
* :
*/
void drawBlock(char block[NR][NR])
{
int x, y;
/* */
for (y = 0; y < NR; y++)
{
for (x = 0; x < NR; x++)
{
if (block[y][x] != 0)
{
gameArea[startY+y][startX+x] = block[y][x];
}
}
}
/* */
for (x = 0; x < 2; x++)
{
for (y = 0; y < NR; y++)
{
if (bl[nextType][0][x][y] != 0)
gameArea[3+x][2+y] = bl[nextType][0][x][y];
else
gameArea[3+x][2+y] = 0;
}
}
}
/*
* :cleanBlock
* :
* :
* :
*/
void cleanBlock(char bl[NR][NR])
{
int x, y;
for (y = 0; y < NR; y++)
{
for (x = 0; x < NR; x++)
{
if (bl[y][x] != 0)
{
gameArea[startY+y][startX+x] = 0;
}
}
}
}
/*
* :showGame
* :
* :
* :
*/
void showGame(void)
{
int i, j;
/* */
fprintf(stdout,"\033[1;1H");
fflush(stdout);
/* */
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (gameArea[i][j] == 0) //
{
fprintf(stdout," ");
}
else if (gameArea[i][j] == 8) //
{
fprintf(stdout,"\033[40m \033[0m");
}
else //
{
fprintf(stdout,"\033[%dm[]\033[0m",gameArea[i][j]+40);
}
}
fputc('
',stdout);
}
/* */
fprintf(stdout,"\033[2;3H\033[33m【 】\033[0m
");
fprintf(stdout,"\033[2;15H :\033[36m%u\033[0m
",level);
fprintf(stdout,"\033[3;15H :\033[32m%u\033[0m
",score);
fprintf(stdout,"\033[4;15H :\033[35m%u\033[0m
",maxScore);
fprintf(stdout,"\033[5;15H :%s
",state);
}
/*
* :gameEnd
* :
* :
* :
*/
void gameEnd(void)
{
/* */
state = "\033[31m !!\033[0m";
drawBlock(bl[type][diret]);
showGame();
/* */
system("stty icanon"); //
system("stty echo"); //
fprintf(stdout,"\033[?25h"); //
/* */
fprintf(stdout,"\033[200;1H"); //
fclose(fp); //
exit(0); //
}
Data.h-これはデータファイルを格納し、
main.c
にデータを提供します./*************************************************
* : Data.h
* :
* :
* :2018-3-21
* :2019-7-3
*************************************************/
#ifndef _DATA_H_
#define _DATA_H_
#define NR 4 //
#define TYPE 7 //
/* */
char bl[TYPE][NR][NR][NR] = {
/* */
{
{
/* */
{
1,1,0,0},
{
1,1,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
1,1,0,0},
{
1,1,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
1,1,0,0},
{
1,1,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
1,1,0,0},
{
1,1,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
},
/* */
{
{
/* */
{
2,2,2,2},
{
0,0,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,2,0,0},
{
0,2,0,0},
{
0,2,0,0},
{
0,2,0,0},
},
{
/* */
{
2,2,2,2},
{
0,0,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,2,0,0},
{
0,2,0,0},
{
0,2,0,0},
{
0,2,0,0},
},
},
/* */
{
{
/* */
{
3,0,0,0},
{
3,3,3,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,3,3,0},
{
0,3,0,0},
{
0,3,0,0},
{
0,0,0,0},
},
{
/* */
{
3,3,3,0},
{
0,0,3,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,0,3,0},
{
0,0,3,0},
{
0,3,3,0},
{
0,0,0,0},
},
},
/* */
{
{
/* */
{
0,0,4,0},
{
4,4,4,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,4,0,0},
{
0,4,0,0},
{
0,4,4,0},
{
0,0,0,0},
},
{
/* */
{
0,4,4,4},
{
0,4,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,4,4,0},
{
0,0,4,0},
{
0,0,4,0},
{
0,0,0,0},
},
},
/* */
{
{
/* */
{
0,5,0,0},
{
5,5,5,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,5,0,0},
{
0,5,5,0},
{
0,5,0,0},
{
0,0,0,0},
},
{
/* */
{
5,5,5,0},
{
0,5,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,5,0,0},
{
5,5,0,0},
{
0,5,0,0},
{
0,0,0,0},
},
},
/* */
{
{
/* */
{
6,6,0,0},
{
0,6,6,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,0,6,0},
{
0,6,6,0},
{
0,6,0,0},
{
0,0,0,0},
},
{
/* */
{
6,6,0,0},
{
0,6,6,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,0,6,0},
{
0,6,6,0},
{
0,6,0,0},
{
0,0,0,0},
},
},
/* */
{
{
/* */
{
0,7,7,0},
{
7,7,0,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,7,0,0},
{
0,7,7,0},
{
0,0,7,0},
{
0,0,0,0},
},
{
/* */
{
0,0,7,7},
{
0,7,7,0},
{
0,0,0,0},
{
0,0,0,0},
},
{
/* */
{
0,7,0,0},
{
0,7,7,0},
{
0,0,7,0},
{
0,0,0,0},
},
},
};
#endif //_DATA_H_