# codecraft-2024-java-quick-start **Repository Path**: cqhfengyun/codecraft-2024-java-quick-start ## Basic Information - **Project Name**: codecraft-2024-java-quick-start - **Description**: 本项目提供java版本的符合大赛编译要求的目录,并提供快速运行和快速打包的bat脚本,能满足新手快速上手的需求 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-03-08 - **Last Updated**: 2024-03-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # codecraft-2024-java-quick-start 本项目提供2024华为软件精英挑战赛java版本的符合大赛编译要求的目录,并提供快速运行和快速打包的bat脚本,能满足新手快速上手的需求 ## java运行环境检查 注意,本项目大部分脚本需要java环境,否则无法正常运行。请双击test.bat检查java环境,如果输出“The test was successful”则说明java环境正常。 ## src 源代码目录,编写的java代码放在src/com/huawei/codecraft目录中,入口为Main.java的main函数,上传官网时需要将整个src目录压缩为zip包,然后上传zip压缩包即可,本项目默认的代码可以通过编译,只是得分为0,默认代码来源于官网SDK。 ## lib lib目录,存放了官网提供的PreliminaryJudge.exe、zip等依赖 ## maps map地图目录,用于存放官方提供的map.txt ## test.bat 双击test.bat可以检查java环境,如果输出“The test was successful”则说明java环境正常,如果输出“The test was failed”,则说明java环境异常。 ## run.bat 使用javac命令编译代码,生成的class文件放置于当前目录的com/huawei/codecraft目录中,并随后调用java com.huawei.codecraft.Main运行,可以用来快速检查编译是否失败、是否能正常运行。可以修改脚本内容,改为python或c++。 ## judge.bat 双击使用,调用官方提供的PreliminaryJudge.exe,会运行run.bat进行交互,可以自行配置PreliminaryJudge.exe的参数,比如切换地图、修改日志等级、设置随机数种子等,详情请参考《初赛判题器使用说明.pdf》 ## package.bat 双击使用,使用zip工具快速将src目录打包成zip压缩包,直接将src.zip上传官网即可,也可以使用windows的图形压缩工具手动压缩。 ## package2.bat 双击使用,可以将多个java合并成一个Main.java并打包成zip,官方修复多java编译失败的bug后可以直接提交,该脚本弃用。 ## judgeAll.bat 双击使用,可以运行其他编程语言的程序,但是需要java环境,并且需要定制传给判题器的命令。请提前双击test.bat检查java环境,详情请看test.bat的说明。可以自动运行多张地图脚本,通过`lib\JudegAll.java`调用官方提供的PreliminaryJudge.exe,设置好map目录后,会读取目录下的每一张txt,并调用判题器进行判题,一次性按顺序自动运行多张地图,相当于手动多次运行,能极大程度提升开发效率。可以统计每张地图的运行时间和得分,并计算最终总得分和平均得分。需要有jdk环境。请在`lib\JudegAll.java`上方修改参数。 ### 参数说明 * mapDirectoryPath:指定地图目录,程序会因此使用判题器运行目录下的每一张txt地图,相对路径是以judgeAll.bat为基准 * frame:指定判题器的-f参数,每帧判题器最长等待时间,单位毫秒。0 表示无限等待时间。默认 15。 * isRandomSeed:指定传给判题器的随机种子是否随机 * fixedRandomSeed:如果isRandomSeed为false,则使用该参数作为判题器的随机种子 * runCmd:指定判题器的运行命令,如果有空格则需要双引号包裹并使用'\'将双引号转义。如"python main.py" 或 "./team1/main.exe" 或 "java -jar Hello.jar",也可以参考本项目将命令封装在run.bat中。 ## 判题器常见错误 ### CreateProcess err: 系统找不到指定的文件。WriteFile err. 句柄无效。 可能的原因:判题器运行的命令无效,举例:`PreliminaryJudge.exe main.exe`,实际上当前目录下没有main.exe这个文件,判题器会执行用户传入的命令,但是这个命令是错的,就会报这个错,也有可能是文件的路径错了。要注意的是,如果判题器执行传入的命令和用户直接执行命令的情况是一样的,如果用户直接执行"main.exe"命令出现报错,那么判题器执行也会报错。 ### TerminateProcess Err: 拒绝访问。 正常运行的程序可能也会出现这个问题因此这个不是问题,如果分数为0可以参考其他原因 ### |Handle IO Error ReadFileEx err. 管道已结束。 可能的原因:判题器运行的命令可以运行,并不不正确,举例:`PreliminaryJudge.exe "java Main.java"`,如果存在java环境,但是java Main有错误,比如找不到或无法加载主类 Main.java,就会提示管道已结束,即java这个程序存在,但是java运行不了用户的代码。 ### 运行迅速结束,是success,但是分数是0,而且可以确定代码有一部分没有执行就退出了。 可能的原因:内存超过了3.8g,判题器直接终止了用户程序进程,举例:使用java创建一个40000*40000*40000的int数组,并在后面添加死循环,发现程序瞬间结束,而且通过jconsole工具发现程序最大内存达到了7个g,由此判断是内存超出导致异常。 ### 判题器的随机种子固定,用户代码的随机种子也固定,但是多次运行结果不一样 可能的原因:一段代码的运行时间不是固定的,第一次运行可能是10ms,第二次可能是20ms,因此每一帧是否跳帧的概率也不一样,而跳帧就会导致用户读取的数据不一样,最终导致种种情况发生,也有可能其中一种情况代码有bug导致发生异常。如果能保证自己的代码每次运行都不跳帧,那么结果是不会变的。判断是否跳帧可以在每一次读取当前帧id的时候判断是不是等于上一个id+1,如果不是就发生了跳帧。 ## bat代码解释 ### run.bat @javac -encoding utf-8 src\com\huawei\codecraft\*.java && java com.huawei.codecraft.Main 先运行javac将java文件编译为class文件。`-d .`指定class输出的目录,设置为当前目录,否则会生成在`src/com/huawei/codecraft`。`-encoding utf-8`指定编码为utf-8,否则若代码中存在中文注释可能导致编译失败。`src\com\huawei\codecraft\*.java`指定编译的java文件。代码开头的@是为了关闭当前命令回显,防止对判题器造成影响,事实上在输出第一个ok前输入的任何数据都不会对影响判题器。 ### judge.bat lib\PreliminaryJudge.exe -d judge.log -f 15 -l WARN -s 0 -m maps\map1.txt run.bat 调用官方提供的PreliminaryJudge.exe。`-d judge.log `设置判题器将输入给程序的结果写入文件中,方便调试。`-f 15`代表每帧判题器最长等待时间,单位毫秒,0 表示无限等待时间,默认 15。如果每帧计算时间过长,可以设置为1,让判题器更快结束,否则判题器可能运行非常久。`-l WARN`设置日志级别,如果是默认的INFO会导致判题器疯狂输出日志到控制台,导致运行非常缓慢,比如默认提供的代码需要运行几分钟,但是设置`-l WARN`可以在几秒运行完成。`-s 0`设置随机数种子,防止随机因素影响本地开发。`-m maps\map1.txt`指定地图文件。`run.bat`选手程序运行命令,可以用双引号阔起一句cmd命令,如"python main.py"、"Demo\main.exe",这里将java编译和执行的命令编写成bat脚本,更方便使用。如果判题器运行报错,应该先执行想要判题器执行的命令,看看手动执行是否出现错误。 ### package.bat if exist src.zip ( del src.zip ) lib\zip -r src.zip src 使用开源的zip工具快速将src目录打包成zip压缩包。先删除src.zip,在将src目录压缩为zip。zip.exe还依赖于bzip2.dll。 ## 联系作者 如果遇到疑问或者有更好的建议可以联系qq: 2427883959