学习笔记16-C语言-小项目-使用Makefile完成2048
生活随笔
收集整理的這篇文章主要介紹了
学习笔记16-C语言-小项目-使用Makefile完成2048
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Makefile:
Makefile是一系列編譯指令組成的可執(zhí)行文本,也叫做編譯腳本。 在終端執(zhí)行make命令會自動執(zhí)行Makefile腳本中的編譯命令, 而且它還可以根據(jù)文件的最后修改時間來判斷哪些文件是否需要重新編譯、哪些文件不需要重新編譯,從而大大提高編譯效率編譯規(guī)則:1、如果這個工程沒有編譯過,那么我們所有的.c文件都要被編譯并鏈接2、如果某個.c文件被修改,那么此次只編譯被修改過的.c文件并鏈接 3、如果某個.h文件被修改,那么依賴它的所有.c文件都需要重新編譯并鏈接一個最簡單的Makefile腳本:執(zhí)行目標:依賴編譯指令被依賴的目標1:依賴的文件編譯指令被依賴的目標2:依賴的文件編譯指令...負責清理的執(zhí)行目標:rm ...2048游戲:
文件規(guī)則: main.c 程序入口 game2048.c game2048.h 游戲業(yè)務邏輯 direction.c direction.h 方向鍵處理 tools.c tools.h 工具函數(shù) Makefileproject_creat.sh
用于生成所有文件,需要給執(zhí)行權限,然后運行,最后刪除執(zhí)行權限 #程序入口 touch main.c#游戲業(yè)務邏輯 touch game2048.c touch game2048.h#方向處理 touch direction.c touch direction.h#工具函數(shù) touch tools.c touch tools.h#編譯腳本 ls>Makefile #編寫的腳本文件 ls>game2048.confgame2048.conf
編譯腳本,用于打開所有文件,在文件夾中雙擊運行(需要給權限) gedit main.c game2048.c game2048.h direction.c direction.h tools.c tools.hmain.c
#include"game2048.h"int main(int argc,const char* argv[]) {init_game();run_game();exit_game(); }game2048.c
#include<stdio.h> #include<getch.h> #include<stdlib.h> #include"direction.h" #include"game2048.h" #include"tools.h"int (*view)[4] = NULL; int is_move;//是否產(chǎn)生變動 int can_move1; int can_move2; int can_move3; int can_move4; int score;//初始化相關資源 void init_game(void)//申請對內(nèi)存 { is_move=1;can_move1=1;can_move2=1;can_move3=1;can_move4=1;score=0;view = calloc(4*4,sizeof(int)); }//運行游戲的函數(shù) void run_game(void) { while(1){ if(is_move)rand_number();//隨機位置產(chǎn)生一個2show_view();//放tools中,顯示 if(is_godie())//檢查游戲是否繼續(xù){exit_game();return;}switch(getch())//獲取方向建并處理{case 183:up();break;case 184:down();break;case 186:left();break;case 185:right();break;case 'r':{exit_game();init_game();break;}case 'q':{exit_game();return;}} } }//釋放相關資源 void exit_game(void) {free(view);view = NULL; }game2048.h
#ifndef GAME2048_H #define GAME2048_Hextern int (*view)[4]; extern int is_move; extern int can_move1; extern int can_move2; extern int can_move3; extern int can_move4; extern int score;//初始化相關資源 void init_game(void);//運行游戲的函數(shù) void run_game(void);//釋放相關資源 void exit_game(void);#endif//GAME2048_Hdirection.c
#include<stdio.h> #include"direction.h" #include"game2048.h" #include"tools.h"void up_0(void)//向上補齊 {for(int i=0;i<4;i++)//列{for(int j=0;j<3;j++){if(view[j][i]==0)//找到空格下一個數(shù)前移一位{view[j][i]=view[j+1][i];view[j+1][i]=0;if(view[j][i])is_move++;}}} }void down_0(void)//向下補齊 {for(int i=0;i<4;i++)//列{for(int j=3;j>0;j--){if(view[j][i]==0){view[j][i]=view[j-1][i];view[j-1][i]=0;if(view[j][i])is_move++;}}} }void left_0(void)//向左補齊 {for(int i=0;i<4;i++)//行{for(int j=0;j<3;j++){if(view[i][j]==0){view[i][j]=view[i][j+1];view[i][j+1]=0;if(view[i][j])is_move++;}}} }void right_0(void)//向右補齊 {for(int i=0;i<4;i++)//行{for(int j=3;j>0;j--){if(view[i][j]==0){view[i][j]=view[i][j-1];view[i][j-1]=0;if(view[i][j])is_move++;}}} }void up(void) {for(int i=0;i<4;i++)//列{for(int j=0;j<4;j++){up_0();if(view[j][i]==0)break;else if(view[j][i] == view[j+1][i]){view[j][i] *= 2;score += view[j][i];view[j+1][i] = 0;up_0();}} }if(is_move==0)can_move1--; }void down(void) {for(int i=0;i<4;i++)//列{for(int j=3;j>0;j--){down_0();if(view[j][i]==0)break;else if(view[j][i] == view[j-1][i]){view[j][i] *= 2;score += view[j][i];view[j-1][i] = 0;down_0();}} }if(is_move==0)can_move2--; }void left(void) {for(int i=0;i<4;i++)//行{for(int j=0;j<3;j++){ left_0();if(view[i][j]==0)break;else if(view[i][j] == view[i][j+1]){view[i][j] *= 2;score += view[i][j];view[i][j+1] = 0;left_0();}} }if(is_move==0)can_move3--; }void right(void) {for(int i=0;i<4;i++)//行{for(int j=3;j>0;j--){right_0();if(view[i][j]==0)break;else if(view[i][j] == view[i][j-1]){view[i][j] *= 2;score += view[i][j];view[i][j-1] = 0;right_0();}} }if(is_move==0)can_move4--; }direction.h
#ifndef DIRECTION_H #define DIRECTION_Hvoid up(void); void down(void); void left(void); void right(void); void up_0(void); void down_0(void); void left_0(void); void right_0(void);#endif//DIRECTION_Htools.c
#include<stdio.h> #include<stdlib.h> #include<time.h> #include"tools.h" #include"game2048.h" //顯示頭文件 void show_view(void) {system("clear");printf("---------------------\n");for(int i=0;i<4;i++){for(int j=0;j<4;j++){if(view[i][j] == 0)printf("| ");else printf("|%4d",view[i][j]);}printf("|\n---------------------\n");}printf("score: %d\n方向鍵控制\n重新開始:r\n退出:q\n",score); }//隨機位置產(chǎn)生2 void rand_number(void) { srand(time(NULL));while(1){int i=rand()%4;int j=rand()%4;int n=rand()%2+1;if(view[i][j] == 0){view[i][j]=2*n;break;}}is_move=0;can_move1=1;can_move2=1;can_move3=1;can_move4=1; }//檢查游戲是否結束 bool is_godie(void) { for(int i=0;i<4;i++)//勝利結束條件{for(int j=0;j<4;j++){if(view[i][j]==2048){printf("win\n");return true; } }}if(is_move==0 && can_move1<=0 && can_move2<=0 && can_move3<=0 && can_move4<=0)//失敗結束條件{printf("菜\n");return true;}return false; }tools.h
#ifndef TOOLS_H #define TOOLS_H#include<stdbool.h>#ifdef DEBUG#define debug(...) printf(__VA_ARGS__) #else #define debug(...) #endif//顯示頭文件 void show_view(void);//隨機位置產(chǎn)生2 void rand_number(void);//檢查游戲是否結束 bool is_godie(void); #endif//TOOLS_HMakefile
CC=gcc STD=-std=gnu99 BIN=game2048.bin FLAG=-Wall -Werror OBJ=main.o game2048.o direction.o tools.oall:$(OBJ)$(CC) $(STD) -o $(BIN) $(OBJ)main.o:main.c game2048.h$(CC) $(STD) $(FLAG) -c main.cgame2048.o:game2048.c game2048.h direction.h tools.h$(CC) $(STD) $(FLAG) -c game2048.cdirection.o:direction.c direction.h game2048.h tools.h$(CC) $(STD) $(FLAG) -c direction.ctools.o:tools.c tools.h game2048.h$(CC) $(STD) $(FLAG) -c tools.cclean:rm -rf $(OBJ) $(BIN)總結
以上是生活随笔為你收集整理的学习笔记16-C语言-小项目-使用Makefile完成2048的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发信用卡怎么开通超限功能?这种方法比较
- 下一篇: leetcode590. N叉树的后序遍