linuxの下でC言語を使ってロシアのブロックゲームを実現します

126621 ワード

実現構想:
キーはアラーム信号を使用し、アラームタイミングを一定時間トリガして信号関数をトリガし、信号関数の中で相手のブロックを自動的に落下操作し、主線制御インタフェースの表示とユーザーの入力を処理することである.
2つのファイルmain.cdata.hがあり、2つのファイルを同じディレクトリの下に配置し、直接変更ディレクトリの下でコマンドを実行する必要があります.
gcc main.c -o main

注意:コンパイル中にdata.hというファイルが見つからないか見つからない場合:
  • 1、2つのファイルが同じパスの下にあることを確認し、data.hというファイルの名前が正しいかどうかを確認します(data.hの後ろにスペースや他の空白文字が複数ある場合があります).このファイルが見つからない場合があります.
  • 2、本当に解決できない場合は、data.hの中のデータをmain.cファイルの#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_