日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习笔记16-C语言-小项目-使用Makefile完成2048

發(fā)布時間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记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ù) Makefile

project_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.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;//是否產(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_H

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)//找到空格下一個數(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_H

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); }//隨機位置產(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_H

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)

總結

以上是生活随笔為你收集整理的学习笔记16-C语言-小项目-使用Makefile完成2048的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。