Makefile:
Makefile是一系列編譯指令組成的可執行文本,也叫做編譯腳本。
在終端執行make命令會自動執行Makefile腳本中的編譯命令,
而且它還可以根據文件的最后修改時間來判斷哪些文件是否需要重新編譯、哪些文件不需要重新編譯,從而大大提高編譯效率編譯規則:1、如果這個工程沒有編譯過,那么我們所有的.c文件都要被編譯并鏈接2、如果某個.c文件被修改,那么此次只編譯被修改過的.c文件并鏈接 3、如果某個.h文件被修改,那么依賴它的所有.c文件都需要重新編譯并鏈接一個最簡單的Makefile腳本:執行目標:依賴編譯指令被依賴的目標1:依賴的文件編譯指令被依賴的目標2:依賴的文件編譯指令...負責清理的執行目標:rm ...
2048游戲:
文件規則:
main.c 程序入口
game2048.c game2048.h 游戲業務邏輯
direction.c direction.h 方向鍵處理
tools.c tools.h 工具函數
Makefile
project_creat.sh
用于生成所有文件,需要給執行權限,然后運行,最后刪除執行權限
#程序入口
touch main.c#游戲業務邏輯
touch game2048.c
touch game2048.h#方向處理
touch direction.c
touch direction.h#工具函數
touch tools.c
touch tools.h#編譯腳本
ls>Makefile
#編寫的腳本文件
ls>game2048.conf
game2048.conf
編譯腳本,用于打開所有文件,在文件夾中雙擊運行(需要給權限)
gedit main.c game2048.c game2048.h direction.c direction.h tools.c tools.h
main.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;
int can_move1;
int can_move2;
int can_move3;
int can_move4;
int score;
void init_game(void)
{ is_move=1;can_move1=1;can_move2=1;can_move3=1;can_move4=1;score=0;view = calloc(4*4,sizeof(int));
}
void run_game(void)
{ while(1){ if(is_move)rand_number();show_view();if(is_godie()){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);
void run_game(void);
void exit_game(void);#endif
direction.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){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
tools.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);
}
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);
void rand_number(void);
bool is_godie(void);
#endif
Makefile
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)