学习笔记16-C语言-小项目-使用Makefile完成2048
生活随笔
收集整理的這篇文章主要介紹了
学习笔记16-C语言-小项目-使用Makefile完成2048
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Makefile:
Makefile是一系列編譯指令組成的可執(zhí)行文本,也叫做編譯腳本。 在終端執(zhí)行make命令會(huì)自動(dòng)執(zhí)行Makefile腳本中的編譯命令, 而且它還可以根據(jù)文件的最后修改時(shí)間來(lái)判斷哪些文件是否需要重新編譯、哪些文件不需要重新編譯,從而大大提高編譯效率編譯規(guī)則:1、如果這個(gè)工程沒(méi)有編譯過(guò),那么我們所有的.c文件都要被編譯并鏈接2、如果某個(gè).c文件被修改,那么此次只編譯被修改過(guò)的.c文件并鏈接 3、如果某個(gè).h文件被修改,那么依賴它的所有.c文件都需要重新編譯并鏈接一個(gè)最簡(jiǎn)單的Makefile腳本:執(zhí)行目標(biāo):依賴編譯指令被依賴的目標(biāo)1:依賴的文件編譯指令被依賴的目標(biāo)2:依賴的文件編譯指令...負(fù)責(zé)清理的執(zhí)行目標(biāo):rm ...2048游戲:
文件規(guī)則: main.c 程序入口 game2048.c game2048.h 游戲業(yè)務(wù)邏輯 direction.c direction.h 方向鍵處理 tools.c tools.h 工具函數(shù) Makefileproject_creat.sh
用于生成所有文件,需要給執(zhí)行權(quán)限,然后運(yùn)行,最后刪除執(zhí)行權(quán)限 #程序入口 touch main.c#游戲業(yè)務(wù)邏輯 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
編譯腳本,用于打開(kāi)所有文件,在文件夾中雙擊運(yùn)行(需要給權(quán)限) 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)生變動(dòng) int can_move1; int can_move2; int can_move3; int can_move4; int score;//初始化相關(guān)資源 void init_game(void)//申請(qǐng)對(duì)內(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)); }//運(yùn)行游戲的函數(shù) void run_game(void) { while(1){ if(is_move)rand_number();//隨機(jī)位置產(chǎn)生一個(gè)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;}} } }//釋放相關(guān)資源 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;//初始化相關(guān)資源 void init_game(void);//運(yùn)行游戲的函數(shù) void run_game(void);//釋放相關(guān)資源 void exit_game(void);#endif//GAME2048_Hdirection.c
#include<stdio.h> #include"direction.h" #include"game2048.h" #include"tools.h"void up_0(void)//向上補(bǔ)齊 {for(int i=0;i<4;i++)//列{for(int j=0;j<3;j++){if(view[j][i]==0)//找到空格下一個(gè)數(shù)前移一位{view[j][i]=view[j+1][i];view[j+1][i]=0;if(view[j][i])is_move++;}}} }void down_0(void)//向下補(bǔ)齊 {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)//向左補(bǔ)齊 {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)//向右補(bǔ)齊 {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重新開(kāi)始:r\n退出:q\n",score); }//隨機(jī)位置產(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; }//檢查游戲是否結(jié)束 bool is_godie(void) { for(int i=0;i<4;i++)//勝利結(jié)束條件{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)//失敗結(jié)束條件{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);//隨機(jī)位置產(chǎn)生2 void rand_number(void);//檢查游戲是否結(jié)束 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)總結(jié)
以上是生活随笔為你收集整理的学习笔记16-C语言-小项目-使用Makefile完成2048的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浦发信用卡怎么开通超限功能?这种方法比较
- 下一篇: leetcode590. N叉树的后序遍