學習筆記16-C語言-小項目-使用Makefile完成2048

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();//隨機位置產生一個2show_view();//放tools中,顯示			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//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)//找到空格下一個數前移一位{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);
}//隨機位置產生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);//隨機位置產生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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/443450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443450.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習筆記17-C語言-結構、聯合、枚舉

結構&#xff1a; struct 結構是由程序猿自己設計的一種數據類型&#xff0c;用于描述一個事務的各項數據&#xff0c;由若干個不同的基礎數據類型組成。設計結構&#xff1a;struct 結構體名{類型 成員名&#xff1b;...}&#xff1b;定義結構體變量struct 結構體名 變量名&a…

Maven 3.0.5 安裝和配置:

摘要&#xff1a;現在的Web項目越來越多的都用maven管理了&#xff0c;所以我也抽時間學習學習&#xff0c;為了趕上時代&#xff01; 一&#xff1a;首先到maven官網&#xff1a;http://maven.apache.org/&#xff0c;然后選擇相應的版本下載&#xff0c;我這里下載的是maven…

學習筆記18-C語言-文件

文件的分類&#xff1a; 文本文件&#xff1a; 存儲的是ASCII碼值的二進制 二進制文件&#xff1a; 存儲的是數據的補碼文件IO&#xff1a; FILE *fopen(const char *path, const char *mode); 功能&#xff1a;打開或者創建文件 path&#xff1a;文件的路徑 mode&#x…

使用INNER JOIN ON 多表關聯查詢,獲取指定用戶下指定權限的資源SQL:

摘要&#xff1a;最近在看一個開源框架&#xff0c;其中用戶&#xff0c;角色&#xff0c;資源&#xff0c;這塊我感覺比較重要&#xff0c;所以就自己也模仿著寫了下&#xff0c;其中在獲取指定用戶下的權限資源的時候遇到問題了&#xff0c;開始時&#xff0c;我首先想到的方…

Maven學習記錄之maven基本操作命令,maven本地工廠的創建,maven骨架的生成,以及在eclipse中創建maven工程:...

摘要&#xff1a;今天又學習了一下maven&#xff0c;之前是下載并安裝和配置好了maven的環境&#xff0c;今天主要學習的內容包括&#xff1a;maven本地工廠的創建&#xff0c;maven骨架的生成命令&#xff0c;maven在dos下創建maven工程&#xff0c;以及在eclipse中創建mavne工…

Oracle中通過游標執行帶參數的存儲過程實現解析CLOB字段內的xml字符串:

摘要&#xff1a;近來之前的項目數據出現了問題&#xff0c;原因是由于之前在設計數據庫的時候把時間字段設置成了字符串格式&#xff0c;所以給后期的數據操作帶來了很大的麻煩&#xff0c;這里提醒一下各位程序猿&#xff0c;以后在開發項目的時候時間字段一定要是時間字段&a…

Eclipse中使用Checkstyle,checkstyle插件檢查java代碼的自定義配置文件:

摘要&#xff1a;近來項目組在搞代碼檢查&#xff0c;所以領導讓把checkstyle這個插件搞明白&#xff0c;現在我把我們寫的自定義的checkstyle.xml文件記錄一下&#xff0c;以便大家可以一起使用&#xff1a; 一&#xff1a;要使用checkstyle插件在eclipse中檢查java代碼&…

Linux 下安裝 jdk-7u75-linux-x64.gz,jdk1.7.0_75,jdk1.7步驟:

摘要&#xff1a;近來又用到了Linux系統&#xff0c;所以就又新裝了一個虛擬機和CentOS 6.4來用&#xff0c;搞開發的程序猿們可能都知道&#xff0c;在現在的很多企業中&#xff0c;生產環境大多都是Linux服務器&#xff0c;并且用的比較多的大都是CentOS&#xff0c;Red hat系…

Win7+VMware10.0+CentOS 6.4+Tomcat,Win7訪問不了CentOS6.4上的Tomcat

摘要&#xff1a;今天在linux下安裝Tomcat后&#xff0c;在虛擬機本地通過:http://localhost:8080/可以訪問安裝好的Tomcat服務器&#xff0c;但是在本機就不能訪問&#xff0c;前提是在本機下可以ping的通虛擬機的IP地址的&#xff0c;最后經過Google&#xff0c;發現說可能是…

Linux下配置OpenLDAP服務記錄

摘要&#xff1a;最近部門需要整合所有的系統&#xff0c;所以領導說要通過OpenLdap數據庫來實現對所有系統的統一管理&#xff0c;所以需要在服務器上配置一下LDAP服務&#xff0c;我們這里選擇的是OpenLdap服務&#xff0c;我在網上搜索了很多&#xff0c;開始都沒有配置成功…

Linux下配置CollabNet Subversion Edge

摘要&#xff1a;最近一直都在搞一下管理員的工作&#xff0c;今天又搞了svn的管理工具CollabNetSubversionEdge&#xff0c;網上也有很多例子&#xff0c;但是很多都是可以訪問到web界面&#xff0c;但是不能啟動版本庫的服務&#xff0c;所以我經過多次嘗試&#xff0c;終于解…

養成讓自己進步的10個習慣

養成讓自己進步的10個習慣 1.永遠不說不可能。"辦法總比問題多" 2.凡事第一反應找方法&#xff0c;不是找借口。"不要推卸責任" 3.養成記錄習慣&#xff0c;不太依賴腦袋。"好記性不如爛筆頭" 4.每天出門照鏡子&#xff0c;給自己自信的微笑。&…

Oracle存儲過程中使用游標來批量解析CLOB字段里面的xml字符串:

摘要&#xff1a;之前在項目中使用到了Oracle數據庫中通過觸發器去調用存儲過程執行數據解析并Update到對應的數據表中&#xff0c;但是&#xff0c;經過一段時間的測試使用發現&#xff0c;如果job那天停掉了&#xff0c;然后你再重新新建job的話&#xff0c;這時候可能會有很…

Maven配置nexus

摘要&#xff1a;近來一直在搭建maven結構的開發框架&#xff0c;其中這個過程中用到了nexus私服&#xff0c;這里我把我經過查詢總結的最終的方式記錄一下&#xff0c;以便后面忘記了&#xff1a; 一&#xff1a;nexus私服的安裝(略) 二&#xff1a;倉庫的講解如下圖: 1、ho…

Maven項目發布的配置

摘要&#xff1a;要想發布maven結構的項目到nexus私服上&#xff0c;可以通過兩種方式來&#xff0c;一種是在項目的pom.xml文件里面配置&#xff0c;另一種是通過命令的方式發布到nexus私服上&#xff0c;但是這種方式的前提也得在settings.xml文件配置用戶: 一&#xff1a;M…

MariaDB通過命令行的方式導出指定數據庫和還原指定數據庫

摘要&#xff1a;今天由于需要需要從本地導出一份VP系統的數據庫腳本&#xff0c;以前我都是通過工具直接導出&#xff0c;現在有同事說可以通過mysql的命令方式導出&#xff0c;我試了一下&#xff0c;可以&#xff0c;現在記錄一下&#xff01; 一&#xff1a;在MariaDB的安裝…

java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener

一&#xff1a;如果出現下面的錯誤信息&#xff0c;如果你的項目是Maven結構的&#xff0c;那么一般都是你的項目的Maven Dependencies沒有添加到項目的編譯路徑下&#xff1a; 五月 10, 2015 6:23:18 下午 org.apache.catalina.core.AprLifecycleListener init 信息: The APR …

Maven 打成 Webjar的方法

摘要&#xff1a;今天領導說要把自己定義的樣式文件和js文件打成一個自定義的webjar&#xff0c;所以就寫了一下&#xff0c;現在記錄一下&#xff1a; 1. 先把要打包成webjar的文件放到你新建的maven結構的項目的/src/main/resources目錄下 2.編寫該項目的pom.xml文件&#…

Maven中maven-source-plugin,maven-javadoc-plugin插件的使用:

摘要&#xff1a;今天領導說要把項目通過maven生產源碼包和文檔包并發布到自己的私服上&#xff0c;經過查看mavne官網發現有兩個maven插件可以做到這些工作&#xff0c;一個是maven-source-plugin&#xff0c;另一個是maven-javadoc-plugin&#xff0c;現在記錄一下&#xff0…

Maven之生成測試覆蓋度的插件cobertura-maven-plugin的使用

摘要&#xff1a;Maven中可以通過使用插件檢查一個項目的測試代碼的覆蓋度&#xff0c;這個插件就是cobertura-maven-plugin&#xff0c;這個插件如何使用我做了測試&#xff0c;現在記錄一下&#xff01; 一&#xff1a;首先在你的項目的pom.xml文件中增加該插件的配置&#x…