学习笔记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.mzph.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…