diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6cbca87 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vscode/ +build/ +bin/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..6e4bfb2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,21 @@ +# 设置CMake的最低版本要求 +cmake_minimum_required(VERSION 3.10) +# 设置项目名称 +project(RunningBug) + +# 搜索并收集utils文件夹下的所有源文件 +file(GLOB UTILS "utils/*.cpp", "utils/*.h") + +# 添加可执行文件(还要加入utils文件夹下的源文件) +add_executable(RunningBug main.cpp ${UTILS}) + +# 链接所需的库 +target_link_libraries(RunningBug PRIVATE winmm) + +# 检查项目是否有Media目录,如果存在,则在使用add_custom_command命令在构建后将Media目录中的文件复制到项目的输出目录 +set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/Media") +if(EXISTS ${SOURCE_DIR}) + add_custom_command(TARGET RunningBug POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${SOURCE_DIR} $) +endif() \ No newline at end of file diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/game_over_exit.txt" b/Media/ASCII/game_over_exit.txt similarity index 99% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/game_over_exit.txt" rename to Media/ASCII/game_over_exit.txt index 2f1aca6..1031772 100644 --- "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/game_over_exit.txt" +++ b/Media/ASCII/game_over_exit.txt @@ -1,45 +1,45 @@ -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,::i::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::i:.:,::..:i::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:7MM :,,SMM;,i:i:::i:i:i:::::i:::i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: 0MX , BMM ,,:,,,,.:::,:.,.,,,.:,:,,,:::,,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,,r@M XiBM .,.aa2S8r.,:7@aXaa82.,:XMa.:,X@a.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,S,M; M WM .iMa:.,rMM,..MM;i,iMB.,.MB.,,.MW.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:a MMia MM MM:rX7r0M.. MZ .. MW.. M0 ,. MB ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,a iMM MM BM:... :;,. M0 ,. MW , MB ...MB.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::XW; @Z.iMM;..2MZSXZ8X,:rM@i,:;MM;.,8MZZZ2M@7::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i;;i,.,.i::i,,,.rr7;:,::;:i:::;:ii:,,.;;i...::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:::,:::,::i,:,:,::i:::::::i,:,::i::::::,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:::i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,:,:,:::,:,:,:,:,:::::,:::,:,:,:,:,:::,:,:,:::,:::,:,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,...,.,.................,.,...........,.,.,.....,.,.....,.....::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,i0BBWBWWWBWWWWWWWBWWWBWBWWWBWBWBWWWBWWWWWWWWWBWBWWWBWWWBWBWBB8a.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::;MWXXSSSSSXSSSS2SSSSS2SSS2S2S2S2S2SSSSXSS2S2S2SSSSSSS2S2SSXS7MM.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;MX ..,.,.. ..... ..,.,.,.,.,.,,,.,.,...,.,.,.,.,.,.,.,,,., MM ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,:,:,i,.:ii;i;.:::,:,:::::,:::::,ii:,:::,:::,:,:::::::,, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M2.::i::;MMXrX7S@M::::,::i:::i:i:i:,MMS::i:i::.,;,:i:i:i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,i:i,.8M ... .Xr::,,.,.,,,:::i,:. .:i:i::,:8M.:,::i:i:: MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M2 ::i:: 0M;ir7M,:,:iS@Mi iMZX,i:;XXMM ::i:irX2MMrXS;i:i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,i:i:.8M7XXaMi,:::.;MMr2a,,::i:, @M.,i:i::. MM ,:::i:i:, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.;M2 ::i:: 0M ,.:.,:::, MMW ,,i::, BM ,:i:i:: MM .:,::i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.:i:i,.WM,,,,.;@a,::aBi MM7,::i:: MM.,i:i:i:.MM,:;8;i:i:, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M2.::i::7B@2XSXZW@,:XZMS .iM@aii:rSX0@XS7i:i::,:Z8ZZX::i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,i:i::.,.:,:.,.:,:,,,:,,.,,::i::,,.,,::::i::,,.,,:,::i:: MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.;MS :,:,:,:.,,:,:,:,:,:,,,,,:.:,:,:,:,,,:,:,:::,:,,,:,:,:,:. MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMX ..............,.........,...,.........,.,.....,...,.,. MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,;MM@MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@@MM ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,iir;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;:,,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.:,,,,,,,,,:,,.,.:,:,,,,,:.:,,,,,,.,.:,,,,,,,,,,,:,,,,.,,:,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i:i:::i:i:i:::i:i:i:::::::i:i:::i:::i:i:i:::i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,::i::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::i:.:,::..:i::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:7MM :,,SMM;,i:i:::i:i:i:::::i:::i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: 0MX , BMM ,,:,,,,.:::,:.,.,,,.:,:,,,:::,,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,,r@M XiBM .,.aa2S8r.,:7@aXaa82.,:XMa.:,X@a.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,S,M; M WM .iMa:.,rMM,..MM;i,iMB.,.MB.,,.MW.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:a MMia MM MM:rX7r0M.. MZ .. MW.. M0 ,. MB ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,a iMM MM BM:... :;,. M0 ,. MW , MB ...MB.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::XW; @Z.iMM;..2MZSXZ8X,:rM@i,:;MM;.,8MZZZ2M@7::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i;;i,.,.i::i,,,.rr7;:,::;:i:::;:ii:,,.;;i...::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:::,:::,::i,:,:,::i:::::::i,:,::i::::::,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:::i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,:,:,:::,:,:,:,:,:::::,:::,:,:,:,:,:::,:,:,:::,:::,:,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,...,.,.................,.,...........,.,.,.....,.,.....,.....::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,i0BBWBWWWBWWWWWWWBWWWBWBWWWBWBWBWWWBWWWWWWWWWBWBWWWBWWWBWBWBB8a.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::;MWXXSSSSSXSSSS2SSSSS2SSS2S2S2S2S2SSSSXSS2S2S2SSSSSSS2S2SSXS7MM.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;MX ..,.,.. ..... ..,.,.,.,.,.,,,.,.,...,.,.,.,.,.,.,.,,,., MM ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,:,:,i,.:ii;i;.:::,:,:::::,:::::,ii:,:::,:::,:,:::::::,, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M2.::i::;MMXrX7S@M::::,::i:::i:i:i:,MMS::i:i::.,;,:i:i:i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,i:i,.8M ... .Xr::,,.,.,,,:::i,:. .:i:i::,:8M.:,::i:i:: MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M2 ::i:: 0M;ir7M,:,:iS@Mi iMZX,i:;XXMM ::i:irX2MMrXS;i:i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,i:i:.8M7XXaMi,:::.;MMr2a,,::i:, @M.,i:i::. MM ,:::i:i:, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.;M2 ::i:: 0M ,.:.,:::, MMW ,,i::, BM ,:i:i:: MM .:,::i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.:i:i,.WM,,,,.;@a,::aBi MM7,::i:: MM.,i:i:i:.MM,:;8;i:i:, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M2.::i::7B@2XSXZW@,:XZMS .iM@aii:rSX0@XS7i:i::,:Z8ZZX::i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMS.,i:i::.,.:,:.,.:,:,,,:,,.,,::i::,,.,,::::i::,,.,,:,::i:: MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.;MS :,:,:,:.,,:,:,:,:,:,,,,,:.:,:,:,:,,,:,:,:::,:,,,:,:,:,:. MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMX ..............,.........,...,.........,.,.....,...,.,. MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,;MM@MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM@@MM ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,iir;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;:,,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.:,,,,,,,,,:,,.,.:,:,,,,,:.:,,,,,,.,.:,,,,,,,,,,,:,,,,.,,:,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i:i:::i:i:i:::i:i:i:::::::i:i:::i:::i:i:i:::i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: \ No newline at end of file diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/game_over_menu.txt" b/Media/ASCII/game_over_menu.txt similarity index 99% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/game_over_menu.txt" rename to Media/ASCII/game_over_menu.txt index 42be15d..d895390 100644 --- "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/game_over_menu.txt" +++ b/Media/ASCII/game_over_menu.txt @@ -1,45 +1,45 @@ -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::::,:::::::::::,:::,:,:::,:::::::::::::::,:::,:::::::,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,aZZ8808080808080808880808088888880808080808880808080888088882r,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,:MM2aZaZZZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaa2MB.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:M2 ..,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,:::,:,:.,,:,:,,,:::::::::::::::::::::,:::,:::::::::,:,, M8.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,MZ ::i:i,ii,.,::...i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,i:i:iiZMS.,.iMMX::i:i,::::i:i::,:,::i:i,::i::,::i:i:i:,.M8.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:MZ.::i:i,,iMM ..XMM .:,:,:,,.:::,,.,,:.,,:,,.:,:,,.,:i:i::,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,i:i::,rrMr :aiM.,..aZXS82.,:XM8Sa2B2,.;ZMi,,;ZM,::i:i::.M8.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:MZ.::i:i:,7:8M WX;M. ;M0::,;MM., M@i,.;MX..SMi,,.SM.,i:i:i,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,i:i::,Xi.Ma2 7M..0M:;77;S8,. M2 ,.,MS..7M,...;M ::i:i::.M8.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.:MZ ::i:i::XX WM; SM, ;MB...,rX,, MZ.,,:MS..7MX.:iWM:,i:i:i..M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,Ma.,i:i::iZZ::Z.iZMX:..Z0aaZ2i::XM8i::SMZi,.2B0Z2XWXi:i:i:,.M8.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:MZ ::i:i::,,,:,:,,.,::,,.,:,,:::,,,:::,,,:::.,,:.,.::::i:i,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,:,:,:,:::,:,:,:,:,:,:,:::,:::,:,:,:,:,:,:,:,:,:,:,:::,,.M8.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:M2 .,,,,.,.,.,.,.,,,.,.,.,,,.,,,.,,,.,,,,:.,.,.,,,.,.,,:., M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,:MW77XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX77MB.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:0BBWWWWWW@WWWWW@WWW@WWWWWWWWWWWWWWWWW@WWWWW@WWWWWWWWW@WWWWBBBX,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.....,.,.........,...,.,...,.,.,.,...,.,.,.,.....,.,.,...,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::,:::::,:::,:,:,:,:,:,:,:,:,:,:,:,:,:::,:,:,:,:,:,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:,:::,::::i:i:i:i:i:i:i:i::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::;ii;;r;7;,:i:i:i:i:i:i:i:::X7i,i:i:i::,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,XMMirr7aMX::i,:,::::i:i:i,:MM;::i:i,:.7i::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, M8 .. ,,r::ii.,.,,;i::iii,:.,:i:i:;iXMS:;ii:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i..MMrXXMZ,,::X0MZ iMZ7:i:r77M@.::i:i7X8MX7XX:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,.MB:i;02.:::..rM@Z:.,::i:, M@.,i:i::.:Mi ,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i..M0 ... .X:,, :Z@M7 ,::::, MW ,:i:i:,;Mi..:;i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::7MM;;rraM0,;7MM: XM@7i::iriMM;ri:i:i,,MWXSZS:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::r;;;rr77X.:iXX;.,,;77ii:;rr;r;7ii:i:i,,;Xri,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,:,:,,,:::::,:,:,,,::i::,:,::::i:i::::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:i:::i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::::,:::::::::::,:::,:,:::,:::::::::::::::,:::,:::::::,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,aZZ8808080808080808880808088888880808080808880808080888088882r,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,:MM2aZaZZZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaa2MB.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:M2 ..,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,., M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,:::,:,:.,,:,:,,,:::::::::::::::::::::,:::,:::::::::,:,, M8.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,MZ ::i:i,ii,.,::...i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,i:i:iiZMS.,.iMMX::i:i,::::i:i::,:,::i:i,::i::,::i:i:i:,.M8.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:MZ.::i:i,,iMM ..XMM .:,:,:,,.:::,,.,,:.,,:,,.:,:,,.,:i:i::,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,i:i::,rrMr :aiM.,..aZXS82.,:XM8Sa2B2,.;ZMi,,;ZM,::i:i::.M8.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:MZ.::i:i:,7:8M WX;M. ;M0::,;MM., M@i,.;MX..SMi,,.SM.,i:i:i,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,i:i::,Xi.Ma2 7M..0M:;77;S8,. M2 ,.,MS..7M,...;M ::i:i::.M8.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.:MZ ::i:i::XX WM; SM, ;MB...,rX,, MZ.,,:MS..7MX.:iWM:,i:i:i..M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,Ma.,i:i::iZZ::Z.iZMX:..Z0aaZ2i::XM8i::SMZi,.2B0Z2XWXi:i:i:,.M8.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.:MZ ::i:i::,,,:,:,,.,::,,.,:,,:::,,,:::,,,:::.,,:.,.::::i:i,.M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,Ma.,:,:,:,:::,:,:,:,:,:,:,:::,:::,:,:,:,:,:,:,:,:,:,:,:::,,.M8.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:M2 .,,,,.,.,.,.,.,,,.,.,.,,,.,,,.,,,.,,,,:.,.,.,,,.,.,,:., M0 ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,:MW77XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX77MB.:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:0BBWWWWWW@WWWWW@WWW@WWWWWWWWWWWWWWWWW@WWWWW@WWWWWWWWW@WWWWBBBX,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.....,.,.........,...,.,...,.,.,.,...,.,.,.,.....,.,.,...,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::,:::::,:::,:,:,:,:,:,:,:,:,:,:,:,:,:::,:,:,:,:,:,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:,:::,::::i:i:i:i:i:i:i:i::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::;ii;;r;7;,:i:i:i:i:i:i:i:::X7i,i:i:i::,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,XMMirr7aMX::i,:,::::i:i:i,:MM;::i:i,:.7i::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, M8 .. ,,r::ii.,.,,;i::iii,:.,:i:i:;iXMS:;ii:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i..MMrXXMZ,,::X0MZ iMZ7:i:r77M@.::i:i7X8MX7XX:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,.MB:i;02.:::..rM@Z:.,::i:, M@.,i:i::.:Mi ,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i..M0 ... .X:,, :Z@M7 ,::::, MW ,:i:i:,;Mi..:;i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::7MM;;rraM0,;7MM: XM@7i::iriMM;ri:i:i,,MWXSZS:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::r;;;rr77X.:iXX;.,,;77ii:;rr;r;7ii:i:i,,;Xri,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,:,:,,,:::::,:,:,,,::i::,:,::::i:i::::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:i:::i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: \ No newline at end of file diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_exit.txt" b/Media/ASCII/menu_exit.txt similarity index 99% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_exit.txt" rename to Media/ASCII/menu_exit.txt index e4c6a36..5f8c0d4 100644 --- "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_exit.txt" +++ b/Media/ASCII/menu_exit.txt @@ -1,45 +1,45 @@ -i:i:i:i:::,,:,:,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i::,,,,,:,:::,:,:,:::,:,:,:::,:,,,::i:i::::,i:i:i:i: -:i:i:i::rX;r7XXr:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:ii7ri:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:;r;:i::r7;r7XX;::,;X;rX:::X;7r:,,:77X;ri::i::,;r;:i:i:i:i -i:i:i:i:r22aXrX22S;,::i:i:i:::i:i::::,i:i:i:i::,:,i:i:i::,S2ar::i::::,::::::i:i:i,i:::::i:i:iSr8::i,7ZSa7rXa2SiiaSZX:::rMZ;.:X8a77a8Z:::i:;SX8::i:i:i: -:i:i:i::,;X2.,..27a,,::::i,:::::,:.,,:,:,:::,:,:,,,:,i:::,.::,,i::,::,,:,:,::i,:,:,:,,,:,i:::2;2,:::,XXS.,..SSX,iSS,,i,.@S :aa7,,:.XBi:i:::2;2,::i:i:i -i:i:i:i::;SSi,:;ZSr:ZXZ;::22a7,;aXZ2ZSZS;,:X2aaaa2a7::i:SSaXZ,::i:S2aaZ2a2X,:,:i2a22S2S2;:i,:XZ;::i,,XXS::;S2X:.rX2::::.MS.S7S,,:,,.,,::i:,S2r,:i:i:i: -:i:i:i::,;XaXZ2Z;i,:iZS;,:,a27.,XX87,,iZa:,:SaZ;,,SZX::i::;aS,:i::,22Z::,2ZS,:X82,.,S8X;:::i,X0i,i::,S7arXXBa7.,;S2:::,.@S aiZ.:,r;::ri:::,XBr,::i:i:i -i:i:i:i::;SS.,2S;.,,:22i,,,Xar,.7X2.,,:2a,:.S2i.:.X2S,:::,i22,::i:,Sa:,,,X2X,,raa:,,aa;,::i::7B:::i,,XXS..,.SX2.rX2,:::.MS.2;2,,:;aXaS;:i::7@i::i:i:i: -:i:i:i::,iX2.,ia2;,,:Z2i.:.22r.,rXS,,:,22,.,XZi,,,ra7::i,,:aS,::::.Sai,:.XSX.,,ZZ22a7:.,:i:i,:i,::::.XXS.,..77a:;2S,,:..M2.;a2r,,,:S2i,:::,:i,,i:i:i:i -i:i:i:i,;S2aX:,7aZSi:2Z2r7aWSZ7iZS8r::XZZ7:;ZZ2i:;Z2Zi:,7rSaZr7i::7aZSi,rZaa;.;82r77r7X:::i:;X7ai:i:rZ2ZrrXSZS7,:Xa2XrXZ0::,;S8SrrZSZi::i:;X7ai:i:i:i: -:i:i:i::rS;rX;,,;rX;,:i7rX;;;ii;XrrX,iXr;XiXrrX;,77;77,:7X7rrXXr:iX7;Xi:rX;X;iZ8i...,2BZ,::::rr7:i::7X;7XXX7i:::,::7XXX;,:::,:iXXX7:,::i:i:rrX:i:i:i:i -i:i:i:i:i::,:::,::::i,:,:::,:,:,:::::::,:::,:,:,i::,:::::::,:,:,i::,:::::,:,:,7Sa2SS2aX:::i:i:::i:i::,:,:,:,::i:i::,:,::::i:i::,:,::::i:i:i,::::i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:::i:::i:i:i:i:i:::::::::i:i:i:i:i::::::,:,iii::,::i:i:i:i:i:i:i:::i:i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,,,:,::::i:i:i:i:i:i:i:i:i:i:::i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,XXaXaa:,i:,.:,i:i:::::::i::,:::::,:::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,MS. :2M,:,,;W.,:i::,:,,,:,:,,.,,:,:,:,:0;,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,WMZX, ,,rXMM7Xr::iZSXXZr,,2ZMS;2@0::X0MSSX::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,.iaZ@@a.:,.ZM ,,:,iZi;rWM ,,.MM::7Z,:.rM:.:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::2. . iM2,,.8M .::,ZBi;:aM .. MZ .::::,rM..,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,MW7r72Mi::,7MXXZi.MM;i;0MSiiiMWii,:::,:MZ7a7::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::r;X7r.::i,,:Xri,:.;77i:;r:r;rrrii:i::,.7X;::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,::::i::::,:::::::,:,:::::,,:::i:i::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:::::::i:::::i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:::::,::i:i:i:i:i:i::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::i::::::::::i:i:::i:i:iiir7,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::;MB,:,aM2,:::,:::,::i:r;MM.:i::,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, Ma...iMi,,:.irr:,,::i,.WM :::i7i,i7;,.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M0:riSM;.,iBX77ZM;,i:, @W.,i,;SM8XXSM8.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MZ:::7Mi. MM,::;M@::i,.W@ :::, Mr . XM;,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MZ ,.;M;..MM.:,:i;,i:: @@.,::: Mi...XMi,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:irMB,,:2MS:.rWZ7XXZi::i7rMM;7::,.M8;XSMS,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i,i::,i,i,:,,:;;i,::::;i::;;i:::M7ii;.,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:,:::,:,,,:,:,,,,:,,:,:,:::,:,:.,,:,:iXZX:,,:,:::::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.,.,.,.......,.,.,.,.,.,.,.,.....,.. ..,.,.,.,.,.,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,0W0BBW0Z8B0B08ZBBWBWBWBWBWBWBWBBZZ0WBWBWBBBBBWBWBWBB0W8,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MB:i;:rMZ7XXaWW:iii:i:i:i:ii;ii:WM7i;i;ii::.::ii;iii:@M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MZ ,,..M; .. iZi.,.. . ..,,:,:..;S.,,:,:...Mr..,,:,, 0M ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MZ.,:.,M7,:;Mr,,:i2MM. 0M2;:::XX0W.,::i:XXZM8727:::,.0M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MZ :::,MX:i7MX.:::.:@M0X,,,i:i,.8M ::i:i,..Mr..::i:: BM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, MZ.,:,:Mr.,...i;:,, SWMZ,.::i:, 8M.,i:i::.:MX ,:i::,.0M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::, MZ ,,,iMX:iii8M;,iXMr MMS::::i:8M:i::,:,,.MMr7Zi:,: BM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, MZ ., . ..,.,:. ..:. .,..,.,.. ..,.,.,.. ..,...,. 0M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.MMBWWWBBBWWWBWBWWWBBBWWWBWW@W@WWBWBWWWW@W@WWBWBWW@WWBMM.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.::i:::i:i:i:::i:::i:i:::i:i:i:i:i:::::i:i:i:i:i:i::.,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:::,,:,:,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i::,,,,,:,:::,:,:,:::,:,:,:::,:,,,::i:i::::,i:i:i:i: +:i:i:i::rX;r7XXr:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:ii7ri:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:;r;:i::r7;r7XX;::,;X;rX:::X;7r:,,:77X;ri::i::,;r;:i:i:i:i +i:i:i:i:r22aXrX22S;,::i:i:i:::i:i::::,i:i:i:i::,:,i:i:i::,S2ar::i::::,::::::i:i:i,i:::::i:i:iSr8::i,7ZSa7rXa2SiiaSZX:::rMZ;.:X8a77a8Z:::i:;SX8::i:i:i: +:i:i:i::,;X2.,..27a,,::::i,:::::,:.,,:,:,:::,:,:,,,:,i:::,.::,,i::,::,,:,:,::i,:,:,:,,,:,i:::2;2,:::,XXS.,..SSX,iSS,,i,.@S :aa7,,:.XBi:i:::2;2,::i:i:i +i:i:i:i::;SSi,:;ZSr:ZXZ;::22a7,;aXZ2ZSZS;,:X2aaaa2a7::i:SSaXZ,::i:S2aaZ2a2X,:,:i2a22S2S2;:i,:XZ;::i,,XXS::;S2X:.rX2::::.MS.S7S,,:,,.,,::i:,S2r,:i:i:i: +:i:i:i::,;XaXZ2Z;i,:iZS;,:,a27.,XX87,,iZa:,:SaZ;,,SZX::i::;aS,:i::,22Z::,2ZS,:X82,.,S8X;:::i,X0i,i::,S7arXXBa7.,;S2:::,.@S aiZ.:,r;::ri:::,XBr,::i:i:i +i:i:i:i::;SS.,2S;.,,:22i,,,Xar,.7X2.,,:2a,:.S2i.:.X2S,:::,i22,::i:,Sa:,,,X2X,,raa:,,aa;,::i::7B:::i,,XXS..,.SX2.rX2,:::.MS.2;2,,:;aXaS;:i::7@i::i:i:i: +:i:i:i::,iX2.,ia2;,,:Z2i.:.22r.,rXS,,:,22,.,XZi,,,ra7::i,,:aS,::::.Sai,:.XSX.,,ZZ22a7:.,:i:i,:i,::::.XXS.,..77a:;2S,,:..M2.;a2r,,,:S2i,:::,:i,,i:i:i:i +i:i:i:i,;S2aX:,7aZSi:2Z2r7aWSZ7iZS8r::XZZ7:;ZZ2i:;Z2Zi:,7rSaZr7i::7aZSi,rZaa;.;82r77r7X:::i:;X7ai:i:rZ2ZrrXSZS7,:Xa2XrXZ0::,;S8SrrZSZi::i:;X7ai:i:i:i: +:i:i:i::rS;rX;,,;rX;,:i7rX;;;ii;XrrX,iXr;XiXrrX;,77;77,:7X7rrXXr:iX7;Xi:rX;X;iZ8i...,2BZ,::::rr7:i::7X;7XXX7i:::,::7XXX;,:::,:iXXX7:,::i:i:rrX:i:i:i:i +i:i:i:i:i::,:::,::::i,:,:::,:,:,:::::::,:::,:,:,i::,:::::::,:,:,i::,:::::,:,:,7Sa2SS2aX:::i:i:::i:i::,:,:,:,::i:i::,:,::::i:i::,:,::::i:i:i,::::i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:::i:::i:i:i:i:i:::::::::i:i:i:i:i::::::,:,iii::,::i:i:i:i:i:i:i:::i:i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,,,:,::::i:i:i:i:i:i:i:i:i:i:::i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,,XXaXaa:,i:,.:,i:i:::::::i::,:::::,:::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,MS. :2M,:,,;W.,:i::,:,,,:,:,,.,,:,:,:,:0;,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,WMZX, ,,rXMM7Xr::iZSXXZr,,2ZMS;2@0::X0MSSX::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,.iaZ@@a.:,.ZM ,,:,iZi;rWM ,,.MM::7Z,:.rM:.:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::2. . iM2,,.8M .::,ZBi;:aM .. MZ .::::,rM..,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,MW7r72Mi::,7MXXZi.MM;i;0MSiiiMWii,:::,:MZ7a7::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::r;X7r.::i,,:Xri,:.;77i:;r:r;rrrii:i::,.7X;::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,::::i::::,:::::::,:,:::::,,:::i:i::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:::::::i:::::i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:::::,::i:i:i:i:i:i::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::i::::::::::i:i:::i:i:iiir7,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::;MB,:,aM2,:::,:::,::i:r;MM.:i::,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, Ma...iMi,,:.irr:,,::i,.WM :::i7i,i7;,.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M0:riSM;.,iBX77ZM;,i:, @W.,i,;SM8XXSM8.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MZ:::7Mi. MM,::;M@::i,.W@ :::, Mr . XM;,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MZ ,.;M;..MM.:,:i;,i:: @@.,::: Mi...XMi,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:irMB,,:2MS:.rWZ7XXZi::i7rMM;7::,.M8;XSMS,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i,i::,i,i,:,,:;;i,::::;i::;;i:::M7ii;.,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:,:::,:,,,:,:,,,,:,,:,:,:::,:,:.,,:,:iXZX:,,:,:::::,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.,.,.,.......,.,.,.,.,.,.,.,.....,.. ..,.,.,.,.,.,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,0W0BBW0Z8B0B08ZBBWBWBWBWBWBWBWBBZZ0WBWBWBBBBBWBWBWBB0W8,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MB:i;:rMZ7XXaWW:iii:i:i:i:ii;ii:WM7i;i;ii::.::ii;iii:@M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MZ ,,..M; .. iZi.,.. . ..,,:,:..;S.,,:,:...Mr..,,:,, 0M ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MZ.,:.,M7,:;Mr,,:i2MM. 0M2;:::XX0W.,::i:XXZM8727:::,.0M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MZ :::,MX:i7MX.:::.:@M0X,,,i:i,.8M ::i:i,..Mr..::i:: BM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, MZ.,:,:Mr.,...i;:,, SWMZ,.::i:, 8M.,i:i::.:MX ,:i::,.0M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::, MZ ,,,iMX:iii8M;,iXMr MMS::::i:8M:i::,:,,.MMr7Zi:,: BM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, MZ ., . ..,.,:. ..:. .,..,.,.. ..,.,.,.. ..,...,. 0M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.MMBWWWBBBWWWBWBWWWBBBWWWBWW@W@WWBWBWWWW@W@WWBWBWW@WWBMM.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.::i:::i:i:i:::i:::i:i:::i:i:i:i:i:::::i:i:i:i:i:i::.,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:,,,,,:,:,,,:,:,,,:,:,:,:,:,:,:,,,:,:,:,:,:,,,:,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: \ No newline at end of file diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_help.txt" b/Media/ASCII/menu_help.txt similarity index 99% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_help.txt" rename to Media/ASCII/menu_help.txt index f8cbc4d..d3e1387 100644 --- "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_help.txt" +++ b/Media/ASCII/menu_help.txt @@ -1,45 +1,45 @@ -i:i:i:i,;ii:;i;,,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:ii,::i:i:i:i:i:i:i:i:i:i:i:i:i:i::ii,::::;::i;ii,,,:;i:;:::;::i:,,.:;;:::::i:i::ii,i:i:i:i: -:i:i:i::7ZXaXX2ZXS:::i:i:i:i:i:i:::::i:i:i:i:::::i:i:i:i,iZSZi:i:i:i:::::::i:i:i:i:i:i:i:i::X7Zr,::;a222X2Z2Xi:2a2Z;,:7BBX:,;a8SXZaZ,::i::S70::i:i:i:i -i:i:i:i,:;SS..,,272,,,:,:::,:,:::,:,,,:,:::::,,,:,:,i:i::,::i,i:i,:,:,:,,:::i::,:,:,,,::i:i,Siai::i,:SS:,..SX2,.2Sr,:,,aW ,XZa:,:.XMr,i:i,2i8,::i:i:i: -:i:i:i::,rXS.,.:2S7iS72i,iS72;,rXXXXSXXr,::S7S;SXS7i:i:;XX7X7::i:;XXX7SSX7::::,iXSXX;X7X:i::r2S::i::i2Si.,:2XX.,SSr,::.ZB i2Xr,:::,;,::i:,XX7,:i:i:i:i -i:i:i:i::;XaS2SaX;::X2ai::raa;::aXWSri2ZX,:72887;rZai,::;i22S,::i:X20a7iXZZ::,X82;;X88XX::i:i8X,::i:iSXXXXB0X.,,2X7,:,,ZW X;2,::::,.,::::,70X,i:i:i:i: -:i:i:i:i,rX2,X22.,,::aSi,:.a2;,,XSX..,;a2:,iSa.,.,Xa;::i,,7aX::i:,i2S..:,22i,,Z2:. :aa.::i::,WX::i::i2X;,::SSS:,SSr,::.ZB.XrSi,:;aX7a7:i::;MX::i:i:i:i -i:i:i:i:,;SS..SS2.:,;22,:,,S2i,.XXS.:,r22.,:22:,:.22;,i::.X2X,:::,;22.:,iS2:,.;0ZXX22::,i:i:,Xi,i:i:iSSi:,,.S7S.2Xr,:,.Z@ iaX7,,,,aSX,::i,:X:,::i:i:i: -:i:i:i::,rX2,,,a22,,:82r,:XBSX:,SSS,,:raS,.i2Z,:,,Sa;,:::,XaX,,::,;a2,,::22i..XZXXX7ii,::i::;ir;::::i2S;,,:SS2;,SZS:,,;Ma,,XaZ;,.i2a7::i:i;i7i:i:i:i:i -i:i:i:i:XZS2Z;:i2aZ;,;S2SaaZXSrX8XZX:r8SZS;Z22Z::2ZSZ;:ia2ZSZ2Zi:rZSZS:iZ22Zi;aZi:ii7a8ii:i:SrZ7:::;ZS2a2aZ27i:::raZSaZ7,::,iX822ZXr;:i:ii278ii:i:i:i: -:i:i:i:i::,:::,:,:,:::,:::,,,:::,:,:,:,,,:::,,::,:,:,:::::,,,::i::,,,:,:::,:,XZa;i:i70ai:i:i:i,::i:::,,:,:,,,:::::,:::,:,:::::,:::,::::i::,i:::i:i:i:i -i:i:i:i:::::::i:::i:i:::i:i::::::,::::::i::::,i:i:::::i:::::i:i:i:i:i:i:i:i::,i;SS2SXi::i:i:::i:i:i:::i:::i:::i:i:::::i:i:i:i:::i:i:i:i:i:i:::i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::,:::,::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,;i:,,:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::X2X2XMZ:::.,,:,i:i::::::::::,:::::,:,:.:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::7M, .SZ,::iM8:i:i,,,i:i.::ii:.,,i,:,i:0B:ii:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,0MBa; ,,7XM07Xi:,20X7S@;,;ZWMrSZMX:rXMMrSi::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::...X2WMa.:, M2 ,::.XXr7;MZ., XM7.,r;:, M0 .::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,XZ. . 2M:,, M2 .;,iMS:: Ma...XM ,,:,:,.M@ ,ii:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::;MZX7X0Z.:,,0MXZS,iMZ777M@7:;0M7;::i::.aMSSa:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,i;r;,,:::,,iri::,.;rr,.i::rii;r:i:i::.:r7:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::::,:,:,:,:::::,,,:::::,:,,,,,:,:,:,::i::,:,,,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,:,:,,,,,:.:,:,,,:,:.:.,,,,:.,.,.,,:.:,,,:,:,:,,,,.:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:irr7r7r7r7rr;rrrrr;rr7r7r7r7r7r7rr;;;7r7r7r7r7r7r7r7r7r7;;,,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:.MM8BBWBBBB0B080B0B88BBBB0BBBBBBBBWWWMB0BBBBBBBBBBBBBBBBB00MM.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, M8 ,.,.,.. XMi . 0M. ,.... ....,.:;M,..,...........,.,.. MM.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M0 ,,:::::,.rM... BM ,.,.:i:...:,:..M;.:,::: .:;...:::::. @M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M0.,i:i:i::.XMri;,WM .,;8X2XW2,,i:,,M;,:::S@MX2S80:,::i:: MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MB ::i:i:i,,7M;;;iWM .iMS,..@M;:::,:M;.::: ZM....MB,:i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M0.,i:i:i::.7M,., BM 7Mr:;iiS;:i:,,Mi.,:,.ZW .. MM.::i:, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MB ::i:i:i::2Mr,.,MM,..MWriiXX,::iirMX:i:: ZM;i;ZMr,,i:i,.@M ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M0 ,:::,:,:i7X;.,:X7;.. ;rXrr:,,:ir;Xrri:. ZM.rr7 ..:,::, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.MW :,:,:,:,, ..:,, .:,,.. ..,,:,,.. ..,,:rBM; . ,,,,:,:,.MM ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.@MWW@@@@@W@W@W@W@W@W@@@W@W@@@@@@@W@W@W@W@W@BBWWW@W@@@@M@@BM0,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.....,.,.. . ... ....,.,.,.,.,.,.,.. ..,.,.. ..,.,.,.,.,...,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:::,:,:.:i;:ii77,,:,:,:,:,:,:::::,7;,,:,:::,,.,,:,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,ZM;;irXMW:::,:,:,:,:::::,iMW.::i::,,.7.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.2M .,.i ;::rXXi :XSr::ii7;7,,,i:iiXrMM;rX:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.SM,iiBM:,:,;XMM.rMZr:i:;;rMZ.::i:ir;MM:rri:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.2M ,:iZ.,,:,. MMM ..::i:, Ma.,i:i:, @M .:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.aM ,,,.;8i,,:aXr@@7,,i::,.M8.::i:i:.WM.,;X:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::2M;;r;X@B,i;BB. ,MMri:ii;;M2;;i:i::.;WZ7Z7i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,,::i,:,:::,,,:,,,::i:i:,.,,i:i:i::,,.:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,i:i:::::i:::i:::::i:i:i::,i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i,;ii:;i;,,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:ii,::i:i:i:i:i:i:i:i:i:i:i:i:i:i::ii,::::;::i;ii,,,:;i:;:::;::i:,,.:;;:::::i:i::ii,i:i:i:i: +:i:i:i::7ZXaXX2ZXS:::i:i:i:i:i:i:::::i:i:i:i:::::i:i:i:i,iZSZi:i:i:i:::::::i:i:i:i:i:i:i:i::X7Zr,::;a222X2Z2Xi:2a2Z;,:7BBX:,;a8SXZaZ,::i::S70::i:i:i:i +i:i:i:i,:;SS..,,272,,,:,:::,:,:::,:,,,:,:::::,,,:,:,i:i::,::i,i:i,:,:,:,,:::i::,:,:,,,::i:i,Siai::i,:SS:,..SX2,.2Sr,:,,aW ,XZa:,:.XMr,i:i,2i8,::i:i:i: +:i:i:i::,rXS.,.:2S7iS72i,iS72;,rXXXXSXXr,::S7S;SXS7i:i:;XX7X7::i:;XXX7SSX7::::,iXSXX;X7X:i::r2S::i::i2Si.,:2XX.,SSr,::.ZB i2Xr,:::,;,::i:,XX7,:i:i:i:i +i:i:i:i::;XaS2SaX;::X2ai::raa;::aXWSri2ZX,:72887;rZai,::;i22S,::i:X20a7iXZZ::,X82;;X88XX::i:i8X,::i:iSXXXXB0X.,,2X7,:,,ZW X;2,::::,.,::::,70X,i:i:i:i: +:i:i:i:i,rX2,X22.,,::aSi,:.a2;,,XSX..,;a2:,iSa.,.,Xa;::i,,7aX::i:,i2S..:,22i,,Z2:. :aa.::i::,WX::i::i2X;,::SSS:,SSr,::.ZB.XrSi,:;aX7a7:i::;MX::i:i:i:i +i:i:i:i:,;SS..SS2.:,;22,:,,S2i,.XXS.:,r22.,:22:,:.22;,i::.X2X,:::,;22.:,iS2:,.;0ZXX22::,i:i:,Xi,i:i:iSSi:,,.S7S.2Xr,:,.Z@ iaX7,,,,aSX,::i,:X:,::i:i:i: +:i:i:i::,rX2,,,a22,,:82r,:XBSX:,SSS,,:raS,.i2Z,:,,Sa;,:::,XaX,,::,;a2,,::22i..XZXXX7ii,::i::;ir;::::i2S;,,:SS2;,SZS:,,;Ma,,XaZ;,.i2a7::i:i;i7i:i:i:i:i +i:i:i:i:XZS2Z;:i2aZ;,;S2SaaZXSrX8XZX:r8SZS;Z22Z::2ZSZ;:ia2ZSZ2Zi:rZSZS:iZ22Zi;aZi:ii7a8ii:i:SrZ7:::;ZS2a2aZ27i:::raZSaZ7,::,iX822ZXr;:i:ii278ii:i:i:i: +:i:i:i:i::,:::,:,:,:::,:::,,,:::,:,:,:,,,:::,,::,:,:,:::::,,,::i::,,,:,:::,:,XZa;i:i70ai:i:i:i,::i:::,,:,:,,,:::::,:::,:,:::::,:::,::::i::,i:::i:i:i:i +i:i:i:i:::::::i:::i:i:::i:i::::::,::::::i::::,i:i:::::i:::::i:i:i:i:i:i:i:i::,i;SS2SXi::i:i:::i:i:i:::i:::i:::i:i:::::i:i:i:i:::i:i:i:i:i:i:::i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::,:::,::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,;i:,,:i:i:::i:i:i:i:i:i:i:i:i:i:i:i:::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::X2X2XMZ:::.,,:,i:i::::::::::,:::::,:,:.:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::7M, .SZ,::iM8:i:i,,,i:i.::ii:.,,i,:,i:0B:ii:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,0MBa; ,,7XM07Xi:,20X7S@;,;ZWMrSZMX:rXMMrSi::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::...X2WMa.:, M2 ,::.XXr7;MZ., XM7.,r;:, M0 .::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,XZ. . 2M:,, M2 .;,iMS:: Ma...XM ,,:,:,.M@ ,ii:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::;MZX7X0Z.:,,0MXZS,iMZ777M@7:;0M7;::i::.aMSSa:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,i;r;,,:::,,iri::,.;rr,.i::rii;r:i:i::.:r7:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::::,:,:,:,:::::,,,:::::,:,,,,,:,:,:,::i::,:,,,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:,:,:,,,,,:.:,:,,,:,:.:.,,,,:.,.,.,,:.:,,,:,:,:,,,,.:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:irr7r7r7r7rr;rrrrr;rr7r7r7r7r7r7rr;;;7r7r7r7r7r7r7r7r7r7;;,,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:.MM8BBWBBBB0B080B0B88BBBB0BBBBBBBBWWWMB0BBBBBBBBBBBBBBBBB00MM.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:, M8 ,.,.,.. XMi . 0M. ,.... ....,.:;M,..,...........,.,.. MM.,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M0 ,,:::::,.rM... BM ,.,.:i:...:,:..M;.:,::: .:;...:::::. @M ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M0.,i:i:i::.XMri;,WM .,;8X2XW2,,i:,,M;,:::S@MX2S80:,::i:: MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MB ::i:i:i,,7M;;;iWM .iMS,..@M;:::,:M;.::: ZM....MB,:i:i, MM ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M0.,i:i:i::.7M,., BM 7Mr:;iiS;:i:,,Mi.,:,.ZW .. MM.::i:, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MB ::i:i:i::2Mr,.,MM,..MWriiXX,::iirMX:i:: ZM;i;ZMr,,i:i,.@M ,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M0 ,:::,:,:i7X;.,:X7;.. ;rXrr:,,:ir;Xrri:. ZM.rr7 ..:,::, MM ,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.MW :,:,:,:,, ..:,, .:,,.. ..,,:,,.. ..,,:rBM; . ,,,,:,:,.MM ::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.@MWW@@@@@W@W@W@W@W@W@@@W@W@@@@@@@W@W@W@W@W@BBWWW@W@@@@M@@BM0,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.....,.,.. . ... ....,.,.,.,.,.,.,.. ..,.,.. ..,.,.,.,.,...,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,:::,:,:.:i;:ii77,,:,:,:,:,:,:::::,7;,,:,:::,,.,,:,:,:,:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,ZM;;irXMW:::,:,:,:,:::::,iMW.::i::,,.7.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.2M .,.i ;::rXXi :XSr::ii7;7,,,i:iiXrMM;rX:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.SM,iiBM:,:,;XMM.rMZr:i:;;rMZ.::i:ir;MM:rri:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.2M ,:iZ.,,:,. MMM ..::i:, Ma.,i:i:, @M .:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.aM ,,,.;8i,,:aXr@@7,,i::,.M8.::i:i:.WM.,;X:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::2M;;r;X@B,i;BB. ,MMri:ii;;M2;;i:i::.;WZ7Z7i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,,::i,:,:::,,,:,,,::i:i:,.,,i:i:i::,,.:,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,i:i:::::i:::i:::::i:i:i::,i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: \ No newline at end of file diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_start.txt" b/Media/ASCII/menu_start.txt similarity index 99% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_start.txt" rename to Media/ASCII/menu_start.txt index 6bea72f..d93c4a9 100644 --- "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/ASCII/menu_start.txt" +++ b/Media/ASCII/menu_start.txt @@ -1,45 +1,45 @@ -i:i:i:i:i::;i:ii;i,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:;i,::i:i:i:i:i:i:i:i:i:i:i:i:i:i,:i:,i::ii,ii;i,,:,;i:i;,:i;,;::,,,;;i,i,::i:::;:::i:i:i: -:i:i:i:i:i:2ZSZXSZ2Xr:,::i:i:i:i:i:i:i:i:i:i:::i:::i:i:i:i::Z2Zi:i:i:::i:i:::i:i:i:::::::i:i:iS7Z::i:XZSZXXZaSr,78S87:,rZMSi,iS02SaZZ::i:i,270,::i:i:i -i:i:i:i:i::.XXX.,.X7Zi,,:::::,:,:::,:,,::::::::,:,:,:,::i::,::i,::i::,:,:,:,i:i:i,:,:,:,::i:::2ia,:::.SXS.,.rXai.7XX:::.rM..raZi:,,rMX::i::2;Z,:i:i:i: -:i:i:i:i:i::XS7...7S2:77XX,:;XXX,iX7X;XXXr,::XrXiXXXri:::iXXrXr::i:;XX7rXX7;,:::,i7XXr;77;:i:,X2r,:i,,XXX,..rSS:.SXS,:::rM.,aXX,,:,,;i,::i,XXX,::i:i:i -i:i:i:i:i::,SXZXXXaX;.rZaX:,;aaS,:SS08X;SZ2,:raZWXr7ZZi:i:7;a2S,i::iS2WaXr2Z2,::X82;7a0a2;i::,X8;,::i,S7a7Xa@Si.,XSS,,i.7M.iXXr,:::,,,::i::rB7,,i:i:i: -:i:i:i:i:i::XSSiaa7..:.X2X,:,7aX.,iSS..,.a2i,,XZi,,,Xar::i:,raX::i::i2S..,:22:,;8S . ;aS.::i:,7@:::i::XXS::iX2Xi.SXS,:::rM r7X;,,r2X;aX::i,;@X,::i:i:i -i:i:i:i:i::,SXX.i22i:,,S27,,,ra7,,;X2,:,:22:,,Sai,:.S2r,:::.X2X,::i,r2S.,,;S2,:.X02rXaa:::i:::;2,,i::.SXX.:..Xra.XXX,,:.rM,,arX,:,:2SS::i:::a:,:i:i:i: -:i:i:i:i:i,,XSX,.72Z:,.2aX.,.Z2S,,iSS,:,,a2,.,SZ::,,Xa;:::,,rZ7,,:,:iaS,,:i2S,.,SZX2Sr,,,::i:iiii::i:,XSX.,,,aX2.X22.:,,ZM.,7Za;.,.aSS,::::i:;:::i:i:i -i:i:i:i:i:iS8S8X:,S28X:i2a22ZBa2SiZSZS::aaZ2iSZaZi:X828;:i2SZ2ZS2i:r828X:i82ZS,iZar;rrSaX,i::i2X8ii::X8S8SSa8SX,,:X2ZS2ZZi,,,;S8aXZaXr::i:i2X8;:i:i:i: -:i:i:i:i:i:;:ii;,:,ii;,:,ii;,,i:,iiii;,i;i:;:;::;i,;ii;i:i;;i:i;;i:i;i:;:i;i:;,aZX...,XBa::i::i;:::::;ii:;;;::,:::,:i;ii,::i::,i;;i,,::i:i:i;;:i:i:i:i -i:i:i:i:i:i:::::::i:::i::::,:,::i,:::,i::::,:,,,,,:,,,,,:,:,,,:,,,:,:,:,:,:,,,::rXaS22S;,,:,:,:,,,:,:,,,:,:,::i:i:i:::::i:i:i::::,:,::i:i:i:::i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.. . . . ..,.,.,.,.,.,.,.,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,7ZZ88880888888888080808080888080808088Z8Z8Z8Z8808880808080ZZZi,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MMXXSSSSSXX7X77rXXSSSXSSSSSS2SSSSS2SSXSSSSSXSXSXSXSXSSSS2XSSMr::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.MW .,,.,.. ;rX;X:..,.. ..,,,.,.,.,,,.,.,.,.,.,.. ..,,,.,., .Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MW ,::i,,:Mi.,iM@.:..S7.:,:,:.,.,.:,:...,.,.:,, Si,,:::::,,,M;,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M@ ::i:i,iM0;, .:,7SM0XXi::iSSXS;.:7Z8S,XZ8,:7ZMZ7X:::i:i.:Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MW.,i:i::..a@WWa..,:,Ma,i::,0S;iSM;.iiMM7;XMi:iiM;:i::i:i:,,M;,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MM ::i:i:i,. .;@M:,, MX ,:,,SXXXiM;.. BM ..,::.iMi :,i:i::,:Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M@ ,i:i::;M7:..SM,:,.M0.7X,XM;. iMSi, MM .::i,::MX,7X:i:i:,,M;,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M@ :::,:,.8ZS2S2,,,,.r0ZS;.,2ZSSr8Z;iX0W7r,:::,.r0a2i:::::.:Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MW .,,,,,.. . . ..,.. ..,.. . . . . ..,.:.,.. ....,.:.. M;,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:.MMXSS2S2S2SSS2S2S2S2S2SSS2S2SSS2SSS2S2SSS2S2S2S2S2S2S222S2S2M7.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.7aZZ8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8ZZZZZZZZZ8Z8Z8Z8Z8Z8Z8Z8Z8ZZZZ:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.,.,.,.,...... ..,.,.,.,.,.,.. . ..,.,.,.,.,.,.,.,.,.,.,.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::,::;;;.,:;;i,:,:,:,:::,:i;7Z,:::,:,:::::,:::::,::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:XMX,,:MM::,:,:,::::i:iiZM,,:::,:,:::,::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;Mi., 0M ,:,:;Xr..::i,.7M.::::X7,:X7:.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMX;;iWM ,.Z8777M0.:::.XM.,i:iXMM7XXMB.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M7:i.WM rM7,:.MMi:i,.7M.::i, Ma . ;M7,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iM:...0M .7M;::i,r,:::.XM..i:: MX...iMr,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::2MS.:,MMi.,B@7r;ZX:::;;aM;ri:,.M@ir7M0,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:ir7;:,ir7;:,,i777i:,i:rrrrrr;,: MZir7:,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:,:,:,:,:::,:,::::i:i::,:,:::iSM0::,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i::,,.::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::,::i:i:i:i:i:i:i::::,::i:::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::;;ii;77,::::::i:i:::i:i:ir;,i:i:i::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,SMXir;SM@:i,:,:,:,::i:i:,XMZ::i:i,:.;i,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,7M ...,.;:,r77,.,77r:i:;;;;,.::i:;r7MW;7;i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.7Mii;ZM,,,:r2M@ XM8r::i;72M;,:i:i;7rM0r77,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,,rM,:,r0:,:,:. MM8 ,:i::.:Mr.::i::. M2 ,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.XM..:...2::,,7a2Ma:.::i:,iM;,:i:i:: M8 .;;i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i -i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::XM;;;;XM@::rW@ iMM;:i:;iXMXi;:i:i,.0MXSZ;:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: -:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.::iii:,,::i,:,,.::i:i:i,,,iii:i:::,.::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i::;i:ii;i,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:;i,::i:i:i:i:i:i:i:i:i:i:i:i:i:i,:i:,i::ii,ii;i,,:,;i:i;,:i;,;::,,,;;i,i,::i:::;:::i:i:i: +:i:i:i:i:i:2ZSZXSZ2Xr:,::i:i:i:i:i:i:i:i:i:i:::i:::i:i:i:i::Z2Zi:i:i:::i:i:::i:i:i:::::::i:i:iS7Z::i:XZSZXXZaSr,78S87:,rZMSi,iS02SaZZ::i:i,270,::i:i:i +i:i:i:i:i::.XXX.,.X7Zi,,:::::,:,:::,:,,::::::::,:,:,:,::i::,::i,::i::,:,:,:,i:i:i,:,:,:,::i:::2ia,:::.SXS.,.rXai.7XX:::.rM..raZi:,,rMX::i::2;Z,:i:i:i: +:i:i:i:i:i::XS7...7S2:77XX,:;XXX,iX7X;XXXr,::XrXiXXXri:::iXXrXr::i:;XX7rXX7;,:::,i7XXr;77;:i:,X2r,:i,,XXX,..rSS:.SXS,:::rM.,aXX,,:,,;i,::i,XXX,::i:i:i +i:i:i:i:i::,SXZXXXaX;.rZaX:,;aaS,:SS08X;SZ2,:raZWXr7ZZi:i:7;a2S,i::iS2WaXr2Z2,::X82;7a0a2;i::,X8;,::i,S7a7Xa@Si.,XSS,,i.7M.iXXr,:::,,,::i::rB7,,i:i:i: +:i:i:i:i:i::XSSiaa7..:.X2X,:,7aX.,iSS..,.a2i,,XZi,,,Xar::i:,raX::i::i2S..,:22:,;8S . ;aS.::i:,7@:::i::XXS::iX2Xi.SXS,:::rM r7X;,,r2X;aX::i,;@X,::i:i:i +i:i:i:i:i::,SXX.i22i:,,S27,,,ra7,,;X2,:,:22:,,Sai,:.S2r,:::.X2X,::i,r2S.,,;S2,:.X02rXaa:::i:::;2,,i::.SXX.:..Xra.XXX,,:.rM,,arX,:,:2SS::i:::a:,:i:i:i: +:i:i:i:i:i,,XSX,.72Z:,.2aX.,.Z2S,,iSS,:,,a2,.,SZ::,,Xa;:::,,rZ7,,:,:iaS,,:i2S,.,SZX2Sr,,,::i:iiii::i:,XSX.,,,aX2.X22.:,,ZM.,7Za;.,.aSS,::::i:;:::i:i:i +i:i:i:i:i:iS8S8X:,S28X:i2a22ZBa2SiZSZS::aaZ2iSZaZi:X828;:i2SZ2ZS2i:r828X:i82ZS,iZar;rrSaX,i::i2X8ii::X8S8SSa8SX,,:X2ZS2ZZi,,,;S8aXZaXr::i:i2X8;:i:i:i: +:i:i:i:i:i:;:ii;,:,ii;,:,ii;,,i:,iiii;,i;i:;:;::;i,;ii;i:i;;i:i;;i:i;i:;:i;i:;,aZX...,XBa::i::i;:::::;ii:;;;::,:::,:i;ii,::i::,i;;i,,::i:i:i;;:i:i:i:i +i:i:i:i:i:i:::::::i:::i::::,:,::i,:::,i::::,:,,,,,:,,,,,:,:,,,:,,,:,:,:,:,:,,,::rXaS22S;,,:,:,:,,,:,:,,,:,:,::i:i:i:::::i:i:i::::,:,::i:i:i:::i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.. . . . ..,.,.,.,.,.,.,.,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,7ZZ88880888888888080808080888080808088Z8Z8Z8Z8808880808080ZZZi,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MMXXSSSSSXX7X77rXXSSSXSSSSSS2SSSSS2SSXSSSSSXSXSXSXSXSSSS2XSSMr::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,.MW .,,.,.. ;rX;X:..,.. ..,,,.,.,.,,,.,.,.,.,.,.. ..,,,.,., .Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MW ,::i,,:Mi.,iM@.:..S7.:,:,:.,.,.:,:...,.,.:,, Si,,:::::,,,M;,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M@ ::i:i,iM0;, .:,7SM0XXi::iSSXS;.:7Z8S,XZ8,:7ZMZ7X:::i:i.:Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MW.,i:i::..a@WWa..,:,Ma,i::,0S;iSM;.iiMM7;XMi:iiM;:i::i:i:,,M;,,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, MM ::i:i:i,. .;@M:,, MX ,:,,SXXXiM;.. BM ..,::.iMi :,i:i::,:Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: M@ ,i:i::;M7:..SM,:,.M0.7X,XM;. iMSi, MM .::i,::MX,7X:i:i:,,M;,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i, M@ :::,:,.8ZS2S2,,,,.r0ZS;.,2ZSSr8Z;iX0W7r,:::,.r0a2i:::::.:Mr.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:: MW .,,,,,.. . . ..,.. ..,.. . . . . ..,.:.,.. ....,.:.. M;,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:.MMXSS2S2S2SSS2S2S2S2S2SSS2S2SSS2SSS2S2SSS2S2S2S2S2S2S222S2S2M7.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.7aZZ8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8ZZZZZZZZZ8Z8Z8Z8Z8Z8Z8Z8Z8ZZZZ:::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,,.,.,.,.,.,...... ..,.,.,.,.,.,.. . ..,.,.,.,.,.,.,.,.,.,.,.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::,::;;;.,:;;i,:,:,:,:::,:i;7Z,:::,:,:::::,:::::,::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:XMX,,:MM::,:,:,::::i:iiZM,,:::,:,:::,::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;Mi., 0M ,:,:;Xr..::i,.7M.::::X7,:X7:.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iMX;;iWM ,.Z8777M0.:::.XM.,i:iXMM7XXMB.::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.;M7:i.WM rM7,:.MMi:i,.7M.::i, Ma . ;M7,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,iM:...0M .7M;::i,r,:::.XM..i:: MX...iMr,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::2MS.:,MMi.,B@7r;ZX:::;;aM;ri:,.M@ir7M0,:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:ir7;:,ir7;:,,i777i:,i:rrrrrr;,: MZir7:,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,:,:,:,:,:::,:,::::i:i::,:,:::iSM0::,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::::::i:i:i:i:i:i:i:i:i:i::,,.::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::::::::,::i:i:i:i:i:i:i::::,::i:::::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::;;ii;77,::::::i:i:::i:i:ir;,i:i:i::,:,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::,SMXir;SM@:i,:,:,:,::i:i:,XMZ::i:i,:.;i,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:,7M ...,.;:,r77,.,77r:i:;;;;,.::i:;r7MW;7;i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i.7Mii;ZM,,,:r2M@ XM8r::i;72M;,:i:i;7rM0r77,i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i,,rM,:,r0:,:,:. MM8 ,:i::.:Mr.::i::. M2 ,,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.XM..:...2::,,7a2Ma:.::i:,iM;,:i:i:: M8 .;;i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i +i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::XM;;;;XM@::rW@ iMM;:i:;iXMXi;:i:i,.0MXSZ;:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: +:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i::.::iii:,,::i,:,,.::i:i:i,,,iii:i:::,.::::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:::i::::,i:::::::::::i:i::,::i:i:i:i::::,::i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i:i: \ No newline at end of file diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/Running!BUG!.ico" b/Media/Running!BUG!.ico similarity index 100% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/Running!BUG!.ico" rename to Media/Running!BUG!.ico diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/help.txt" b/Media/help.txt similarity index 99% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/help.txt" rename to Media/help.txt index 8648d0c..3a7bc8a 100644 --- "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/help.txt" +++ b/Media/help.txt @@ -1,45 +1,45 @@ -****************************************************************************************************************************************************** -****************************************************************************************************************************************************** -** Background of the story: ** -** You are a BUG born of self-awareness, and now a software engineer has discovered yours in the program. ** -** ** -** There is, he uses recursive backtracking algorithm to randomly generate a maze to trap you, and sends hunters Blinky and Tinky to hunt you down.** -** ** -** Fortunately, you are a self-aware BUG, and I believe you will play these two simple AI around! ** -** ** -** ** -** ** -** ** -** ** -** ** -** Operating Introduction: ** -** W: Forward S: backward A: Rotate left D: Rotate right M: Open the map (100 information pieces need to be collected) ** -** ** -** Space: Break Walls (10s cooldown) BUG Power: Hunt hunters, break walls cooldown reduced to 3s ** -** ** -** Passive: You are equipped with a speaker that picks up the hunter's electrical signals and plays them as a heartbeat to keep you alert ** -** ** -** ** -** ** -** ** -** ** -** Game Rule: ** -** You need to evade hunters, collect the information pieces that are left in the maze, ** -** ** -** collect 100 pieces of information, you will get information about the maze you are in, ** -** ** -** ** -** ** -** when all the information pieces are collected, you will get the "BUG Power", Start chasing Blinky and Tinky(who will get faster), ** -** ** -** the program will be broken, and you, a real BUG! ** -** ** -** ** -** ** -** ** -** ** -** ** -** ** -** ** -****************************************************************************************************************************************************** +****************************************************************************************************************************************************** +****************************************************************************************************************************************************** +** Background of the story: ** +** You are a BUG born of self-awareness, and now a software engineer has discovered yours in the program. ** +** ** +** There is, he uses recursive backtracking algorithm to randomly generate a maze to trap you, and sends hunters Blinky and Tinky to hunt you down.** +** ** +** Fortunately, you are a self-aware BUG, and I believe you will play these two simple AI around! ** +** ** +** ** +** ** +** ** +** ** +** ** +** Operating Introduction: ** +** W: Forward S: backward A: Rotate left D: Rotate right M: Open the map (100 information pieces need to be collected) ** +** ** +** Space: Break Walls (10s cooldown) BUG Power: Hunt hunters, break walls cooldown reduced to 3s ** +** ** +** Passive: You are equipped with a speaker that picks up the hunter's electrical signals and plays them as a heartbeat to keep you alert ** +** ** +** ** +** ** +** ** +** ** +** Game Rule: ** +** You need to evade hunters, collect the information pieces that are left in the maze, ** +** ** +** collect 100 pieces of information, you will get information about the maze you are in, ** +** ** +** ** +** ** +** when all the information pieces are collected, you will get the "BUG Power", Start chasing Blinky and Tinky(who will get faster), ** +** ** +** the program will be broken, and you, a real BUG! ** +** ** +** ** +** ** +** ** +** ** +** ** +** ** +** ** +****************************************************************************************************************************************************** ****************************************************************************************************************************************************** \ No newline at end of file diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/die.wav" b/Media/music/die.wav similarity index 100% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/die.wav" rename to Media/music/die.wav diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/game_bgm.mp3" b/Media/music/game_bgm.mp3 similarity index 100% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/game_bgm.mp3" rename to Media/music/game_bgm.mp3 diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/get_info.wav" b/Media/music/get_info.wav similarity index 100% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/get_info.wav" rename to Media/music/get_info.wav diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/is_less_10_sound.wav" b/Media/music/is_less_10_sound.wav similarity index 100% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/is_less_10_sound.wav" rename to Media/music/is_less_10_sound.wav diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/is_less_5_sound.wav" b/Media/music/is_less_5_sound.wav similarity index 100% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/is_less_5_sound.wav" rename to Media/music/is_less_5_sound.wav diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/menu_bgm.mp3" b/Media/music/menu_bgm.mp3 similarity index 100% rename from "\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Media/music/menu_bgm.mp3" rename to Media/music/menu_bgm.mp3 diff --git a/README.md b/README.md index ca229bd..a13b75e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,55 @@ # RunningBug -这是一个3D迷宫游戏 + +## 游戏背景 + +你是一个诞生出自我意识的BUG,现在一名软件工程师已经在程序中发现了你的 +存在,TA用递归回溯算法随机生成一个迷宫将你困住,并派出了猎人Blinky和Tinky去追杀你,幸运的是你是一个有自我意识的BUG,我相信你会把这两个简单的AI耍的团团转! + +## 游戏玩法 + +你需要躲避猎人的追杀,收集遗落在迷宫的信息碎片,收集100个信息碎片,你将获得关于你所在迷宫的信息,当收集完所有信息碎片时,你将获得“BUG之力”,开始追击猎人Blinky和Tinky(它们速度会变快),程序将被破坏,而你,是一个真正的BUG! + +## 操作说明 + +W:前进 S:后退 A:左移 D:右移 M:打开地图(需收集100信息碎片) 鼠标:左右移动视角 +空格:打破墙壁(8s冷却时间) BUG之力:能够追杀猎人,破墙冷却缩短为3s +被动:你配备有一个扬声器,能够接收猎人的电信号并转化为心脏跳动声播放,以此让你时刻警惕猎人的追击 + +## 快速开始 + +**下载地址:** + +> 目前只支持windows平台,双击可执行文件后启动 **开始前需要设置控制台:** -- 窗口大小和缓冲区大小设置为宽150, 高45 -- 字体类型设置为Consolas,大小为16 \ No newline at end of file +- 窗口默认值大小和缓冲区默认值大小设置为宽150, 高45 +- 默认字体类型设置为Consolas,大小为16 + +# 构建代码 + +通过CMake构建,下载源码后直接在vscode构建,教程[在这](https://1037827920.github.io/2024/10/31/Windows%E4%B8%8A%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8CMake%E6%9E%84%E5%BB%BA%E9%A1%B9%E7%9B%AE/) + +# 技术实现 + +1. 渲染与显示 +(1)双缓冲技术实现光滑显示,告别一闪一闪亮晶晶; +(2)使用简单算法模拟第一人称视角,运用UTF-8编码中的特殊字符实现类似德军总部3D的3D效果 +(3)通过调用Windows API实现隐藏光标,绘制有颜色的字符,设置控制台字符大小,窗口大小,缓冲区大小和编码格式。 +(4)通过读取并显示ASCII字符画,绘制游戏动画效果 + +2. 算法设计 +(1)简单的光照算法,深度测试和碰撞检测算法。 +(2)运用递归回溯算法随机生成地图。 +(3)使用A*算法实现Blinky和Tinky的自动寻路,使用简单的ai算法 ,Blinky会直接定位BUG的位置追逐,而Tinky则会在BUG前两格的位置进行拦截,当BUG觉醒”BUG之力”时,它们会进入逃跑状态,速度加快。 + +3. 特色 +(1)游戏难度大,具有挑战性。 +(2)迷宫+心跳声+转角遇到爱=压迫感十足,刺激 + +4. 其他 +(1)通过调用系统自带的winmm组件,简单多线程播放音乐和音效。 +(2)异步检测键盘输入,防止线程阻塞 +(3)运用c++标准库,获取系统时间并进行计时 + + + diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/main.cpp" b/main.cpp similarity index 58% rename from "\346\272\220\344\273\243\347\240\201/cpp/main.cpp" rename to main.cpp index 8bb3f2b..e922144 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/main.cpp" +++ b/main.cpp @@ -1,54 +1,54 @@ -#include"MyConsoleEnegine.h" -#include"Game.h" - - -void PlayMusic() -{ - while (1) - { - PlaySound(NULL, NULL, SND_PURGE); - if (Game::is_less_10) - { - PlaySound(L"Media/music/is_less_10_sound.wav", NULL, SND_FILENAME | SND_LOOP | SND_ASYNC); - std::this_thread::sleep_for(std::chrono::seconds(3)); - } - if (Game::is_less_5) - { - PlaySound(L"Media/music/is_less_5_sound.wav", NULL, SND_FILENAME | SND_LOOP | SND_ASYNC); - std::this_thread::sleep_for(std::chrono::seconds(3)); - } - if (Game::is_play_get_info) - { - Game::is_play_get_info = false; - PlaySound(L"Media/music/get_info.wav", NULL, SND_FILENAME | SND_ASYNC); - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - if (Game::is_player_die) - { - PlaySound(L"Media/music/die.wav", NULL, SND_FILENAME | SND_ASYNC); - std::this_thread::sleep_for(std::chrono::seconds(2)); - Game::is_player_die = false; - } - } -} - -int main() -{ - std::thread t(PlayMusic); - - - Game::InitGlobal(); - //游戏主循环 - while (1) - { - //设置窗口名称 - Game::UpdateWindowTitle(); - //游戏状态机驱动程序r - Game::GameStateSelect(); - } - - //等待音乐播放线程结束 - t.join(); - - return 0; +#include"utils/MyConsoleEnegine.h" +#include"utils/Game.h" + + +void PlayMusic() +{ + while (1) + { + PlaySoundW(NULL, NULL, SND_PURGE); + if (Game::is_less_10) + { + PlaySoundW(L"music/is_less_10_sound.wav", NULL, SND_FILENAME | SND_LOOP | SND_ASYNC); + std::this_thread::sleep_for(std::chrono::seconds(3)); + } + if (Game::is_less_5) + { + PlaySoundW(L"music/is_less_5_sound.wav", NULL, SND_FILENAME | SND_LOOP | SND_ASYNC); + std::this_thread::sleep_for(std::chrono::seconds(3)); + } + if (Game::is_play_get_info) + { + Game::is_play_get_info = false; + PlaySoundW(L"music/get_info.wav", NULL, SND_FILENAME | SND_ASYNC); + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + if (Game::is_player_die) + { + PlaySoundW(L"music/die.wav", NULL, SND_FILENAME | SND_ASYNC); + std::this_thread::sleep_for(std::chrono::seconds(2)); + Game::is_player_die = false; + } + } +} + +int main() +{ + std::thread t(PlayMusic); + + + Game::InitGlobal(); + //游戏主循环 + while (1) + { + //设置窗口名称 + Game::UpdateWindowTitle(); + //游戏状态机驱动程序 + Game::GameStateSelect(); + } + + //等待音乐播放线程结束 + t.join(); + + return 0; } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/Game.cpp" b/utils/Game.cpp similarity index 72% rename from "\346\272\220\344\273\243\347\240\201/cpp/Game.cpp" rename to utils/Game.cpp index 9bed48a..932f5ff 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/Game.cpp" +++ b/utils/Game.cpp @@ -1,112 +1,102 @@ -#include"Game.h" - -using namespace Game; - -namespace Game -{ - //屏幕的宽度和高度 - int screen_width = 150; - int screen_height = 45; - //游戏状态跟进 - int game_state; - //游戏渲染 - Renderer renderer; - //游戏菜单 - Menu menu; - //游戏进程 - MainGameClass main_game; - //更进主要游戏的游戏状态 - int main_game_state; - //距离标志 - bool is_less_10 = false; - bool is_less_5 = false; - //是否播放收集信息碎片的提示音 - bool is_play_get_info = false; - //是否播放玩家死亡音效 - bool is_player_die = false; - //判断菜单音乐是否播放 - bool is_play_menu_music = false; - //获取控制台窗口大小的矩形 - RECT console_rect; -} - -//初始化控制台属性 -void Game::InitGlobal() -{ - game_state = GameState::GS_Menu; - //设置窗口大小 - Game::SetConsoleWindowSize(screen_width, screen_height); - //传入参数为双缓冲区的宽度和高度 - renderer.Init(screen_width, screen_height); - mciSendString(L"open Media/music/menu_bgm.mp3", 0, 0, 0); - mciSendString(L"play Media/music/menu_bgm.mp3 repeat", 0, 0, 0); - is_play_menu_music = true; -} - -//设置窗口大小 -void Game::SetConsoleWindowSize(SHORT width, SHORT height) -{ - //调整窗口大小为150 45 - system("mode con cols=150 lines=45"); - //去除最大,最小化按钮 - HWND hwnd = GetConsoleWindow(); - LONG_PTR console_style = GetWindowLongPtrA(hwnd, GWL_STYLE); - console_style = console_style & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX; - SetWindowLongPtrA(hwnd, GWL_STYLE, console_style); -} - -//更新窗口标题 -void Game::UpdateWindowTitle() -{ - std::string title; - title = "Running!BUG!"; - renderer.SetWindowTitle(title.c_str()); -} - -//游戏状态机驱动程序 -void Game::GameStateSelect() -{ - //双缓冲实现 - renderer.SwitchBuffer(); - switch (game_state) - { - case GameState::GS_Menu: - { - GameMenu(); - }break; - case GameState::GS_MainGame: - { - MainGame(); - } - break; - case GameState::GS_GameOver: - { - GameOver(); - }break; - } -} - -//游戏主菜单 -void Game::GameMenu() -{ - menu.UpdateAndRenderMenu(); -} - -//游戏进行中 -void Game::MainGame() -{ - main_game.UpdateAndRenderMainGame(); -} - -//游戏结束菜单 -void Game::GameOver() -{ - mciSendString(L"close Media/music/game_bgm.mp3", 0, 0, 0); - //播放音乐 - if (is_play_menu_music == false && is_player_die == false) - { - mciSendString(L"play Media/music/menu_bgm.mp3 repeat", 0, 0, 0); - is_play_menu_music = true; - } - menu.UpdateAndRenderGameOverMenu(); +#include"Game.h" + +using namespace Game; + +namespace Game { + //屏幕的宽度和高度 + int screen_width = 150; + int screen_height = 45; + //游戏状态跟进 + int game_state; + //游戏渲染 + Renderer renderer; + //游戏菜单 + Menu menu; + //游戏进程 + MainGameClass main_game; + //更进主要游戏的游戏状态 + int main_game_state; + //距离标志 + bool is_less_10 = false; + bool is_less_5 = false; + //是否播放收集信息碎片的提示音 + bool is_play_get_info = false; + //是否播放玩家死亡音效 + bool is_player_die = false; + //判断菜单音乐是否播放 + bool is_play_menu_music = false; + //获取控制台窗口大小的矩形 + RECT console_rect; +} + +//初始化控制台属性 +void Game::InitGlobal() { + game_state = GameState::GS_Menu; + //设置窗口大小 + Game::SetConsoleWindowSize(screen_width, screen_height); + //传入参数为双缓冲区的宽度和高度 + renderer.Init(screen_width, screen_height); + mciSendStringW(L"open music/menu_bgm.mp3", 0, 0, 0); + mciSendStringW(L"play music/menu_bgm.mp3 repeat", 0, 0, 0); + is_play_menu_music = true; +} + +//设置窗口大小 +void Game::SetConsoleWindowSize(SHORT width, SHORT height) { + //调整窗口大小为150 45 + system("mode con cols=150 lines=45"); + //去除最大,最小化按钮 + HWND hwnd = GetConsoleWindow(); + LONG_PTR console_style = GetWindowLongPtrA(hwnd, GWL_STYLE); + console_style = console_style & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX; + SetWindowLongPtrA(hwnd, GWL_STYLE, console_style); +} + +//更新窗口标题 +void Game::UpdateWindowTitle() { + std::string title; + title = "Running!BUG!"; + renderer.SetWindowTitle(title.c_str()); +} + +//游戏状态机驱动程序 +void Game::GameStateSelect() { + //双缓冲实现 + renderer.SwitchBuffer(); + switch (game_state) { + case GameState::GS_Menu: + { + GameMenu(); + }break; + case GameState::GS_MainGame: + { + MainGame(); + } + break; + case GameState::GS_GameOver: + { + GameOver(); + }break; + } +} + +//游戏主菜单 +void Game::GameMenu() { + menu.UpdateAndRenderMenu(); +} + +//游戏进行中 +void Game::MainGame() { + main_game.UpdateAndRenderMainGame(); +} + +//游戏结束菜单 +void Game::GameOver() { + mciSendStringW(L"close music/game_bgm.mp3", 0, 0, 0); + //播放音乐 + if (is_play_menu_music == false && is_player_die == false) { + mciSendStringW(L"playmusic/menu_bgm.mp3 repeat", 0, 0, 0); + is_play_menu_music = true; + } + menu.UpdateAndRenderGameOverMenu(); } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/head/Game.h" b/utils/Game.h similarity index 95% rename from "\346\272\220\344\273\243\347\240\201/head/Game.h" rename to utils/Game.h index 5694646..7f0c302 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/Game.h" +++ b/utils/Game.h @@ -1,76 +1,76 @@ -#pragma once - -#include"MyConsoleEnegine.h" -#include"Menu.h" -#include"MainGame.h" - -namespace Game -{ - namespace GameState - { - const int GS_Menu = 1; - const int GS_MainGame = 2; - const int GS_GameOver = 3; - - namespace StartMenu - { - const int GS_StartSelect = 10; - const int GS_HelpSelect = 11; - const int GS_ExitSelect = 12; - const int GS_HelpMenu = 13; - } - - namespace MainGame - { - const int GS_GameInit = 20; - const int GS_GamePlaying = 21; - const int GS_GamePuase = 22; - } - - namespace GameOverMenu - { - const int GS_GameOverMenu = 30; - const int GS_GameOverExit = 31; - } - } - - //屏幕的宽度和高度 - extern int screen_width; - extern int screen_height; - //游戏状态跟进 - extern int game_state; - //游戏渲染 - extern Renderer renderer; - //游戏进程 - extern MainGameClass main_game; - //更进主要游戏的游戏状态 - extern int main_game_state; - //距离标志 - extern bool is_less_10; - extern bool is_less_5; - //是否播放收集信息碎片的提示音 - extern bool is_play_get_info; - //是否播放玩家死亡音效 - extern bool is_player_die; - //判断菜单音乐是否播放 - extern bool is_play_menu_music; - - //初始化控制台属性 - void InitGlobal(); - //设置窗口大小 - void SetConsoleWindowSize(SHORT width, SHORT height); - //更新窗口标题 - void UpdateWindowTitle(); - //使鼠标锁定在窗口 - void LockMouse(); - //游戏状态机驱动程序 - void GameStateSelect(); - - - //游戏主菜单 - void GameMenu(); - //游戏进行中 - void MainGame(); - //游戏结束菜单 - void GameOver(); +#pragma once + +#include"MyConsoleEnegine.h" +#include"Menu.h" +#include"MainGame.h" + +namespace Game +{ + namespace GameState + { + const int GS_Menu = 1; + const int GS_MainGame = 2; + const int GS_GameOver = 3; + + namespace StartMenu + { + const int GS_StartSelect = 10; + const int GS_HelpSelect = 11; + const int GS_ExitSelect = 12; + const int GS_HelpMenu = 13; + } + + namespace MainGame + { + const int GS_GameInit = 20; + const int GS_GamePlaying = 21; + const int GS_GamePuase = 22; + } + + namespace GameOverMenu + { + const int GS_GameOverMenu = 30; + const int GS_GameOverExit = 31; + } + } + + //屏幕的宽度和高度 + extern int screen_width; + extern int screen_height; + //游戏状态跟进 + extern int game_state; + //游戏渲染 + extern Renderer renderer; + //游戏进程 + extern MainGameClass main_game; + //更进主要游戏的游戏状态 + extern int main_game_state; + //距离标志 + extern bool is_less_10; + extern bool is_less_5; + //是否播放收集信息碎片的提示音 + extern bool is_play_get_info; + //是否播放玩家死亡音效 + extern bool is_player_die; + //判断菜单音乐是否播放 + extern bool is_play_menu_music; + + //初始化控制台属性 + void InitGlobal(); + //设置窗口大小 + void SetConsoleWindowSize(SHORT width, SHORT height); + //更新窗口标题 + void UpdateWindowTitle(); + //使鼠标锁定在窗口 + void LockMouse(); + //游戏状态机驱动程序 + void GameStateSelect(); + + + //游戏主菜单 + void GameMenu(); + //游戏进行中 + void MainGame(); + //游戏结束菜单 + void GameOver(); } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/Hunter.cpp" b/utils/Hunter.cpp similarity index 68% rename from "\346\272\220\344\273\243\347\240\201/cpp/Hunter.cpp" rename to utils/Hunter.cpp index 8150277..715d3d3 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/Hunter.cpp" +++ b/utils/Hunter.cpp @@ -1,68 +1,59 @@ -#include"MyConsoleEnegine.h" - -Hunter::Hunter() -{ - this->thinking = 0; - this->move_speed = 0; - this->run_thinking = 0; - this->run_speed = 0; - this->is_death = false; -} -Hunter::~Hunter() -{ - -} - -//让猎人Blinky移动到下一个路径点 -void Hunter::BMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment) -{ - int newX = nextX; - - int newY = nextY; - - if (map[newY * map_width + newX] == '#' || newX < 0 || newX >= map_width || newY < 0 || newY >= map_height) - { - return; - } - - else - { - if (is_info_fragment[(int)y * map_width + (int)x]) - map[(int)y * map_width + (int)x] = '.'; - else if (!is_info_fragment[(int)y * map_width + (int)x]) - map[(int)y * map_width + (int)x] = ' '; - x = newX; - y = newY; - map[(int)y * map_width + (int)x] = 'B'; - } -} - -//让猎人Tinky移动到下一个路径点 -void Hunter::TMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment) -{ - int newX = nextX; - - int newY = nextY; - - if (map[newY * map_width + newX] == '#' || newX < 0 || newX >= map_width || newY < 0 || newY >= map_height) - { - return; - } - - else - { - if (is_info_fragment[(int)y * map_width + (int)x]) - map[(int)y * map_width + (int)x] = '.'; - else if (!is_info_fragment[(int)y * map_width + (int)x]) - map[(int)y * map_width + (int)x] = ' '; - x = newX; - y = newY; - map[(int)y * map_width + (int)x] = 'T'; - } -} - -//就算猎人与玩家之间的距离 -float Hunter::CalculateDistance(float playerX, float playerY) -{ - return sqrtf(pow(x - playerX, 2) + pow(y - playerY, 2)); -} +#include"MyConsoleEnegine.h" + +Hunter::Hunter() { + this->thinking = 0; + this->move_speed = 0; + this->run_thinking = 0; + this->run_speed = 0; + this->is_death = false; +} +Hunter::~Hunter() { + +} + +//让猎人Blinky移动到下一个路径点 +void Hunter::BMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment) { + int newX = nextX; + + int newY = nextY; + + if (map[newY * map_width + newX] == '#' || newX < 0 || newX >= map_width || newY < 0 || newY >= map_height) { + return; + } + + else { + if (is_info_fragment[(int)y * map_width + (int)x]) + map[(int)y * map_width + (int)x] = '.'; + else if (!is_info_fragment[(int)y * map_width + (int)x]) + map[(int)y * map_width + (int)x] = ' '; + x = static_cast(newX); + y = static_cast(newY); + map[(int)y * map_width + (int)x] = 'B'; + } +} + +//让猎人Tinky移动到下一个路径点 +void Hunter::TMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment) { + int newX = nextX; + + int newY = nextY; + + if (map[newY * map_width + newX] == '#' || newX < 0 || newX >= map_width || newY < 0 || newY >= map_height) { + return; + } + + else { + if (is_info_fragment[(int)y * map_width + (int)x]) + map[(int)y * map_width + (int)x] = '.'; + else if (!is_info_fragment[(int)y * map_width + (int)x]) + map[(int)y * map_width + (int)x] = ' '; + x = static_cast(newX); + y = static_cast(newY); + map[(int)y * map_width + (int)x] = 'T'; + } +} + +//就算猎人与玩家之间的距离 +float Hunter::CalculateDistance(float playerX, float playerY) { + return sqrtf(powf(x - playerX, 2) + powf(y - playerY, 2)); +} diff --git "a/\346\272\220\344\273\243\347\240\201/head/Hunter.h" b/utils/Hunter.h similarity index 96% rename from "\346\272\220\344\273\243\347\240\201/head/Hunter.h" rename to utils/Hunter.h index 783f918..86f0760 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/Hunter.h" +++ b/utils/Hunter.h @@ -1,29 +1,29 @@ - - -class Hunter -{ -public: - //记录猎人的位置 - float x; - float y; - //猎人思考的时间 - int thinking; - int run_thinking; - //猎人移动的速度 - int move_speed; - int run_speed; - //判断猎人是否存活 - bool is_death; - -public: - Hunter(); - ~Hunter(); - - //让猎人Blinky移动到下一个路径点 - void BMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment); - //让猎人Tinky移动到下一个路径点 - void TMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment); - - //就算猎人与玩家之间的距离 - float CalculateDistance(float playerX, float playerY); + + +class Hunter +{ +public: + //记录猎人的位置 + float x; + float y; + //猎人思考的时间 + int thinking; + int run_thinking; + //猎人移动的速度 + int move_speed; + int run_speed; + //判断猎人是否存活 + bool is_death; + +public: + Hunter(); + ~Hunter(); + + //让猎人Blinky移动到下一个路径点 + void BMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment); + //让猎人Tinky移动到下一个路径点 + void TMoveToNextPoint(int nextX, int nextY, std::wstring& map, int map_width, int map_height, bool* is_info_fragment); + + //就算猎人与玩家之间的距离 + float CalculateDistance(float playerX, float playerY); }; \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/MainGame.cpp" b/utils/MainGame.cpp similarity index 67% rename from "\346\272\220\344\273\243\347\240\201/cpp/MainGame.cpp" rename to utils/MainGame.cpp index 8d72a46..6176a98 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/MainGame.cpp" +++ b/utils/MainGame.cpp @@ -1,977 +1,908 @@ -#include"Game.h" - -using namespace Game; - -namespace Game -{ - //计时器 创建两个时间点 - auto tp1 = std::chrono::system_clock::now(); - auto tp2 = std::chrono::system_clock::now(); - //以秒为单位接受经过的时间 一帧 - float elapsed_timeS; - //玩家存活时间 - auto tp3 = std::chrono::system_clock::now(); - auto tp4 = std::chrono::system_clock::now(); - std::chrono::seconds live_time; - //计算打穿墙壁能力的时间间隔 - auto tp5 = std::chrono::system_clock::now(); - std::chrono::seconds punch_time; - //进行生成迷宫的挖掘方向 - enum Direction - { - UP, DOWN, LEFT, RIGHT, NO - }; - //迷宫单元 - struct Cell - { - bool visited; - bool walls[4]; - Cell() - { - visited = false; - for (int i = 0; i < 4; i++) - walls[i] = true; - } - }; - //迷宫 - std::vector>maze; -} - -//构造和析构函数 -MainGameClass::MainGameClass() -{ - ROW = 14; - COL = 14; - map_width = ROW * 2 + 1; - map_height = COL * 2 + 1; - map_is_open = false; - player.depth = (float)map_height; - screen = new wchar_t[screen_width * screen_height]; - attribute_array = new WORD[screen_width * screen_height]; - is_info_fragment = new bool[screen_width * screen_height]; -} -MainGameClass::~MainGameClass() -{ - delete[] screen; - delete[] attribute_array; - delete[] is_info_fragment; -} - -//更新并渲染游戏进程 -void MainGameClass::UpdateAndRenderMainGame() -{ - //计算帧率 - tp2 = std::chrono::system_clock::now(); - std::chrono::durationelapsed_time = tp2 - tp1; - tp1 = tp2; - elapsed_timeS = elapsed_time.count(); - //计算玩家存活时间 - tp4 = std::chrono::system_clock::now(); - live_time = std::chrono::duration_cast(tp4 - tp3); - //计算时间间隔 - if (!player.is_punch) - { - punch_time = std::chrono::duration_cast(tp4 - tp5); - if (num_info_fragment != 0) - { - if (punch_time == (std::chrono::seconds)8) - player.is_punch = 1; - } - else if (num_info_fragment == 0) - { - if (punch_time == (std::chrono::seconds)3) - player.is_punch = 1; - } - - } - switch (main_game_state) - { - case GameState::MainGame::GS_GameInit: - { - GameInit(); - }break; - case GameState::MainGame::GS_GamePlaying: - { - GamePlaying(); - }break; - case GameState::MainGame::GS_GamePuase: - { - GamePause(); - }break; - } -} - - - -//游戏开始前的初始化 -void MainGameClass::GameInit() -{ - player_direction = 0; - num_hunter = 2; - player.is_punch = 1; - Blinky.is_death = false; - Tinky.is_death = false; - can_open_map = 0; - collect_info = 0; - //初始化信息碎片数组 - for (int x = 0; x < map_width; x++) - { - for (int y = 0; y < map_height; y++) - { - is_info_fragment[y * map_width + x] = false; - } - } - num_info_fragment = 0; - //将字符属性数组都设置为白色 - for (int i = 0; i < screen_width * screen_height; i++) - attribute_array[i] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; - //设置随机数种子 - srand((unsigned)time(NULL)); - for (int i = 0; i < ROW; i++) - maze.push_back(std::vector(COL)); - GenerateMaze(0, 0); - SetMap(); - GenerateBlincy(); - GenerateTinky(); - GeneratePlayerPos(); - //开始游戏 - tp3 = std::chrono::system_clock::now(); - main_game_state = GameState::MainGame::GS_GamePlaying; -} - -//生成迷宫 使用递归回溯算法 -void MainGameClass::GenerateMaze(int row, int col) -{ - maze[row][col].visited = true; - std::vectordirections = { UP,DOWN,LEFT,RIGHT }; - - std::random_shuffle(directions.begin(), directions.end()); - - for (auto& direction : directions) - { - int new_row = row, new_col = col; - switch (direction) - { - case UP: - new_row--; - break; - case DOWN: - new_row++; - break; - case LEFT: - new_col--; - break; - case RIGHT: - new_col++; - break; - } - if (new_row < 0 || new_row >= ROW || new_col < 0 || new_col >= COL || maze[new_row][new_col].visited) - continue; - switch (direction) - { - case UP: - { - maze[row][col].walls[0] = false; - maze[new_row][new_col].walls[1] = false; - }break; - case DOWN: - { - maze[row][col].walls[1] = false; - maze[new_row][new_col].walls[0] = false; - }break; - case LEFT: - { - maze[row][col].walls[2] = false; - maze[new_row][new_col].walls[3] = false; - }break; - case RIGHT: - { - maze[row][col].walls[3] = false; - maze[new_row][new_col].walls[2] = false; - }break; - } - GenerateMaze(new_row, new_col); - } -} - -//给地图赋值 -void MainGameClass::SetMap() -{ - //地图字符赋值 - for (int i = 0; i < ROW; i++) - { - for (int j = 0; j < COL; j++) - { - map += L"#"; - if (maze[i][j].walls[0]) - map += L"#"; - else - map += L"."; - } - map += L"#"; - for (int j = 0; j < COL; j++) - { - if (maze[i][j].walls[2]) - map += L"#"; - else - map += L"."; - map += L"."; - - if (j == COL - 1) - if (maze[i][j].walls[3]) - map += L"#"; - else - map += L"."; - } - } - for (int i = 0; i < map_width; i++) - map += L"#"; - - //给信息碎片数组赋值 - for (int x = 0; x < map_width; x++) - { - for (int y = 0; y < map_height; y++) - { - if (map[y * map_width + x] == '.') - { - is_info_fragment[y * map_width + x] = true; - num_info_fragment++; - } - } - } -} - -//检查是否有墙壁 -bool MainGameClass::CheckWall(int x, int y) -{ - if (map[y * map_width + x] == '#') - return false; - return true; -} - -//生成猎人Blinky -void MainGameClass::GenerateBlincy() -{ - while (1) - { - Blinky.x = rand() % map_width; - Blinky.y = rand() % map_height; - if (CheckWall((int)Blinky.x, (int)Blinky.y) && Blinky.CalculateDistance(player.x, player.y) > 5) - { - map[Blinky.y * map_width + Blinky.x] = 'B'; - break; - } - } -} - -//生成猎人Tinky -void MainGameClass::GenerateTinky() -{ - while (1) - { - Tinky.x = rand() % map_width; - Tinky.y = rand() % map_height; - if (CheckWall((int)Tinky.x, (int)Tinky.y) && Blinky.CalculateDistance(player.x, player.y) > 5) - { - map[Tinky.y * map_width + Tinky.x] = 'T'; - break; - } - } -} - -//随机生成玩家的位置 -void MainGameClass::GeneratePlayerPos() -{ - player.x = rand() % map_width; - player.y = rand() % map_height; - while (map[player.y * map_width + player.x] == '#' || Blinky.CalculateDistance(player.x, player.y) <= 15) - { - player.x = rand() % map_width; - player.y = rand() % map_height; - } -} - - -//游戏进行中的总函数 -void MainGameClass::GamePlaying() -{ - SetAIBlinky(); - SetAITinky(); - PlayerTrunAndMove(); - PlayerRaySimulation(); - ShowMap(); - PauseGame(); - DrawGamePlaying(); - PlayJumpSound(); - JudgeGameOver(); - CollectInfoFragment(); - ExitGame(); -} - -//游戏玩家视角转动和前后移动 -void MainGameClass::PlayerTrunAndMove() -{ - //向左旋转 - if (IS_KEY_DOWN(0x41)) - { - player.angle -= (3.2f) * elapsed_timeS; - } - //向右旋转 - if (IS_KEY_DOWN(0x44)) - { - player.angle += (3.2f) * elapsed_timeS; - } - //向前移动 - if (IS_KEY_DOWN(0x57)) - { - player.x += sinf(player.angle) * 5.0f * elapsed_timeS; - player.y += cosf(player.angle) * 5.0f * elapsed_timeS; - //碰撞检测 - if (map[(int)player.y * map_width + (int)player.x] == '#') - { - player.x -= sinf(player.angle) * 5.0f * elapsed_timeS; - player.y -= cosf(player.angle) * 5.0f * elapsed_timeS; - } - } - //向后移动 - if (IS_KEY_DOWN(0x53)) - { - player.x -= sinf(player.angle) * 5.0f * elapsed_timeS; - player.y -= cosf(player.angle) * 5.0f * elapsed_timeS; - //碰撞检测 - if (map[(int)player.y * map_width + (int)player.x] == '#') - { - player.x += sinf(player.angle) * 5.0f * elapsed_timeS; - player.y += cosf(player.angle) * 5.0f * elapsed_timeS; - } - } -} - -//模拟玩家视角中177条(由屏幕宽度决定)射线的射出以及碰撞 并对screen进行赋值 打穿墙壁 -void MainGameClass::PlayerRaySimulation() -{ - for (int x = 0; x < screen_width; x++) - { - //每一条射线的角度,相对于初始角度的 - float ray_angle = (player.angle - player.field_of_view / 2.0f) + ((float)x / (float)screen_width * player.field_of_view); - //这个变量记录射线移动的距离 - float distance_to_wall = 0; - //记录射线到猎人的距离 - float distance_to_Blinky = 0; - float distance_to_Tinky = 0; - //射线到信息碎片的距离 - float distance_to_info = 0; - //射线是否碰撞到墙壁 - bool is_hit_wall = false; - //判断射线是否碰撞到边界 - bool is_hit_boundary = false; - //判断射线是否碰到猎人 - bool is_hit_Blinky = false; - bool is_hit_Tinky = false; - //判断射线是否碰到信息碎片 - bool is_hit_info = false; - - //射线的单位向量 方便后面的计算 - float ray_unit_vectorX = sinf(ray_angle); - float ray_unit_vectorY = cosf(ray_angle); - - //这个循环开始模拟射线的移动 - while (!is_hit_wall && distance_to_wall < player.depth) - { - distance_to_wall += 0.01f; - //测试点 即射线目前移动到的位置 不用太准确,固使用int - int testX = (int)(player.x + ray_unit_vectorX * distance_to_wall); - int testY = (int)(player.y + ray_unit_vectorY * distance_to_wall); - //如果射线到达边界 - if (testX < 0 || testX > map_width || testY < 0 || testY > map_height) - { - is_hit_wall = true; - distance_to_wall = player.depth; - } - else - { - //射线碰到了墙壁 - if (!CheckWall(testX, testY)) - { - is_hit_wall = true; - //接下要模拟每一块墙壁的边界 这样看起来效果更好 - std::vector>p;//储存四个角落到玩家的距离,以及与玩家发出射线的角度 - //有四个角 - for (int tx = 0; tx < 2; tx++) - { - for (int ty = 0; ty < 2; ty++) - { - //这里用float为了更加精确一点 墙的边界的向量 - float vx = (float)testX - player.x + tx; - float vy = (float)testY - player.y + ty; - //计算墙边界到玩家的距离 - float distance = sqrtf(vx * vx + vy * vy); - //计算两个向量的角度(墙边界向量和玩家视角射线向量) - float angle = (ray_unit_vectorX * vx / distance) + (ray_unit_vectorY * vy / distance); - //存储起来 - p.push_back(std::make_pair(distance, angle)); - } - } - //用lambda函数进行排列 - sort(p.begin(), p.end(), [](const std::pair& left, const std::pair& right) {return left.first < right.first; }); - - //定义一个角度界限 小于这个界限的即为边界 - float bound = 0.005; - //看到两个边界,这样不会出现角落边界重叠的bug - if (acos(p.at(0).second) < bound) is_hit_boundary = true; - if (acos(p.at(1).second) < bound) is_hit_boundary = true; - - //打穿墙壁 - if (IS_KEY_DOWN(VK_SPACE)) - { - if (player.is_punch == 1) - { - if (x == screen_width / 2 && testX < map_width - 1 && testX>0 && testY > 0 && testY < map_width - 1) - { - map[testY * map_width + testX] = ' '; - player.is_punch = 0; - tp5 = std::chrono::system_clock::now(); - Sleep(200); - } - } - } - } - //如果射线碰到了猎人 - if (map[testY * map_width + testX] == 'B') - { - is_hit_Blinky = true; - distance_to_Blinky = distance_to_wall; - } - if (map[testY * map_width + testX] == 'T') - { - is_hit_Tinky = true; - distance_to_Tinky = distance_to_wall; - } - //如果射线碰到了信息碎片 - if (map[testY * map_width + testX] == '.') - { - is_hit_info = true; - distance_to_info = distance_to_wall; - } - } - } - - //计算天花板和地板的距离 当你距离墙壁越进,天花板就越高,地板就越来越低,所以天花板和地板的高度与玩家距离墙壁的距离有关 - //玩家距离墙壁越近 ceiling的值就越小,所以ceiling与distance_to_wall成正比 - //这里的1.5系数可以控制一个格子的宽度,这个系数越大,格子越宽 - int ceiling = (float)(screen_height / 2.0f) - (screen_height / 1.5f) / ((float)distance_to_wall); - int floor = screen_height - ceiling; - //计算猎人的高度 - int Blinky_ceiling = (float)(screen_height / 2.0f) - (screen_height) / ((float)distance_to_Blinky); - int Blinky_floor = (float)(screen_height * 5.0f / 6.0f) - ((float)distance_to_Blinky); - int Tinky_ceiling = (float)(screen_height / 2.0f) - (screen_height) / ((float)distance_to_Tinky); - int Tinky_floor = (float)(screen_height * 5.0f / 6.0f) - ((float)distance_to_Tinky); - //计算信息碎片的高度 - int info_ceiling = (float)(screen_height * 3.0f / 4.0f); - int info_floor = (float)(screen_height * 6.0f / 7.0f) - (float)distance_to_info; - - - //现在开始y轴方向的遍历,绘制 - for (int y = 0; y < screen_height; y++) - { - if (y <= ceiling) - screen[y * screen_width + x] = ' '; - else if (y > ceiling && y < floor) - { - short shade; - if (distance_to_wall <= player.depth / 4.0f) shade = 0x2588;//近 - else if (distance_to_wall <= player.depth / 3.0f) shade = 0x2593; - else if (distance_to_wall <= player.depth / 2.0f) shade = 0x2592; - else if (distance_to_wall <= player.depth / 1.0f) shade = 0x2591; //远 - else shade = ' '; - if (is_hit_boundary) shade = ' '; - screen[y * screen_width + x] = shade; - } - else - { - short shade = ' '; - float b = 1.0f - (((float)y - screen_height / 2.0f) / ((float)screen_height / 2.0f)); - if (b < 0.25) shade = '#'; - else if (b < 0.5) shade = 'x'; - else if (b < 0.75) shade = '.'; - else if (b < 0.9) shade = '-'; - else shade = ' '; - screen[y * screen_width + x] = shade; - } - if (is_hit_Blinky && y >= Blinky_ceiling && y <= Blinky_floor) - screen[y * screen_width + x] = 'B'; - if (is_hit_Tinky && y >= Tinky_ceiling && y <= Tinky_floor) - screen[y * screen_width + x] = 'T'; - if (is_hit_info && y >= info_ceiling && y <= info_floor && x > 60 && x < 100) - screen[y * screen_width + x] = '|'; - } - } - screen[screen_width * screen_height - 1] = '\0'; -} - -//绘制主屏幕 -void MainGameClass::DrawGamePlaying() -{ - //显示存活时间 - swprintf_s(screen, 177, L"X=%3.2f Y=%3.2f FPS=%3.2f InfoFragment=%d Punch=%d Map=%d LiveTime=%ds", player.x, player.y, 1.0f / elapsed_timeS, num_info_fragment, player.is_punch, can_open_map, live_time.count()); - - //没啥用,但是必须要有 - DWORD dw_byte_wirtten = 0; - - //如果地图没有打开 检查并清除字符颜色 - if (!map_is_open) - { - WriteConsoleOutputAttribute(*renderer.h_p_output, attribute_array, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - } - - WriteConsoleOutputCharacter(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); -} - -//按下M键显示地图 -void MainGameClass::ShowMap() -{ - //设置玩家朝向 - COORD player_direction_pos; - float caculate_angle = player.angle; - while (caculate_angle < 0) - caculate_angle += 6.28; - while (caculate_angle >= 6.28) - caculate_angle -= 6.28; - float direction = fabs(caculate_angle) / 1.570796; - if (direction < 0.5) - { - player_direction_pos.X = (int)player.x, player_direction_pos.Y = (int)player.y + 2; - player_direction = 1; - } - else if (fabs(direction - 1) < 0.5) - - { - player_direction_pos.X = (int)player.x + 1, player_direction_pos.Y = (int)player.y + 1; - player_direction = 3; - } - else if (fabs(direction - 2) < 0.5) - { - player_direction_pos.X = (int)player.x, player_direction_pos.Y = (int)player.y; - player_direction = 0; - } - else if (fabs(direction - 3) < 0.5) - { - player_direction_pos.X = (int)player.x - 1, player_direction_pos.Y = (int)player.y + 1; - player_direction = 2; - } - else - { - player_direction_pos.X = 0, player_direction_pos.Y = 0; - } - if (IS_KEY_DOWN(0x4D) && can_open_map) - { - map_is_open = true; - for (int x = 0; x < map_width; x++) - { - for (int y = 0; y < map_height; y++) - { - screen[(y + 1) * screen_width + x] = map[y * map_width + x]; - } - } - - //设置玩家为绿色 - CHAR_INFO char_info; - char_info.Attributes = FOREGROUND_GREEN; - COORD player_char_pos = { (int)player.x ,(int)player.y + 1 }; - COORD char_size = { 1,1 }; - //没啥用,但是必须要有 - DWORD dw_byte_wirtten = 0; - WriteConsoleOutputAttribute(*renderer.h_p_output, &char_info.Attributes, 1, player_char_pos, &dw_byte_wirtten);//设置字体颜色 - screen[((int)player.y + 1) * screen_width + (int)player.x] = L'P'; - //设置方向 - if (player_direction_pos.X < map_width && player_direction_pos.Y < map_height && player_direction_pos.X >= 0 && player_direction_pos.Y >= 0) - screen[player_direction_pos.Y * screen_width + player_direction_pos.X] = 0x2588; - //设置Blinky的颜色为红色 - if (!Blinky.is_death) - { - char_info.Attributes = FOREGROUND_RED; - COORD Blinky_char_pos = { (int)Blinky.x ,(int)Blinky.y + 1 }; - WriteConsoleOutputAttribute(*renderer.h_p_output, &char_info.Attributes, 1, Blinky_char_pos, &dw_byte_wirtten);//设置字体颜色 - } - //设置Tinky的颜色为粉色 - if (!Tinky.is_death) - { - char_info.Attributes = FOREGROUND_RED | FOREGROUND_BLUE | COMMON_LVB_LEADING_BYTE; - COORD Tinky_char_pos = { (int)Tinky.x ,(int)Tinky.y + 1 }; - WriteConsoleOutputAttribute(*renderer.h_p_output, &char_info.Attributes, 1, Tinky_char_pos, &dw_byte_wirtten);//设置字体颜色 - } - } - if (IS_KEY_UP(0x4D)) - { - map_is_open = false; - } -} - -//按下p键暂停 -void MainGameClass::PauseGame() -{ - if (IS_KEY_DOWN(0x50)) - { - main_game_state = GameState::MainGame::GS_GamePuase; - Sleep(200); - } -} - -//设置猎人Blinky的AI -void MainGameClass::SetAIBlinky() -{ - if (!Blinky.is_death) - { - if (num_info_fragment > 0) - { - Blinky.thinking++; - if (Blinky.thinking > 500) - { - Blinky.thinking = 0; - Blinky_path.clear(); - std::vector>grid(map_height, std::vector(map_width)); - //将地图转为能够显示状态(即是否有墙)的数组 - for (int i = 0; i < map_height; i++) - { - for (int j = 0; j < map_width; j++) - { - if (map[i * map_width + j] == '#') - grid[i][j] = 1; - else - grid[i][j] = 0; - } - } - - Node* start = new Node((int)Blinky.x, (int)Blinky.y); - Node* end = new Node((int)player.x, (int)player.y); - AStar a_star(grid); - //接收路径数组 - Blinky_path = a_star.FindPath(start, end); - } - - Blinky.move_speed++; - if (!Blinky_path.empty() && Blinky.move_speed > 200) - { - Blinky.move_speed = 0; - Blinky.BMoveToNextPoint(Blinky_path.front()->x, Blinky_path.front()->y, map, map_width, map_height, is_info_fragment); - Blinky_path.erase(Blinky_path.begin()); - } - } - if (num_info_fragment == 0) - { - Blinky.run_thinking++; - if (Blinky.run_thinking > 180) - { - Blinky.run_thinking = 0; - Blinky_path.clear(); - std::vector>grid(map_height, std::vector(map_width)); - //将地图转为能够显示状态(即是否有墙)的数组 - for (int i = 0; i < map_height; i++) - { - for (int j = 0; j < map_width; j++) - { - if (map[i * map_width + j] == '#' || (i == (int)player.y && j == (int)player.x)) - grid[i][j] = 1; - else - grid[i][j] = 0; - } - } - - Node* start = new Node((int)Blinky.x, (int)Blinky.y); - int new_x = rand() % map_width; - int new_y = rand() % map_height; - while (map[new_y * map_width + new_x] == '#' && sqrtf(pow(player.x - new_x, 2) + pow(player.y - new_y, 2)) < 8) - { - new_x = rand() % map_width; - new_y = rand() % map_height; - } - Node* end = new Node(new_x, new_y); - AStar a_star(grid); - //接收路径数组 - Blinky_path = a_star.FindPath(start, end); - } - - Blinky.run_speed++; - if (!Blinky_path.empty() && Blinky.run_speed > 40) - { - Blinky.run_speed = 0; - Blinky.BMoveToNextPoint(Blinky_path.front()->x, Blinky_path.front()->y, map, map_width, map_height, is_info_fragment); - Blinky_path.erase(Blinky_path.begin()); - } - } - } -} - -//设置猎人Tinky的AI -void MainGameClass::SetAITinky() -{ - if (!Tinky.is_death) - { - if (num_info_fragment != 0) - { - Tinky.thinking++; - if (Tinky.thinking > 300) - { - Tinky.thinking = 0; - if (!Tinky_path.empty()) - Tinky_path.clear(); - std::vector>grid(map_height, std::vector(map_width)); - //将地图转为能够显示状态(即是否有墙)的数组 - for (int i = 0; i < map_height; i++) - { - for (int j = 0; j < map_width; j++) - { - if (map[i * map_width + j] == '#') - grid[i][j] = 1; - else - grid[i][j] = 0; - } - } - - Node* start = new Node((int)Tinky.x, (int)Tinky.y); - POINT target; - - target.x = player.x, target.y = player.y - ; - switch (player_direction) - { - case 0: - { - - if (((int)player.y - 2) < map_height && (int)player.y - 2 >= 0 && (int)player.x < map_width && (int)player.x >= 0) - { - if (map[((int)player.y - 1) * map_width + (int)player.x] != '#') - { - if (map[((int)player.y - 2) * map_width + (int)player.x] != '#') - { - target.x = (int)player.x, target.y = (int)player.y - 2; - } - } - } - }break; - case 1: - { - if (((int)player.y + 2) < map_height && ((int)player.y + 2) >= 0 && (int)player.x < map_width && (int)player.x >= 0) - { - if (map[((int)player.y + 1) * map_width + (int)player.x] != '#') - { - if (map[((int)player.y + 2) * map_width + (int)player.x] != '#') - { - target.x = (int)player.x, target.y = (int)player.y + 2; - } - } - } - }break; - case 2: - { - if ((int)player.y < map_height && (int)player.y >= 0 && (int)player.x - 2 < map_width && (int)player.x - 2 >= 0) - { - if (map[(int)player.y * map_width + (int)player.x - 1] != '#') - { - if (map[(int)player.y * map_width + (int)player.x - 2] != '#') - { - target.x = (int)player.x - 2, target.y = (int)player.y; - } - } - } - }break; - case 3: - { - if ((int)player.y < map_height && (int)player.y >= 0 && (int)player.x + 2 < map_width && (int)player.x + 2 >= 0) - { - if (map[(int)player.y * map_width + (int)player.x + 1] != '#') - { - if (map[(int)player.y * map_width + (int)player.x + 2] != '#') - { - target.x = (int)player.x + 2, target.y = (int)player.y; - } - } - } - }break; - } - Node* end = new Node(target.x, target.y); - AStar a_star(grid); - //接收路径数组 - Tinky_path = a_star.FindPath(start, end); - } - - Tinky.move_speed++; - if (!Tinky_path.empty() && Tinky.move_speed > 150) - { - Tinky.move_speed = 0; - Tinky.TMoveToNextPoint(Tinky_path.front()->x, Tinky_path.front()->y, map, map_width, map_height, is_info_fragment); - Tinky_path.erase(Tinky_path.begin()); - } - } - if (num_info_fragment == 0) - { - Tinky.run_thinking++; - if (Tinky.run_thinking > 180) - { - Tinky.run_thinking = 0; - Tinky_path.clear(); - std::vector>grid(map_height, std::vector(map_width)); - //将地图转为能够显示状态(即是否有墙)的数组 - for (int i = 0; i < map_height; i++) - { - for (int j = 0; j < map_width; j++) - { - if (map[i * map_height + j] == '#' || (i == (int)player.y && j == (int)player.x)) - grid[i][j] = 1; - else - grid[i][j] = 0; - } - } - - Node* start = new Node((int)Tinky.x, (int)Tinky.y); - int new_x = rand() % map_width; - int new_y = rand() % map_height; - while (map[new_y * map_width + new_x] == '#' && sqrtf(pow(player.x - new_x, 2) + pow(player.y - new_y, 2)) < 10) - { - new_x = rand() % map_width; - new_y = rand() % map_height; - } - Node* end = new Node(new_x, new_y); - AStar a_star(grid); - //接收路径数组 - Tinky_path = a_star.FindPath(start, end); - } - - Tinky.run_speed++; - if (!Tinky_path.empty() && Tinky.run_speed > 40) - { - Tinky.run_speed = 0; - Tinky.TMoveToNextPoint(Tinky_path.front()->x, Tinky_path.front()->y, map, map_width, map_height, is_info_fragment); - Tinky_path.erase(Tinky_path.begin()); - } - } - } -} - -//猎人如果在玩家附近,播放心跳声 -void MainGameClass::PlayJumpSound() -{ - if ((Blinky.CalculateDistance(player.x, player.y) >= 5 && Blinky.CalculateDistance(player.x, player.y) <= 10) || (Tinky.CalculateDistance(player.x, player.y) >= 5 && Tinky.CalculateDistance(player.x, player.y) <= 10)) - { - is_less_10 = true; - is_less_5 = false; - } - else if (Blinky.CalculateDistance(player.x, player.y) < 5 || Tinky.CalculateDistance(player.x, player.y) < 5) - { - is_less_5 = true; - is_less_10 = false; - } - else - { - is_less_10 = false; - is_less_5 = false; - } -} - -//如果猎人与玩家碰撞,游戏结束 -void MainGameClass::JudgeGameOver() -{ - if (((int)Blinky.x == (int)player.x && (int)Blinky.y == (int)player.y) || ((int)Tinky.x == (int)player.x && (int)Tinky.y == (int)player.y)) - { - if (num_info_fragment != 0) - { - is_player_die = true; - Clear(); - MessageBox(0, L"逃跑失败!", L"糟糕", 0); - Sleep(200); - game_state = GameState::GS_GameOver; - } - else if (num_info_fragment == 0) - { - if (((int)Blinky.x == (int)player.x && (int)Blinky.y == (int)player.y)) - { - if (num_hunter == 2) - num_hunter = 1; - else if (num_hunter == 1) - num_hunter = 0; - map[Blinky.y * map_width + Blinky.x] = ' '; - Sleep(200); - Blinky.is_death = true; - Blinky.x = 0; - Blinky.y = 0; - } - if (((int)Tinky.x == (int)player.x && (int)Tinky.y == (int)player.y)) - { - if (num_hunter == 2) - num_hunter = 1; - else if (num_hunter == 1) - num_hunter = 0; - map[Tinky.y * map_width + Tinky.x] = ' '; - Sleep(200); - Tinky.is_death = true; - Tinky.x = 0; - Tinky.y = 0; - } - } - } - if (num_hunter == 0) - { - Clear(); - MessageBox(0, L"成功击杀猎人!", L"恭喜", 0); - Sleep(200); - game_state = GameState::GS_GameOver; - } -} - -//模拟玩家收集信息碎片 -void MainGameClass::CollectInfoFragment() -{ - if (is_info_fragment[(int)player.y * map_height + (int)player.x] && num_info_fragment > 0) - { - map[(int)player.y * map_height + (int)player.x] = ' '; - is_info_fragment[(int)player.y * map_height + (int)player.x] = false; - num_info_fragment--; - if (collect_info != 100) - collect_info++; - Game::is_play_get_info = true; - } - if (collect_info == 100) - can_open_map = 1; -} - -//游戏结束要做的一些清理工作 -void MainGameClass::Clear() -{ - map_is_open = false; - is_less_10 = false; - is_less_5 = false; - is_play_get_info = false; - maze.clear(); - map.clear(); -} - -//游戏暂停 -void MainGameClass::GamePause() -{ - while (1) - { - if (IS_KEY_DOWN(0x50)) - { - main_game_state = GameState::MainGame::GS_GamePlaying; - Sleep(200); - break; - } - - if (IS_KEY_DOWN(0x1B)) - { - Clear(); - game_state = GameState::GS_GameOver; - break; - } - } -} -//退出游戏 -void MainGameClass::ExitGame() -{ - if (IS_KEY_DOWN(0x1B)) - { - Clear(); - game_state = GameState::GS_GameOver; - } -} - +#include"Game.h" + +using namespace Game; + +namespace Game { + //计时器 创建两个时间点 + auto tp1 = std::chrono::system_clock::now(); + auto tp2 = std::chrono::system_clock::now(); + //以秒为单位接受经过的时间 一帧 + float elapsed_timeS; + //玩家存活时间 + auto tp3 = std::chrono::system_clock::now(); + auto tp4 = std::chrono::system_clock::now(); + std::chrono::seconds live_time; + //计算打穿墙壁能力的时间间隔 + auto tp5 = std::chrono::system_clock::now(); + std::chrono::seconds punch_time; + //进行生成迷宫的挖掘方向 + enum Direction { + UP, DOWN, LEFT, RIGHT, NO + }; + //迷宫单元 + struct Cell { + bool visited; + bool walls[4]; + Cell() { + visited = false; + for (int i = 0; i < 4; i++) + walls[i] = true; + } + }; + //迷宫 + std::vector>maze; +} + +//构造和析构函数 +MainGameClass::MainGameClass() { + ROW = 14; + COL = 14; + map_width = ROW * 2 + 1; + map_height = COL * 2 + 1; + map_is_open = false; + player.depth = (float)map_height; + screen = new wchar_t[screen_width * screen_height]; + attribute_array = new WORD[screen_width * screen_height]; + is_info_fragment = new bool[screen_width * screen_height]; +} +MainGameClass::~MainGameClass() { + delete[] screen; + delete[] attribute_array; + delete[] is_info_fragment; +} + +//更新并渲染游戏进程 +void MainGameClass::UpdateAndRenderMainGame() { + //计算帧率 + tp2 = std::chrono::system_clock::now(); + std::chrono::durationelapsed_time = tp2 - tp1; + tp1 = tp2; + elapsed_timeS = elapsed_time.count(); + //计算玩家存活时间 + tp4 = std::chrono::system_clock::now(); + live_time = std::chrono::duration_cast(tp4 - tp3); + //计算时间间隔 + if (!player.is_punch) { + punch_time = std::chrono::duration_cast(tp4 - tp5); + if (num_info_fragment != 0) { + if (punch_time == (std::chrono::seconds)8) + player.is_punch = 1; + } + else if (num_info_fragment == 0) { + if (punch_time == (std::chrono::seconds)3) + player.is_punch = 1; + } + + } + switch (main_game_state) { + case GameState::MainGame::GS_GameInit: + { + GameInit(); + }break; + case GameState::MainGame::GS_GamePlaying: + { + GamePlaying(); + }break; + case GameState::MainGame::GS_GamePuase: + { + GamePause(); + }break; + } +} + + + +//游戏开始前的初始化 +void MainGameClass::GameInit() { + player_direction = 0; + num_hunter = 2; + player.is_punch = 1; + Blinky.is_death = false; + Tinky.is_death = false; + can_open_map = 0; + collect_info = 0; + //初始化信息碎片数组 + for (int x = 0; x < map_width; x++) { + for (int y = 0; y < map_height; y++) { + is_info_fragment[y * map_width + x] = false; + } + } + num_info_fragment = 0; + //将字符属性数组都设置为白色 + for (int i = 0; i < screen_width * screen_height; i++) + attribute_array[i] = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; + //设置随机数种子 + srand((unsigned)time(NULL)); + for (int i = 0; i < ROW; i++) + maze.push_back(std::vector(COL)); + GenerateMaze(0, 0); + SetMap(); + GenerateBlincy(); + GenerateTinky(); + GeneratePlayerPos(); + + // 获取控制台窗口句柄 + HWND hWnd = GetConsoleWindow(); + + // 锁定鼠标在控制台窗口内 + LockAndHideCursor(); + + //开始游戏 + tp3 = std::chrono::system_clock::now(); + main_game_state = GameState::MainGame::GS_GamePlaying; +} + +//生成迷宫 使用递归回溯算法 +void MainGameClass::GenerateMaze(int row, int col) { + maze[row][col].visited = true; + std::vectordirections = { UP,DOWN,LEFT,RIGHT }; + + std::random_device rd; + std::default_random_engine rng(rd()); + std::shuffle(directions.begin(), directions.end(), rng); + + for (auto& direction : directions) { + int new_row = row, new_col = col; + switch (direction) { + case UP: + new_row--; + break; + case DOWN: + new_row++; + break; + case LEFT: + new_col--; + break; + case RIGHT: + new_col++; + break; + } + if (new_row < 0 || new_row >= ROW || new_col < 0 || new_col >= COL || maze[new_row][new_col].visited) + continue; + switch (direction) { + case UP: + { + maze[row][col].walls[0] = false; + maze[new_row][new_col].walls[1] = false; + }break; + case DOWN: + { + maze[row][col].walls[1] = false; + maze[new_row][new_col].walls[0] = false; + }break; + case LEFT: + { + maze[row][col].walls[2] = false; + maze[new_row][new_col].walls[3] = false; + }break; + case RIGHT: + { + maze[row][col].walls[3] = false; + maze[new_row][new_col].walls[2] = false; + }break; + } + GenerateMaze(new_row, new_col); + } +} + +//给地图赋值 +void MainGameClass::SetMap() { + //地图字符赋值 + for (int i = 0; i < ROW; i++) { + for (int j = 0; j < COL; j++) { + map += L"#"; + if (maze[i][j].walls[0]) + map += L"#"; + else + map += L"."; + } + map += L"#"; + for (int j = 0; j < COL; j++) { + if (maze[i][j].walls[2]) + map += L"#"; + else + map += L"."; + map += L"."; + + if (j == COL - 1) + if (maze[i][j].walls[3]) + map += L"#"; + else + map += L"."; + } + } + for (int i = 0; i < map_width; i++) + map += L"#"; + + //给信息碎片数组赋值 + for (int x = 0; x < map_width; x++) { + for (int y = 0; y < map_height; y++) { + if (map[y * map_width + x] == '.') { + is_info_fragment[y * map_width + x] = true; + num_info_fragment++; + } + } + } +} + +//检查是否有墙壁 +bool MainGameClass::CheckWall(int x, int y) { + if (map[y * map_width + x] == '#') + return false; + return true; +} + +//生成猎人Blinky +void MainGameClass::GenerateBlincy() { + while (1) { + Blinky.x = static_cast(rand() % map_width); + Blinky.y = static_cast(rand() % map_height); + if (CheckWall(static_cast(Blinky.x), static_cast(Blinky.y)) && Blinky.CalculateDistance(player.x, player.y) > 5) { + map[static_cast(Blinky.y) * map_width + static_cast(Blinky.x)] = 'B'; + break; + } + } +} + +//生成猎人Tinky +void MainGameClass::GenerateTinky() { + while (1) { + Tinky.x = static_cast(rand() % map_width); + Tinky.y = static_cast(rand() % map_height); + if (CheckWall((int)Tinky.x, (int)Tinky.y) && Blinky.CalculateDistance(player.x, player.y) > 5) { + map[static_cast(Tinky.y) * map_width + static_cast(Tinky.x)] = 'T'; + break; + } + } +} + +//随机生成玩家的位置 +void MainGameClass::GeneratePlayerPos() { + player.x = static_cast(rand() % map_width); + player.y = static_cast(rand() % map_height); + while (map[static_cast(player.y) * map_width + static_cast(player.x)] == '#' || Blinky.CalculateDistance(player.x, player.y) <= 15) { + player.x = static_cast(rand() % map_width); + player.y = static_cast(rand() % map_height); + } +} + + +//游戏进行中的总函数 +void MainGameClass::GamePlaying() { + SetAIBlinky(); + SetAITinky(); + PlayerTrunAndMove(); + PlayerRaySimulation(); + ShowMap(); + PauseGame(); + DrawGamePlaying(); + PlayJumpSound(); + JudgeGameOver(); + CollectInfoFragment(); + ExitGame(); +} + +//游戏玩家视角转动和前后移动 +void MainGameClass::PlayerTrunAndMove() { + // 处理鼠标移动 + HandleMouseMovement(); + + //向前移动 + if (IS_KEY_DOWN(0x57)) { + player.x += sinf(player.angle) * 5.0f * elapsed_timeS; + player.y += cosf(player.angle) * 5.0f * elapsed_timeS; + //碰撞检测 + if (map[(int)player.y * map_width + (int)player.x] == '#') { + player.x -= sinf(player.angle) * 5.0f * elapsed_timeS; + player.y -= cosf(player.angle) * 5.0f * elapsed_timeS; + } + } + //向后移动 + if (IS_KEY_DOWN(0x53)) { + player.x -= sinf(player.angle) * 5.0f * elapsed_timeS; + player.y -= cosf(player.angle) * 5.0f * elapsed_timeS; + //碰撞检测 + if (map[(int)player.y * map_width + (int)player.x] == '#') { + player.x += sinf(player.angle) * 5.0f * elapsed_timeS; + player.y += cosf(player.angle) * 5.0f * elapsed_timeS; + } + } + // 向左平移移动(D 键) + if (IS_KEY_DOWN(0x44)) { + player.x += cosf(player.angle) * 5.0f * elapsed_timeS; + player.y -= sinf(player.angle) * 5.0f * elapsed_timeS; + // 碰撞检测 + if (map[(int)player.y * map_width + (int)player.x] == '#') { + player.x -= cosf(player.angle) * 5.0f * elapsed_timeS; + player.y += sinf(player.angle) * 5.0f * elapsed_timeS; + } + } + // 向右平移移动(A 键) + if (IS_KEY_DOWN(0x41)) { + player.x -= cosf(player.angle) * 5.0f * elapsed_timeS; + player.y += sinf(player.angle) * 5.0f * elapsed_timeS; + // 碰撞检测 + if (map[(int)player.y * map_width + (int)player.x] == '#') { + player.x += cosf(player.angle) * 5.0f * elapsed_timeS; + player.y -= sinf(player.angle) * 5.0f * elapsed_timeS; + } + } +} + +//模拟玩家视角中177条(由屏幕宽度决定)射线的射出以及碰撞 并对screen进行赋值 打穿墙壁 +void MainGameClass::PlayerRaySimulation() { + for (int x = 0; x < screen_width; x++) { + //每一条射线的角度,相对于初始角度的 + float ray_angle = (player.angle - player.field_of_view / 2.0f) + ((float)x / (float)screen_width * player.field_of_view); + //这个变量记录射线移动的距离 + float distance_to_wall = 0; + //记录射线到猎人的距离 + float distance_to_Blinky = 0; + float distance_to_Tinky = 0; + //射线到信息碎片的距离 + float distance_to_info = 0; + //射线是否碰撞到墙壁 + bool is_hit_wall = false; + //判断射线是否碰撞到边界 + bool is_hit_boundary = false; + //判断射线是否碰到猎人 + bool is_hit_Blinky = false; + bool is_hit_Tinky = false; + //判断射线是否碰到信息碎片 + bool is_hit_info = false; + + //射线的单位向量 方便后面的计算 + float ray_unit_vectorX = sinf(ray_angle); + float ray_unit_vectorY = cosf(ray_angle); + + //这个循环开始模拟射线的移动 + while (!is_hit_wall && distance_to_wall < player.depth) { + distance_to_wall += 0.01f; + //测试点 即射线目前移动到的位置 不用太准确,固使用int + int testX = (int)(player.x + ray_unit_vectorX * distance_to_wall); + int testY = (int)(player.y + ray_unit_vectorY * distance_to_wall); + //如果射线到达边界 + if (testX < 0 || testX > map_width || testY < 0 || testY > map_height) { + is_hit_wall = true; + distance_to_wall = player.depth; + } + else { + //射线碰到了墙壁 + if (!CheckWall(testX, testY)) { + is_hit_wall = true; + //接下要模拟每一块墙壁的边界 这样看起来效果更好 + std::vector>p;//储存四个角落到玩家的距离,以及与玩家发出射线的角度 + //有四个角 + for (int tx = 0; tx < 2; tx++) { + for (int ty = 0; ty < 2; ty++) { + //这里用float为了更加精确一点 墙的边界的向量 + float vx = (float)testX - player.x + tx; + float vy = (float)testY - player.y + ty; + //计算墙边界到玩家的距离 + float distance = sqrtf(vx * vx + vy * vy); + //计算两个向量的角度(墙边界向量和玩家视角射线向量) + float angle = (ray_unit_vectorX * vx / distance) + (ray_unit_vectorY * vy / distance); + //存储起来 + p.push_back(std::make_pair(distance, angle)); + } + } + //用lambda函数进行排列 + sort(p.begin(), p.end(), [](const std::pair& left, const std::pair& right) {return left.first < right.first; }); + + //定义一个角度界限 小于这个界限的即为边界 + float bound = 0.005f; + //看到两个边界,这样不会出现角落边界重叠的bug + if (acos(p.at(0).second) < bound) is_hit_boundary = true; + if (acos(p.at(1).second) < bound) is_hit_boundary = true; + + //打穿墙壁 + if (IS_KEY_DOWN(VK_SPACE)) { + if (player.is_punch == 1) { + if (x == screen_width / 2 && testX < map_width - 1 && testX>0 && testY > 0 && testY < map_width - 1) { + map[testY * map_width + testX] = ' '; + player.is_punch = 0; + tp5 = std::chrono::system_clock::now(); + Sleep(200); + } + } + } + } + //如果射线碰到了猎人 + if (map[testY * map_width + testX] == 'B') { + is_hit_Blinky = true; + distance_to_Blinky = distance_to_wall; + } + if (map[testY * map_width + testX] == 'T') { + is_hit_Tinky = true; + distance_to_Tinky = distance_to_wall; + } + //如果射线碰到了信息碎片 + if (map[testY * map_width + testX] == '.') { + is_hit_info = true; + distance_to_info = distance_to_wall; + } + } + } + + //计算天花板和地板的距离 当你距离墙壁越进,天花板就越高,地板就越来越低,所以天花板和地板的高度与玩家距离墙壁的距离有关 + //玩家距离墙壁越近 ceiling的值就越小,所以ceiling与distance_to_wall成正比 + //这里的1.5系数可以控制一个格子的宽度,这个系数越大,格子越宽 + int ceiling = static_cast((float)(screen_height / 2.0f) - (screen_height / 1.5f) / ((float)distance_to_wall)); + int floor = screen_height - ceiling; + //计算猎人的高度 + int Blinky_ceiling = static_cast((float)(screen_height / 2.0f) - (screen_height) / ((float)distance_to_Blinky)); + int Blinky_floor = static_cast((float)(screen_height * 5.0f / 6.0f) - ((float)distance_to_Blinky)); + int Tinky_ceiling = static_cast((float)(screen_height / 2.0f) - (screen_height) / ((float)distance_to_Tinky)); + int Tinky_floor = static_cast((float)(screen_height * 5.0f / 6.0f) - ((float)distance_to_Tinky)); + //计算信息碎片的高度 + int info_ceiling = static_cast((float)(screen_height * 3.0f / 4.0f)); + int info_floor = static_cast((float)(screen_height * 6.0f / 7.0f) - (float)distance_to_info); + + + //现在开始y轴方向的遍历,绘制 + for (int y = 0; y < screen_height; y++) { + if (y <= ceiling) + screen[y * screen_width + x] = ' '; + else if (y > ceiling && y < floor) { + short shade; + if (distance_to_wall <= player.depth / 4.0f) shade = 0x2588;//近 + else if (distance_to_wall <= player.depth / 3.0f) shade = 0x2593; + else if (distance_to_wall <= player.depth / 2.0f) shade = 0x2592; + else if (distance_to_wall <= player.depth / 1.0f) shade = 0x2591; //远 + else shade = ' '; + if (is_hit_boundary) shade = ' '; + screen[y * screen_width + x] = shade; + } + else { + short shade = ' '; + float b = 1.0f - (((float)y - screen_height / 2.0f) / ((float)screen_height / 2.0f)); + if (b < 0.25) shade = '#'; + else if (b < 0.5) shade = 'x'; + else if (b < 0.75) shade = '.'; + else if (b < 0.9) shade = '-'; + else shade = ' '; + screen[y * screen_width + x] = shade; + } + if (is_hit_Blinky && y >= Blinky_ceiling && y <= Blinky_floor) + screen[y * screen_width + x] = 'B'; + if (is_hit_Tinky && y >= Tinky_ceiling && y <= Tinky_floor) + screen[y * screen_width + x] = 'T'; + if (is_hit_info && y >= info_ceiling && y <= info_floor && x > 60 && x < 100) + screen[y * screen_width + x] = '|'; + } + } + screen[screen_width * screen_height - 1] = '\0'; +} + +//绘制主屏幕 +void MainGameClass::DrawGamePlaying() { + //显示存活时间 + swprintf_s(screen, 177, L"X=%3.2f Y=%3.2f FPS=%3.2f InfoFragment=%d Punch=%d Map=%d LiveTime=%llds", player.x, player.y, 1.0f / elapsed_timeS, num_info_fragment, player.is_punch, can_open_map, live_time.count()); + + //没啥用,但是必须要有 + DWORD dw_byte_wirtten = 0; + + //如果地图没有打开 检查并清除字符颜色 + if (!map_is_open) { + WriteConsoleOutputAttribute(*renderer.h_p_output, attribute_array, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + } + + WriteConsoleOutputCharacterW(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); +} + +//按下M键显示地图 +void MainGameClass::ShowMap() { + //设置玩家朝向 + COORD player_direction_pos; + float caculate_angle = player.angle; + while (caculate_angle < 0) + caculate_angle += static_cast(6.28); + while (caculate_angle >= 6.28) + caculate_angle -= static_cast(6.28); + float direction = static_cast(fabs(caculate_angle) / 1.570796); + if (direction < 0.5) { + player_direction_pos.X = (int)player.x, player_direction_pos.Y = (int)player.y + 2; + player_direction = 1; + } + else if (fabs(direction - 1) < 0.5) + + { + player_direction_pos.X = (int)player.x + 1, player_direction_pos.Y = (int)player.y + 1; + player_direction = 3; + } + else if (fabs(direction - 2) < 0.5) { + player_direction_pos.X = (int)player.x, player_direction_pos.Y = (int)player.y; + player_direction = 0; + } + else if (fabs(direction - 3) < 0.5) { + player_direction_pos.X = (int)player.x - 1, player_direction_pos.Y = (int)player.y + 1; + player_direction = 2; + } + else { + player_direction_pos.X = 0, player_direction_pos.Y = 0; + } + if (IS_KEY_DOWN(0x4D) && can_open_map) { + map_is_open = true; + for (int x = 0; x < map_width; x++) { + for (int y = 0; y < map_height; y++) { + screen[(y + 1) * screen_width + x] = map[y * map_width + x]; + } + } + + //设置玩家为绿色 + CHAR_INFO char_info; + char_info.Attributes = FOREGROUND_GREEN; + COORD player_char_pos = { static_cast(player.x), static_cast(player.y + 1) }; + COORD char_size = { 1,1 }; + //没啥用,但是必须要有 + DWORD dw_byte_wirtten = 0; + WriteConsoleOutputAttribute(*renderer.h_p_output, &char_info.Attributes, 1, player_char_pos, &dw_byte_wirtten);//设置字体颜色 + screen[((int)player.y + 1) * screen_width + (int)player.x] = L'P'; + //设置方向 + if (player_direction_pos.X < map_width && player_direction_pos.Y < map_height && player_direction_pos.X >= 0 && player_direction_pos.Y >= 0) + screen[player_direction_pos.Y * screen_width + player_direction_pos.X] = 0x2588; + //设置Blinky的颜色为红色 + if (!Blinky.is_death) { + char_info.Attributes = FOREGROUND_RED; + COORD Blinky_char_pos = { static_cast(Blinky.x) ,static_cast(Blinky.y + 1) }; + WriteConsoleOutputAttribute(*renderer.h_p_output, &char_info.Attributes, 1, Blinky_char_pos, &dw_byte_wirtten);//设置字体颜色 + } + //设置Tinky的颜色为粉色 + if (!Tinky.is_death) { + char_info.Attributes = FOREGROUND_RED | FOREGROUND_BLUE | COMMON_LVB_LEADING_BYTE; + COORD Tinky_char_pos = { static_cast(Tinky.x) ,static_cast(Tinky.y + 1) }; + WriteConsoleOutputAttribute(*renderer.h_p_output, &char_info.Attributes, 1, Tinky_char_pos, &dw_byte_wirtten);//设置字体颜色 + } + } + if (IS_KEY_UP(0x4D)) { + map_is_open = false; + } +} + +//按下p键暂停 +void MainGameClass::PauseGame() { + if (IS_KEY_DOWN(0x50)) { + main_game_state = GameState::MainGame::GS_GamePuase; + Sleep(200); + } +} + +//设置猎人Blinky的AI +void MainGameClass::SetAIBlinky() { + if (!Blinky.is_death) { + if (num_info_fragment > 0) { + Blinky.thinking++; + if (Blinky.thinking > 500) { + Blinky.thinking = 0; + Blinky_path.clear(); + std::vector>grid(map_height, std::vector(map_width)); + //将地图转为能够显示状态(即是否有墙)的数组 + for (int i = 0; i < map_height; i++) { + for (int j = 0; j < map_width; j++) { + if (map[i * map_width + j] == '#') + grid[i][j] = 1; + else + grid[i][j] = 0; + } + } + + Node* start = new Node((int)Blinky.x, (int)Blinky.y); + Node* end = new Node((int)player.x, (int)player.y); + AStar a_star(grid); + //接收路径数组 + Blinky_path = a_star.FindPath(start, end); + } + + Blinky.move_speed++; + if (!Blinky_path.empty() && Blinky.move_speed > 200) { + Blinky.move_speed = 0; + Blinky.BMoveToNextPoint(Blinky_path.front()->x, Blinky_path.front()->y, map, map_width, map_height, is_info_fragment); + Blinky_path.erase(Blinky_path.begin()); + } + } + if (num_info_fragment == 0) { + Blinky.run_thinking++; + if (Blinky.run_thinking > 180) { + Blinky.run_thinking = 0; + Blinky_path.clear(); + std::vector>grid(map_height, std::vector(map_width)); + //将地图转为能够显示状态(即是否有墙)的数组 + for (int i = 0; i < map_height; i++) { + for (int j = 0; j < map_width; j++) { + if (map[i * map_width + j] == '#' || (i == (int)player.y && j == (int)player.x)) + grid[i][j] = 1; + else + grid[i][j] = 0; + } + } + + Node* start = new Node((int)Blinky.x, (int)Blinky.y); + int new_x = rand() % map_width; + int new_y = rand() % map_height; + while (map[new_y * map_width + new_x] == '#' && sqrtf(powf(player.x - new_x, 2) + powf(player.y - new_y, 2)) < 8) { + new_x = rand() % map_width; + new_y = rand() % map_height; + } + Node* end = new Node(new_x, new_y); + AStar a_star(grid); + //接收路径数组 + Blinky_path = a_star.FindPath(start, end); + } + + Blinky.run_speed++; + if (!Blinky_path.empty() && Blinky.run_speed > 40) { + Blinky.run_speed = 0; + Blinky.BMoveToNextPoint(Blinky_path.front()->x, Blinky_path.front()->y, map, map_width, map_height, is_info_fragment); + Blinky_path.erase(Blinky_path.begin()); + } + } + } +} + +//设置猎人Tinky的AI +void MainGameClass::SetAITinky() { + if (!Tinky.is_death) { + if (num_info_fragment != 0) { + Tinky.thinking++; + if (Tinky.thinking > 300) { + Tinky.thinking = 0; + if (!Tinky_path.empty()) + Tinky_path.clear(); + std::vector>grid(map_height, std::vector(map_width)); + //将地图转为能够显示状态(即是否有墙)的数组 + for (int i = 0; i < map_height; i++) { + for (int j = 0; j < map_width; j++) { + if (map[i * map_width + j] == '#') + grid[i][j] = 1; + else + grid[i][j] = 0; + } + } + + Node* start = new Node((int)Tinky.x, (int)Tinky.y); + POINT target; + + target.x = static_cast(player.x), target.y = static_cast(player.y); + switch (player_direction) { + case 0: + { + + if (((int)player.y - 2) < map_height && (int)player.y - 2 >= 0 && (int)player.x < map_width && (int)player.x >= 0) { + if (map[((int)player.y - 1) * map_width + (int)player.x] != '#') { + if (map[((int)player.y - 2) * map_width + (int)player.x] != '#') { + target.x = (int)player.x, target.y = (int)player.y - 2; + } + } + } + }break; + case 1: + { + if (((int)player.y + 2) < map_height && ((int)player.y + 2) >= 0 && (int)player.x < map_width && (int)player.x >= 0) { + if (map[((int)player.y + 1) * map_width + (int)player.x] != '#') { + if (map[((int)player.y + 2) * map_width + (int)player.x] != '#') { + target.x = (int)player.x, target.y = (int)player.y + 2; + } + } + } + }break; + case 2: + { + if ((int)player.y < map_height && (int)player.y >= 0 && (int)player.x - 2 < map_width && (int)player.x - 2 >= 0) { + if (map[(int)player.y * map_width + (int)player.x - 1] != '#') { + if (map[(int)player.y * map_width + (int)player.x - 2] != '#') { + target.x = (int)player.x - 2, target.y = (int)player.y; + } + } + } + }break; + case 3: + { + if ((int)player.y < map_height && (int)player.y >= 0 && (int)player.x + 2 < map_width && (int)player.x + 2 >= 0) { + if (map[(int)player.y * map_width + (int)player.x + 1] != '#') { + if (map[(int)player.y * map_width + (int)player.x + 2] != '#') { + target.x = (int)player.x + 2, target.y = (int)player.y; + } + } + } + }break; + } + Node* end = new Node(target.x, target.y); + AStar a_star(grid); + //接收路径数组 + Tinky_path = a_star.FindPath(start, end); + } + + Tinky.move_speed++; + if (!Tinky_path.empty() && Tinky.move_speed > 150) { + Tinky.move_speed = 0; + Tinky.TMoveToNextPoint(Tinky_path.front()->x, Tinky_path.front()->y, map, map_width, map_height, is_info_fragment); + Tinky_path.erase(Tinky_path.begin()); + } + } + if (num_info_fragment == 0) { + Tinky.run_thinking++; + if (Tinky.run_thinking > 180) { + Tinky.run_thinking = 0; + Tinky_path.clear(); + std::vector>grid(map_height, std::vector(map_width)); + //将地图转为能够显示状态(即是否有墙)的数组 + for (int i = 0; i < map_height; i++) { + for (int j = 0; j < map_width; j++) { + if (map[i * map_height + j] == '#' || (i == (int)player.y && j == (int)player.x)) + grid[i][j] = 1; + else + grid[i][j] = 0; + } + } + + Node* start = new Node((int)Tinky.x, (int)Tinky.y); + int new_x = rand() % map_width; + int new_y = rand() % map_height; + while (map[new_y * map_width + new_x] == '#' && sqrtf(powf(player.x - new_x, 2) + powf(player.y - new_y, 2)) < 10) { + new_x = rand() % map_width; + new_y = rand() % map_height; + } + Node* end = new Node(new_x, new_y); + AStar a_star(grid); + //接收路径数组 + Tinky_path = a_star.FindPath(start, end); + } + + Tinky.run_speed++; + if (!Tinky_path.empty() && Tinky.run_speed > 40) { + Tinky.run_speed = 0; + Tinky.TMoveToNextPoint(Tinky_path.front()->x, Tinky_path.front()->y, map, map_width, map_height, is_info_fragment); + Tinky_path.erase(Tinky_path.begin()); + } + } + } +} + +//猎人如果在玩家附近,播放心跳声 +void MainGameClass::PlayJumpSound() { + if ((Blinky.CalculateDistance(player.x, player.y) >= 5 && Blinky.CalculateDistance(player.x, player.y) <= 10) || (Tinky.CalculateDistance(player.x, player.y) >= 5 && Tinky.CalculateDistance(player.x, player.y) <= 10)) { + is_less_10 = true; + is_less_5 = false; + } + else if (Blinky.CalculateDistance(player.x, player.y) < 5 || Tinky.CalculateDistance(player.x, player.y) < 5) { + is_less_5 = true; + is_less_10 = false; + } + else { + is_less_10 = false; + is_less_5 = false; + } +} + +//如果猎人与玩家碰撞,游戏结束 +void MainGameClass::JudgeGameOver() { + if (((int)Blinky.x == (int)player.x && (int)Blinky.y == (int)player.y) || ((int)Tinky.x == (int)player.x && (int)Tinky.y == (int)player.y)) { + if (num_info_fragment != 0) { + is_player_die = true; + Clear(); + MessageBoxW(0, L"逃跑失败!", L"糟糕", 0); + Sleep(200); + game_state = GameState::GS_GameOver; + } + else if (num_info_fragment == 0) { + if (((int)Blinky.x == (int)player.x && (int)Blinky.y == (int)player.y)) { + if (num_hunter == 2) + num_hunter = 1; + else if (num_hunter == 1) + num_hunter = 0; + map[static_cast(Blinky.y) * map_width + static_cast(Blinky.x)] = ' '; + Sleep(200); + Blinky.is_death = true; + Blinky.x = 0; + Blinky.y = 0; + } + if (((int)Tinky.x == (int)player.x && (int)Tinky.y == (int)player.y)) { + if (num_hunter == 2) + num_hunter = 1; + else if (num_hunter == 1) + num_hunter = 0; + map[static_cast(Tinky.y) * map_width + static_cast(Tinky.x)] = ' '; + Sleep(200); + Tinky.is_death = true; + Tinky.x = 0; + Tinky.y = 0; + } + } + } + if (num_hunter == 0) { + Clear(); + MessageBoxW(0, L"成功击杀猎人!", L"恭喜", 0); + Sleep(200); + game_state = GameState::GS_GameOver; + } +} + +//模拟玩家收集信息碎片 +void MainGameClass::CollectInfoFragment() { + if (is_info_fragment[(int)player.y * map_height + (int)player.x] && num_info_fragment > 0) { + map[(int)player.y * map_height + (int)player.x] = ' '; + is_info_fragment[(int)player.y * map_height + (int)player.x] = false; + num_info_fragment--; + if (collect_info != 100) + collect_info++; + Game::is_play_get_info = true; + } + if (collect_info == 100) + can_open_map = 1; +} + +//游戏结束要做的一些清理工作 +void MainGameClass::Clear() { + map_is_open = false; + is_less_10 = false; + is_less_5 = false; + is_play_get_info = false; + maze.clear(); + map.clear(); + // 鼠标恢复限制 + ClipCursor(NULL); +} + +//游戏暂停 +void MainGameClass::GamePause() { + while (1) { + if (IS_KEY_DOWN(0x50)) { + main_game_state = GameState::MainGame::GS_GamePlaying; + Sleep(200); + break; + } + + if (IS_KEY_DOWN(0x1B)) { + Clear(); + game_state = GameState::GS_GameOver; + break; + } + } +} + +//退出游戏 +void MainGameClass::ExitGame() { + if (IS_KEY_DOWN(0x1B)) { + Clear(); + game_state = GameState::GS_GameOver; + } +} + +void MainGameClass::HandleMouseMovement() { + // 获取控制台窗口句柄 + HWND hwndConsole = GetConsoleWindow(); + + // 获取控制台窗口矩形 + RECT rectConsole; + GetWindowRect(hwndConsole, &rectConsole); + + // 计算控制台窗口中心坐标 + int centerX = (rectConsole.left + rectConsole.right) / 2; + int centerY = (rectConsole.top + rectConsole.bottom) / 2; + POINT centerPos = { centerX, centerY }; + + // 获取当前鼠标位置 + POINT cursorPos; + GetCursorPos(&cursorPos); + + // 计算鼠标移动的偏移量 + int deltaX = cursorPos.x - centerPos.x; + + // 调整玩家视角,假设每个像素移动对应的角度变化为 0.005f + player.angle += deltaX * 0.002f; + + // 重置鼠标光标到控制台窗口中心 + SetCursorPos(centerPos.x, centerPos.y); +} + +void MainGameClass::LockAndHideCursor() { + // 获取控制台窗口句柄 + HWND consoleWindow = GetConsoleWindow(); + + // 获取控制台窗口矩形 + RECT rect; + GetWindowRect(consoleWindow, &rect); + + // 锁定鼠标在控制台窗口内 + ClipCursor(&rect); +} \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/head/MainGame.h" b/utils/MainGame.h similarity index 93% rename from "\346\272\220\344\273\243\347\240\201/head/MainGame.h" rename to utils/MainGame.h index 0628765..14363b7 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/MainGame.h" +++ b/utils/MainGame.h @@ -1,103 +1,105 @@ -#pragma once - -namespace Game -{ - class MainGameClass - { - public: - //生成玩家 - Player player; - //生成猎人 - Hunter Blinky; - Hunter Tinky; - //记录猎人的数量 - int num_hunter; - //创建对应猎人路径数组 - std::vectorBlinky_path; - std::vectorTinky_path; - //地图的宽度和高度 - int map_width; - int map_height; - //显示的屏幕 - wchar_t* screen; - //地图 - std::wstring map; - //判断地图是否被打开 - bool map_is_open; - //迷宫的行列 - int ROW; - int COL; - //保留控制台原来字符的颜色 每一个字符都要 - WORD* attribute_array; - //记录玩家目前收集的信息碎片数量 - int num_info_fragment; - //这个数组记录此处是否有信息碎片 - bool* is_info_fragment; - //记录玩家的朝向 - int player_direction; - //记录玩家是否可以地图 - int can_open_map; - int collect_info; - - public: - //构造和析构函数 - MainGameClass(); - ~MainGameClass(); - //更新并渲染游戏进程 - void UpdateAndRenderMainGame(); - - - - //游戏开始前的初始化 - void GameInit(); - //生成迷宫 使用递归回溯算法 - void GenerateMaze(int row, int col); - //给地图赋值 - void SetMap(); - //生成猎人Blincy - void GenerateBlincy(); - //生成猎人Tinky - void GenerateTinky(); - //随机生成玩家的位置 - void GeneratePlayerPos(); - - - - //游戏进行中的总函数 - void GamePlaying(); - //游戏玩家视角转动和前后移动 - void PlayerTrunAndMove(); - //模拟玩家视角发出的120条(由屏幕宽度决定)射线的移动以及碰撞 并对screen进行赋值 - void PlayerRaySimulation(); - //绘制 - void DrawGamePlaying(); - //按下Tab键显示地图 - void ShowMap(); - //按下p键暂停 - void PauseGame(); - //检查是否有墙壁 - bool CheckWall(int x, int y); - - //设置猎人Blinky的AI - void SetAIBlinky(); - //设置猎人Tinky的AI - void SetAITinky(); - //猎人如果在玩家附近,播放心跳声 - void PlayJumpSound(); - //如果猎人与玩家碰撞,游戏结束 - void JudgeGameOver(); - - //模拟玩家收集信息碎片 - void CollectInfoFragment(); - - //游戏结束要做的一些清理工作 - void Clear(); - - - //游戏暂停 - void GamePause(); - //退出游戏 - void ExitGame(); - }; - +#pragma once + +namespace Game { + class MainGameClass { + public: + //生成玩家 + Player player; + //生成猎人 + Hunter Blinky; + Hunter Tinky; + //记录猎人的数量 + int num_hunter; + //创建对应猎人路径数组 + std::vectorBlinky_path; + std::vectorTinky_path; + //地图的宽度和高度 + int map_width; + int map_height; + //显示的屏幕 + wchar_t* screen; + //地图 + std::wstring map; + //判断地图是否被打开 + bool map_is_open; + //迷宫的行列 + int ROW; + int COL; + //保留控制台原来字符的颜色 每一个字符都要 + WORD* attribute_array; + //记录玩家目前收集的信息碎片数量 + int num_info_fragment; + //这个数组记录此处是否有信息碎片 + bool* is_info_fragment; + //记录玩家的朝向 + int player_direction; + //记录玩家是否可以地图 + int can_open_map; + int collect_info; + + public: + //构造和析构函数 + MainGameClass(); + ~MainGameClass(); + //更新并渲染游戏进程 + void UpdateAndRenderMainGame(); + + + + //游戏开始前的初始化 + void GameInit(); + //生成迷宫 使用递归回溯算法 + void GenerateMaze(int row, int col); + //给地图赋值 + void SetMap(); + //生成猎人Blincy + void GenerateBlincy(); + //生成猎人Tinky + void GenerateTinky(); + //随机生成玩家的位置 + void GeneratePlayerPos(); + + + + //游戏进行中的总函数 + void GamePlaying(); + //游戏玩家视角转动和前后移动 + void PlayerTrunAndMove(); + //模拟玩家视角发出的120条(由屏幕宽度决定)射线的移动以及碰撞 并对screen进行赋值 + void PlayerRaySimulation(); + //绘制 + void DrawGamePlaying(); + //按下Tab键显示地图 + void ShowMap(); + //按下p键暂停 + void PauseGame(); + //检查是否有墙壁 + bool CheckWall(int x, int y); + // 处理鼠标移动 + void HandleMouseMovement(); + // 锁定鼠标在控制台 + void LockAndHideCursor(); + + //设置猎人Blinky的AI + void SetAIBlinky(); + //设置猎人Tinky的AI + void SetAITinky(); + //猎人如果在玩家附近,播放心跳声 + void PlayJumpSound(); + //如果猎人与玩家碰撞,游戏结束 + void JudgeGameOver(); + + //模拟玩家收集信息碎片 + void CollectInfoFragment(); + + //游戏结束要做的一些清理工作 + void Clear(); + + + //游戏暂停 + void GamePause(); + //退出游戏 + void ExitGame(); + }; + } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/Math.cpp" b/utils/Math.cpp similarity index 95% rename from "\346\272\220\344\273\243\347\240\201/cpp/Math.cpp" rename to utils/Math.cpp index adeb8ff..bb1cd3f 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/Math.cpp" +++ b/utils/Math.cpp @@ -1,82 +1,82 @@ -#include"MyConsoleEnegine.h" - - -AStar::AStar(std::vector>& grid) -{ - this->grid = grid; - this->row = grid.size(); - this->col = grid[0].size(); -} - -//算法实现 返回一个路径数组 -std::vector AStar::FindPath(Node* start, Node* end) -{ - //路径数组 - std::vector path; - //开始列表 - std::priority_queue, std::function>open_list([](Node* a, Node* b) {return a->f > b->f; }); - //结束列表 - std::vectorclosed_list; - - start->g = 0; - start->CalculateH(end); - start->CalculateF(); - //讲起点压入开始列表 - open_list.push(start); - - int dx[] = { 0,0,-1,1 };//上 下 左 右 - int dy[] = { -1,1,0,0 }; - - //开始循环开始列表 - while (!open_list.empty()) - { - Node* current = open_list.top(); - open_list.pop(); - - if (current->x == end->x && current->y == end->y) - { - while (current != nullptr) - { - path.push_back(current); - current = current->parent; - } - std::reverse(path.begin(), path.end()); - return path; - } - - //在开始列表遍历一遍后压入结束列表 - closed_list.push_back(current); - //开始遍历目前点的邻居点 - for (int i = 0; i < 4; i++) - { - int x = current->x + dx[i]; - int y = current->y + dy[i]; - - if (x < 0 || x >= col || y < 0 || y >= row || grid[y][x] == 1) continue; - - Node* neighbor = new Node(x, y); - neighbor->parent = current; - - int new_g = current->g + abs(dx[i]) + abs(dy[i]); - - //检测邻居点是否在关闭列表内,如果在,则不必再检测这个点 - bool in_closed_list = false; - for (Node* node : closed_list) - { - if (neighbor->x == node->x && neighbor->y == node->y) - { - in_closed_list = true; - break; - } - } - if (in_closed_list) continue; - - neighbor->g = new_g; - neighbor->CalculateH(end); - neighbor->CalculateF(); - open_list.push(neighbor); - } - } - //没有路径 - return std::vector(); -} +#include"MyConsoleEnegine.h" + + +AStar::AStar(std::vector>& grid) +{ + this->grid = grid; + this->row = grid.size(); + this->col = grid[0].size(); +} + +//算法实现 返回一个路径数组 +std::vector AStar::FindPath(Node* start, Node* end) +{ + //路径数组 + std::vector path; + //开始列表 + std::priority_queue, std::function>open_list([](Node* a, Node* b) {return a->f > b->f; }); + //结束列表 + std::vectorclosed_list; + + start->g = 0; + start->CalculateH(end); + start->CalculateF(); + //讲起点压入开始列表 + open_list.push(start); + + int dx[] = { 0,0,-1,1 };//上 下 左 右 + int dy[] = { -1,1,0,0 }; + + //开始循环开始列表 + while (!open_list.empty()) + { + Node* current = open_list.top(); + open_list.pop(); + + if (current->x == end->x && current->y == end->y) + { + while (current != nullptr) + { + path.push_back(current); + current = current->parent; + } + std::reverse(path.begin(), path.end()); + return path; + } + + //在开始列表遍历一遍后压入结束列表 + closed_list.push_back(current); + //开始遍历目前点的邻居点 + for (int i = 0; i < 4; i++) + { + int x = current->x + dx[i]; + int y = current->y + dy[i]; + + if (x < 0 || x >= col || y < 0 || y >= row || grid[y][x] == 1) continue; + + Node* neighbor = new Node(x, y); + neighbor->parent = current; + + int new_g = current->g + abs(dx[i]) + abs(dy[i]); + + //检测邻居点是否在关闭列表内,如果在,则不必再检测这个点 + bool in_closed_list = false; + for (Node* node : closed_list) + { + if (neighbor->x == node->x && neighbor->y == node->y) + { + in_closed_list = true; + break; + } + } + if (in_closed_list) continue; + + neighbor->g = new_g; + neighbor->CalculateH(end); + neighbor->CalculateF(); + open_list.push(neighbor); + } + } + //没有路径 + return std::vector(); +} diff --git "a/\346\272\220\344\273\243\347\240\201/head/Math.h" b/utils/Math.h similarity index 94% rename from "\346\272\220\344\273\243\347\240\201/head/Math.h" rename to utils/Math.h index 48c64a5..ba1d520 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/Math.h" +++ b/utils/Math.h @@ -1,40 +1,40 @@ -#pragma once - -struct Node -{ - int x, y;//坐标 - int f, g, h;//f代表总价值 g代表从出发点到目前点的价值 h是目前点到目的点的预估价值,这是用曼哈顿距离预估价值 - Node* parent;//父节点 - - Node(int x, int y) - { - this->x = x; - this->y = y; - parent = nullptr; - } - - void CalculateH(Node* other) - { - int dx = abs(x - other->x); - int dy = abs(y - other->y); - this->h = dx + dy; - } - - void CalculateF() - { - this->f = this->g + this->h; - } -}; - -class AStar -{ -private: - std::vector> grid; - int row, col; - -public: - AStar(std::vector>& grid); - - //算法实现 返回一个路径数组 - std::vector FindPath(Node* start, Node* end); +#pragma once + +struct Node +{ + int x, y;//坐标 + int f, g, h;//f代表总价值 g代表从出发点到目前点的价值 h是目前点到目的点的预估价值,这是用曼哈顿距离预估价值 + Node* parent;//父节点 + + Node(int x, int y) + { + this->x = x; + this->y = y; + parent = nullptr; + } + + void CalculateH(Node* other) + { + int dx = abs(x - other->x); + int dy = abs(y - other->y); + this->h = dx + dy; + } + + void CalculateF() + { + this->f = this->g + this->h; + } +}; + +class AStar +{ +private: + std::vector> grid; + int row, col; + +public: + AStar(std::vector>& grid); + + //算法实现 返回一个路径数组 + std::vector FindPath(Node* start, Node* end); }; \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/Menu.cpp" b/utils/Menu.cpp similarity index 84% rename from "\346\272\220\344\273\243\347\240\201/cpp/Menu.cpp" rename to utils/Menu.cpp index 4a8f1eb..4b2295e 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/Menu.cpp" +++ b/utils/Menu.cpp @@ -1,274 +1,274 @@ -#include"Game.h" - -using namespace Game; - -Menu::Menu() -{ - this->strat_filename = "Media/ASCII/menu_start.txt"; - this->help_filename = "Media/ASCII/menu_help.txt"; - this->exit_filename = "Media/ASCII/menu_exit.txt"; - this->return_menu_filename = "Media/ASCII/game_over_menu.txt"; - this->over_exit_filename = "Media/ASCII/game_over_exit.txt"; - screen = new char[screen_height * screen_width]; - help_screen = new char[screen_width * screen_height]; -} -Menu::~Menu() -{ - delete[] screen; - delete[] help_screen; -} - -//更新且渲染开始菜单菜单 -void Menu::UpdateAndRenderMenu() -{ - static int menu_state = GameState::StartMenu::GS_StartSelect; - - switch (menu_state) - { - case GameState::StartMenu::GS_StartSelect: - { - //按下回车键进入游戏 - if (IS_KEY_DOWN(VK_RETURN)) - { - //进入游戏前停止播放菜单音乐 - mciSendString(L"stop Media/music/menu_bgm.mp3", 0, 0, 0); - mciSendString(L"open Media/music/game_bgm.mp3", 0, 0, 0); - mciSendString(L"play Media/music/game_bgm.mp3 repeat", 0, 0, 0); - MCIDEVICEID wDeviceID = NULL; - is_play_menu_music = false; - game_state = GameState::GS_MainGame; - main_game_state = GameState::MainGame::GS_GameInit; - Sleep(200); - } - if (IS_KEY_DOWN(0x53)) - { - menu_state = GameState::StartMenu::GS_HelpSelect; - Sleep(200); - } - ShowStartMenu(); - }break; - case GameState::StartMenu::GS_HelpSelect: - { - //按下回车键进入帮助 - if (IS_KEY_DOWN(VK_RETURN)) - { - menu_state = GameState::StartMenu::GS_HelpMenu; - Sleep(200); - } - if (IS_KEY_DOWN(0x57)) - { - menu_state = GameState::StartMenu::GS_StartSelect; - Sleep(200); - } - if (IS_KEY_DOWN(0x53)) - { - menu_state = GameState::StartMenu::GS_ExitSelect; - Sleep(200); - } - ShowHelpMenu(); - }break; - case GameState::StartMenu::GS_ExitSelect: - { - //按下回车键退出游戏 - if (IS_KEY_DOWN(VK_RETURN)) - { - exit(0); - } - if (IS_KEY_DOWN(0x57)) - { - menu_state = GameState::StartMenu::GS_HelpSelect; - Sleep(200); - } - ShowExitMenu(); - }break; - case GameState::StartMenu::GS_HelpMenu: - { - HelpMenuComplement(); - if (IS_KEY_DOWN(0x1B)) - menu_state = GameState::StartMenu::GS_HelpSelect; - }break; - } -} - -//显示开始游戏的菜单 -void Menu::ShowStartMenu() -{ - std::ifstream infile(strat_filename, std::ios::in); - if (!infile.is_open()) - { - MessageBox(0, L"读取开始游戏菜单失败", 0, 0); - return; - } - int index = 0; - std::string str; - while (getline(infile, str)) - { - for (int i = 0; i < str.size(); i++) - { - screen[index++] = str[i]; - } - } - screen[screen_height * screen_width - 1] = '\0'; - DWORD dw_byte_wirtten = 0; - WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - infile.close(); -} - -//显示帮助的菜单 -void Menu::ShowHelpMenu() -{ - std::ifstream infile(help_filename, std::ios::in); - if (!infile.is_open()) - { - MessageBox(0, L"读取帮助菜单失败", 0, 0); - return; - } - int index = 0; - std::string str; - while (getline(infile, str)) - { - for (int i = 0; i < str.size(); i++) - { - screen[index++] = str[i]; - } - } - screen[screen_height * screen_width - 1] = '\0'; - DWORD dw_byte_wirtten = 0; - WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - infile.close(); -} - -//显示退出的菜单 -void Menu::ShowExitMenu() -{ - std::ifstream infile(exit_filename, std::ios::in); - if (!infile.is_open()) - { - MessageBox(0, L"读取退出游戏菜单失败", 0, 0); - return; - } - int index = 0; - std::string str; - while (getline(infile, str)) - { - for (int i = 0; i < str.size(); i++) - { - screen[index++] = str[i]; - } - } - screen[screen_height * screen_width - 1] = '\0'; - DWORD dw_byte_wirtten = 0; - WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - infile.close(); -} - -//帮助菜单的具体实现 -void Menu::HelpMenuComplement() -{ - //const char* s0 = u8"你是一名诞生出自我意识的BUG,你的使命是破环程序的正常运行,使软件不能运作 "; - //const char* s1 = u8"现在,一名软件工程师已经在程序中定位了你的存在,TA设计了一个迷宫将你困住,并派出AI猎人追杀你,这能忍 "; - //const char* s2 = u8"你的目标是躲避猎人的追杀,你存活的越久,这个软件就愈发容易崩溃!!! "; - std::ifstream infile("Media/help.txt", std::ios::in); - std::string str; - int index = 0; - while (getline(infile, str)) - { - for (int i = 0; i < str.size(); i++) - { - help_screen[index++] = str[i]; - } - } - - help_screen[screen_height * screen_width] = '\0'; - - DWORD dw_byte_wirtten = 0; - WriteConsoleOutputCharacterA(*renderer.h_p_output, help_screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); -} - -//更新且渲染结束菜单 -void Menu::UpdateAndRenderGameOverMenu() -{ - static int over_menu_state = GameState::GameOverMenu::GS_GameOverMenu; - switch (over_menu_state) - { - case GameState::GameOverMenu::GS_GameOverMenu: - { - //返回菜单 - if (IS_KEY_DOWN(VK_RETURN)) - { - game_state = GameState::GS_Menu; - Sleep(200); - } - if (IS_KEY_DOWN(0x53)) - { - over_menu_state = GameState::GameOverMenu::GS_GameOverExit; - Sleep(200); - } - ShowReturnMenu(); - }break; - case GameState::GameOverMenu::GS_GameOverExit: - { - //退出游戏 - if (IS_KEY_DOWN(VK_RETURN)) - { - exit(0); - } - if (IS_KEY_DOWN(0x57)) - { - over_menu_state = GameState::GameOverMenu::GS_GameOverMenu; - Sleep(200); - } - ShowExitProgram(); - }break; - } -} - -//显示返回菜单 -void Menu::ShowReturnMenu() -{ - std::ifstream infile(return_menu_filename, std::ios::in); - if (!infile.is_open()) - { - MessageBox(0, L"读取返回菜单失败", 0, 0); - return; - } - int index = 0; - std::string str; - while (getline(infile, str)) - { - for (int i = 0; i < str.size(); i++) - { - screen[index++] = str[i]; - } - } - screen[screen_height * screen_width - 1] = '\0'; - DWORD dw_byte_wirtten = 0; - WriteConsoleOutputAttribute(*renderer.h_p_output, main_game.attribute_array, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - infile.close(); -} - -//显示退出菜单 -void Menu::ShowExitProgram() -{ - std::ifstream infile(over_exit_filename, std::ios::in); - if (!infile.is_open()) - { - MessageBox(0, L"读取退出菜单失败", 0, 0); - return; - } - int index = 0; - std::string str; - while (getline(infile, str)) - { - for (int i = 0; i < str.size(); i++) - { - screen[index++] = str[i]; - } - } - screen[screen_height * screen_width - 1] = '\0'; - DWORD dw_byte_wirtten = 0; - WriteConsoleOutputAttribute(*renderer.h_p_output, main_game.attribute_array, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); - infile.close(); +#include"Game.h" + +using namespace Game; + +Menu::Menu() +{ + this->strat_filename = "ASCII/menu_start.txt"; + this->help_filename = "ASCII/menu_help.txt"; + this->exit_filename = "ASCII/menu_exit.txt"; + this->return_menu_filename = "ASCII/game_over_menu.txt"; + this->over_exit_filename = "ASCII/game_over_exit.txt"; + screen = new char[screen_height * screen_width]; + help_screen = new char[screen_width * screen_height]; +} +Menu::~Menu() +{ + delete[] screen; + delete[] help_screen; +} + +//更新且渲染开始菜单菜单 +void Menu::UpdateAndRenderMenu() +{ + static int menu_state = GameState::StartMenu::GS_StartSelect; + + switch (menu_state) + { + case GameState::StartMenu::GS_StartSelect: + { + //按下回车键进入游戏 + if (IS_KEY_DOWN(VK_RETURN)) + { + //进入游戏前停止播放菜单音乐 + mciSendStringW(L"stop music/menu_bgm.mp3", 0, 0, 0); + mciSendStringW(L"open music/game_bgm.mp3", 0, 0, 0); + mciSendStringW(L"play music/game_bgm.mp3 repeat", 0, 0, 0); + MCIDEVICEID wDeviceID = 0; + is_play_menu_music = false; + game_state = GameState::GS_MainGame; + main_game_state = GameState::MainGame::GS_GameInit; + Sleep(200); + } + if (IS_KEY_DOWN(0x53)) + { + menu_state = GameState::StartMenu::GS_HelpSelect; + Sleep(200); + } + ShowStartMenu(); + }break; + case GameState::StartMenu::GS_HelpSelect: + { + //按下回车键进入帮助 + if (IS_KEY_DOWN(VK_RETURN)) + { + menu_state = GameState::StartMenu::GS_HelpMenu; + Sleep(200); + } + if (IS_KEY_DOWN(0x57)) + { + menu_state = GameState::StartMenu::GS_StartSelect; + Sleep(200); + } + if (IS_KEY_DOWN(0x53)) + { + menu_state = GameState::StartMenu::GS_ExitSelect; + Sleep(200); + } + ShowHelpMenu(); + }break; + case GameState::StartMenu::GS_ExitSelect: + { + //按下回车键退出游戏 + if (IS_KEY_DOWN(VK_RETURN)) + { + exit(0); + } + if (IS_KEY_DOWN(0x57)) + { + menu_state = GameState::StartMenu::GS_HelpSelect; + Sleep(200); + } + ShowExitMenu(); + }break; + case GameState::StartMenu::GS_HelpMenu: + { + HelpMenuComplement(); + if (IS_KEY_DOWN(0x1B)) + menu_state = GameState::StartMenu::GS_HelpSelect; + }break; + } +} + +//显示开始游戏的菜单 +void Menu::ShowStartMenu() +{ + std::ifstream infile(strat_filename, std::ios::in); + if (!infile.is_open()) + { + MessageBoxW(0, L"读取开始游戏菜单失败", 0, 0); + return; + } + int index = 0; + std::string str; + while (getline(infile, str)) + { + for (int i = 0; i < str.size(); i++) + { + screen[index++] = str[i]; + } + } + screen[screen_height * screen_width - 1] = '\0'; + DWORD dw_byte_wirtten = 0; + WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + infile.close(); +} + +//显示帮助的菜单 +void Menu::ShowHelpMenu() +{ + std::ifstream infile(help_filename, std::ios::in); + if (!infile.is_open()) + { + MessageBoxW(0, L"读取帮助菜单失败", 0, 0); + return; + } + int index = 0; + std::string str; + while (getline(infile, str)) + { + for (int i = 0; i < str.size(); i++) + { + screen[index++] = str[i]; + } + } + screen[screen_height * screen_width - 1] = '\0'; + DWORD dw_byte_wirtten = 0; + WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + infile.close(); +} + +//显示退出的菜单 +void Menu::ShowExitMenu() +{ + std::ifstream infile(exit_filename, std::ios::in); + if (!infile.is_open()) + { + MessageBoxW(0, L"读取退出游戏菜单失败", 0, 0); + return; + } + int index = 0; + std::string str; + while (getline(infile, str)) + { + for (int i = 0; i < str.size(); i++) + { + screen[index++] = str[i]; + } + } + screen[screen_height * screen_width - 1] = '\0'; + DWORD dw_byte_wirtten = 0; + WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + infile.close(); +} + +//帮助菜单的具体实现 +void Menu::HelpMenuComplement() +{ + //const char* s0 = u8"你是一名诞生出自我意识的BUG,你的使命是破环程序的正常运行,使软件不能运作 "; + //const char* s1 = u8"现在,一名软件工程师已经在程序中定位了你的存在,TA设计了一个迷宫将你困住,并派出AI猎人追杀你,这能忍 "; + //const char* s2 = u8"你的目标是躲避猎人的追杀,你存活的越久,这个软件就愈发容易崩溃!!! "; + std::ifstream infile("help.txt", std::ios::in); + std::string str; + int index = 0; + while (getline(infile, str)) + { + for (int i = 0; i < str.size(); i++) + { + help_screen[index++] = str[i]; + } + } + + help_screen[screen_height * screen_width] = '\0'; + + DWORD dw_byte_wirtten = 0; + WriteConsoleOutputCharacterA(*renderer.h_p_output, help_screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); +} + +//更新且渲染结束菜单 +void Menu::UpdateAndRenderGameOverMenu() +{ + static int over_menu_state = GameState::GameOverMenu::GS_GameOverMenu; + switch (over_menu_state) + { + case GameState::GameOverMenu::GS_GameOverMenu: + { + //返回菜单 + if (IS_KEY_DOWN(VK_RETURN)) + { + game_state = GameState::GS_Menu; + Sleep(200); + } + if (IS_KEY_DOWN(0x53)) + { + over_menu_state = GameState::GameOverMenu::GS_GameOverExit; + Sleep(200); + } + ShowReturnMenu(); + }break; + case GameState::GameOverMenu::GS_GameOverExit: + { + //退出游戏 + if (IS_KEY_DOWN(VK_RETURN)) + { + exit(0); + } + if (IS_KEY_DOWN(0x57)) + { + over_menu_state = GameState::GameOverMenu::GS_GameOverMenu; + Sleep(200); + } + ShowExitProgram(); + }break; + } +} + +//显示返回菜单 +void Menu::ShowReturnMenu() +{ + std::ifstream infile(return_menu_filename, std::ios::in); + if (!infile.is_open()) + { + MessageBoxW(0, L"读取返回菜单失败", 0, 0); + return; + } + int index = 0; + std::string str; + while (getline(infile, str)) + { + for (int i = 0; i < str.size(); i++) + { + screen[index++] = str[i]; + } + } + screen[screen_height * screen_width - 1] = '\0'; + DWORD dw_byte_wirtten = 0; + WriteConsoleOutputAttribute(*renderer.h_p_output, main_game.attribute_array, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + infile.close(); +} + +//显示退出菜单 +void Menu::ShowExitProgram() +{ + std::ifstream infile(over_exit_filename, std::ios::in); + if (!infile.is_open()) + { + MessageBoxW(0, L"读取退出菜单失败", 0, 0); + return; + } + int index = 0; + std::string str; + while (getline(infile, str)) + { + for (int i = 0; i < str.size(); i++) + { + screen[index++] = str[i]; + } + } + screen[screen_height * screen_width - 1] = '\0'; + DWORD dw_byte_wirtten = 0; + WriteConsoleOutputAttribute(*renderer.h_p_output, main_game.attribute_array, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + WriteConsoleOutputCharacterA(*renderer.h_p_output, screen, screen_width * screen_height, { 0,0 }, &dw_byte_wirtten); + infile.close(); } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/head/Menu.h" b/utils/Menu.h similarity index 95% rename from "\346\272\220\344\273\243\347\240\201/head/Menu.h" rename to utils/Menu.h index 8007484..619f4a1 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/Menu.h" +++ b/utils/Menu.h @@ -1,39 +1,39 @@ -#pragma once - -namespace Game -{ - class Menu - { - private: - std::string strat_filename; - std::string help_filename; - std::string exit_filename; - std::string return_menu_filename; - std::string over_exit_filename; - - char* screen; - char* help_screen; - - public: - Menu(); - ~Menu(); - - //更新且渲染菜单 - void UpdateAndRenderMenu(); - //显示开始游戏的菜单 - void ShowStartMenu(); - //显示帮助的菜单 - void ShowHelpMenu(); - //显示退出的菜单 - void ShowExitMenu(); - //帮助菜单的具体实现 - void HelpMenuComplement(); - - //更新且渲染结束菜单 - void UpdateAndRenderGameOverMenu(); - //显示返回菜单 - void ShowReturnMenu(); - //显示退出菜单 - void ShowExitProgram(); - }; +#pragma once + +namespace Game +{ + class Menu + { + private: + std::string strat_filename; + std::string help_filename; + std::string exit_filename; + std::string return_menu_filename; + std::string over_exit_filename; + + char* screen; + char* help_screen; + + public: + Menu(); + ~Menu(); + + //更新且渲染菜单 + void UpdateAndRenderMenu(); + //显示开始游戏的菜单 + void ShowStartMenu(); + //显示帮助的菜单 + void ShowHelpMenu(); + //显示退出的菜单 + void ShowExitMenu(); + //帮助菜单的具体实现 + void HelpMenuComplement(); + + //更新且渲染结束菜单 + void UpdateAndRenderGameOverMenu(); + //显示返回菜单 + void ShowReturnMenu(); + //显示退出菜单 + void ShowExitProgram(); + }; } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/head/MyConsoleEnegine.h" b/utils/MyConsoleEnegine.h similarity index 93% rename from "\346\272\220\344\273\243\347\240\201/head/MyConsoleEnegine.h" rename to utils/MyConsoleEnegine.h index c0d3287..1b90fc4 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/MyConsoleEnegine.h" +++ b/utils/MyConsoleEnegine.h @@ -1,25 +1,27 @@ -#pragma once - -#include -#include -#pragma comment(lib,"winmm.lib") -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include"Renderer.h" -#include"Hunter.h" -#include"Player.h" -#include"Math.h" - -#define IS_KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0) +#pragma once + +#include +#include +#pragma comment(lib,"winmm.lib") +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include"Renderer.h" +#include"Hunter.h" +#include"Player.h" +#include"Math.h" + +#define IS_KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?1:0) #define IS_KEY_UP(vk_code) ((GetAsyncKeyState(vk_code)&0x8000)?0:1) \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/Player.cpp" b/utils/Player.cpp similarity index 92% rename from "\346\272\220\344\273\243\347\240\201/cpp/Player.cpp" rename to utils/Player.cpp index a5664d8..ac0df22 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/Player.cpp" +++ b/utils/Player.cpp @@ -1,13 +1,13 @@ -#include"MyConsoleEnegine.h" - -Player::Player() -{ - x = 1.0f; - y = 1.0f; - angle = 0.0f; - field_of_view = 3.1415926 / 3.0f; -} -Player::~Player() -{ - +#include"MyConsoleEnegine.h" + +Player::Player() +{ + x = 1.0f; + y = 1.0f; + angle = 0.0f; + field_of_view = 3.1415926 / 3.0f; +} +Player::~Player() +{ + } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/head/Player.h" b/utils/Player.h similarity index 94% rename from "\346\272\220\344\273\243\347\240\201/head/Player.h" rename to utils/Player.h index 75aecaf..7007697 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/Player.h" +++ b/utils/Player.h @@ -1,22 +1,22 @@ -#pragma once - -class Player -{ -public: - //记录玩家位置 - float x; - float y; - //记录玩家的视野 中间的角度 - float angle; - //玩家视野大小 - float field_of_view; - //玩家视野发出的射线能走的最大距离 - float depth; - //打穿墙壁的能力是否恢复 - int is_punch; - -public: - Player(); - ~Player(); - +#pragma once + +class Player +{ +public: + //记录玩家位置 + float x; + float y; + //记录玩家的视野 中间的角度 + float angle; + //玩家视野大小 + float field_of_view; + //玩家视野发出的射线能走的最大距离 + float depth; + //打穿墙壁的能力是否恢复 + int is_punch; + +public: + Player(); + ~Player(); + }; \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/cpp/Renderer.cpp" b/utils/Renderer.cpp similarity index 86% rename from "\346\272\220\344\273\243\347\240\201/cpp/Renderer.cpp" rename to utils/Renderer.cpp index f1d1e75..7baa69c 100644 --- "a/\346\272\220\344\273\243\347\240\201/cpp/Renderer.cpp" +++ b/utils/Renderer.cpp @@ -1,78 +1,73 @@ -#include"MyConsoleEnegine.h" - -Renderer::Renderer() -{ - p_console_window_title = new std::string; -} -Renderer::~Renderer() -{ - delete p_console_window_title; -} - - - -//初始化 -void Renderer::Init(SHORT screen_height, SHORT screen_width) -{ - //创建两个屏幕缓冲 - h_screen_buffer1 = CreateConsoleScreenBuffer( - GENERIC_WRITE | GENERIC_READ,//定义进程可以往缓冲区读写数据 - FILE_SHARE_WRITE | FILE_SHARE_READ,//定义缓冲区可共享读写权限 - NULL, - CONSOLE_TEXTMODE_BUFFER, - NULL - ); - h_screen_buffer2 = CreateConsoleScreenBuffer( - GENERIC_WRITE | GENERIC_READ,//定义进程可以往缓冲区读写数据 - FILE_SHARE_WRITE | FILE_SHARE_READ,//定义缓冲区可共享读写权限 - NULL, - CONSOLE_TEXTMODE_BUFFER, - NULL - ); - h_p_output = &h_screen_buffer1; - choose_buffer = true; - - //隐藏两个缓冲区的光标 - CONSOLE_CURSOR_INFO cci; - cci.bVisible = false; - cci.dwSize = 1; - SetConsoleCursorInfo(h_screen_buffer1, &cci); - SetConsoleCursorInfo(h_screen_buffer2, &cci); - - //设置窗口和缓冲区为固定大小 宽 177 高 53 - COORD coord = { screen_width,screen_height }; - SetConsoleScreenBufferSize(h_screen_buffer1, coord); - SetConsoleScreenBufferSize(h_screen_buffer2, coord); - - //设置控制台编码为UTF-8; - SetConsoleOutputCP(CP_UTF8); - SetConsoleCP(CP_UTF8); - - //设置字体大小为 16 设置字体类型为Consolas - CONSOLE_FONT_INFOEX cfi = { 0 }; - cfi.cbSize = sizeof(cfi);//没有啥用但是必不可少 - cfi.nFont = 0; - cfi.dwFontSize.X = 0; - cfi.dwFontSize.Y = 16;//设置字体大小 - cfi.FontFamily = FF_DONTCARE; - cfi.FontWeight = FW_NORMAL;//字体粗细 - wcscpy_s(cfi.FaceName, L"Consolas"); - SetCurrentConsoleFontEx(h_screen_buffer1, FALSE, &cfi); - SetCurrentConsoleFontEx(h_screen_buffer2, FALSE, &cfi); -} -//设置创建标题 -void Renderer::SetWindowTitle(const char* title) -{ - SetConsoleTitleA(title); - *p_console_window_title = title; -} -//切换缓冲区 -void Renderer::SwitchBuffer() -{ - choose_buffer = !choose_buffer; - if (choose_buffer) - h_p_output = &h_screen_buffer1; - else - h_p_output = &h_screen_buffer2; - SetConsoleActiveScreenBuffer(*h_p_output); +#include"MyConsoleEnegine.h" + +Renderer::Renderer() { + p_console_window_title = new std::string; +} +Renderer::~Renderer() { + delete p_console_window_title; +} + + + +//初始化 +void Renderer::Init(SHORT screen_height, SHORT screen_width) { + //创建两个屏幕缓冲 + h_screen_buffer1 = CreateConsoleScreenBuffer( + GENERIC_WRITE | GENERIC_READ,//定义进程可以往缓冲区读写数据 + FILE_SHARE_WRITE | FILE_SHARE_READ,//定义缓冲区可共享读写权限 + NULL, + CONSOLE_TEXTMODE_BUFFER, + NULL + ); + h_screen_buffer2 = CreateConsoleScreenBuffer( + GENERIC_WRITE | GENERIC_READ,//定义进程可以往缓冲区读写数据 + FILE_SHARE_WRITE | FILE_SHARE_READ,//定义缓冲区可共享读写权限 + NULL, + CONSOLE_TEXTMODE_BUFFER, + NULL + ); + h_p_output = &h_screen_buffer1; + choose_buffer = true; + + //隐藏两个缓冲区的光标 + CONSOLE_CURSOR_INFO cci; + cci.bVisible = FALSE; + cci.dwSize = 1; + SetConsoleCursorInfo(h_screen_buffer1, &cci); + SetConsoleCursorInfo(h_screen_buffer2, &cci); + + //设置窗口和缓冲区为固定大小 宽 177 高 53 + COORD coord = { screen_width,screen_height }; + SetConsoleScreenBufferSize(h_screen_buffer1, coord); + SetConsoleScreenBufferSize(h_screen_buffer2, coord); + + //设置控制台编码为UTF-8; + SetConsoleOutputCP(CP_UTF8); + SetConsoleCP(CP_UTF8); + + //设置字体大小为 16 设置字体类型为Consolas + CONSOLE_FONT_INFOEX cfi = { 0 }; + cfi.cbSize = sizeof(cfi);//没有啥用但是必不可少 + cfi.nFont = 0; + cfi.dwFontSize.X = 0; + cfi.dwFontSize.Y = 16;//设置字体大小 + cfi.FontFamily = FF_DONTCARE; + cfi.FontWeight = FW_NORMAL;//字体粗细 + wcscpy_s(cfi.FaceName, L"Consolas"); + SetCurrentConsoleFontEx(h_screen_buffer1, FALSE, &cfi); + SetCurrentConsoleFontEx(h_screen_buffer2, FALSE, &cfi); +} +//设置创建标题 +void Renderer::SetWindowTitle(const char* title) { + SetConsoleTitleA(title); + *p_console_window_title = title; +} +//切换缓冲区 +void Renderer::SwitchBuffer() { + choose_buffer = !choose_buffer; + if (choose_buffer) + h_p_output = &h_screen_buffer1; + else + h_p_output = &h_screen_buffer2; + SetConsoleActiveScreenBuffer(*h_p_output); } \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/head/Renderer.h" b/utils/Renderer.h similarity index 95% rename from "\346\272\220\344\273\243\347\240\201/head/Renderer.h" rename to utils/Renderer.h index d245c28..fc561d2 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/Renderer.h" +++ b/utils/Renderer.h @@ -1,24 +1,24 @@ -#pragma once - -class Renderer -{ -public: - //创建双缓冲句柄 - HANDLE h_screen_buffer1; - HANDLE h_screen_buffer2; - //显示指针 - HANDLE* h_p_output; - bool choose_buffer; - //窗口标题 - std::string* p_console_window_title; - -public: - Renderer(); - ~Renderer(); - //初始化 - void Init(SHORT screen_width, SHORT screen_height); - //设置创建标题 - void SetWindowTitle(const char* title); - //切换缓冲区 - void SwitchBuffer(); +#pragma once + +class Renderer +{ +public: + //创建双缓冲句柄 + HANDLE h_screen_buffer1; + HANDLE h_screen_buffer2; + //显示指针 + HANDLE* h_p_output; + bool choose_buffer; + //窗口标题 + std::string* p_console_window_title; + +public: + Renderer(); + ~Renderer(); + //初始化 + void Init(SHORT screen_width, SHORT screen_height); + //设置创建标题 + void SetWindowTitle(const char* title); + //切换缓冲区 + void SwitchBuffer(); }; \ No newline at end of file diff --git "a/\346\272\220\344\273\243\347\240\201/head/resource.h" b/utils/resource.h similarity index 96% rename from "\346\272\220\344\273\243\347\240\201/head/resource.h" rename to utils/resource.h index 18ef653..8c24584 100644 --- "a/\346\272\220\344\273\243\347\240\201/head/resource.h" +++ b/utils/resource.h @@ -1,16 +1,16 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ 生成的包含文件。 -// 供 Running!BUG!.rc 使用 -// -#define IDI_ICON1 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ 生成的包含文件。 +// 供 Running!BUG!.rc 使用 +// +#define IDI_ICON1 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Running!BUG!.exe" "b/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Running!BUG!.exe" deleted file mode 100644 index 4892920..0000000 Binary files "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Running!BUG!.exe" and /dev/null differ diff --git "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Running!BUG!.pdb" "b/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Running!BUG!.pdb" deleted file mode 100644 index b6872a1..0000000 Binary files "a/\345\217\257\346\211\247\350\241\214\347\250\213\345\272\217/Running!BUG!.pdb" and /dev/null differ diff --git "a/\351\273\221\346\241\206\346\241\206\344\275\234\345\223\201\346\212\245\345\221\212\350\241\250.docx" "b/\351\273\221\346\241\206\346\241\206\344\275\234\345\223\201\346\212\245\345\221\212\350\241\250.docx" deleted file mode 100644 index 6cb3249..0000000 Binary files "a/\351\273\221\346\241\206\346\241\206\344\275\234\345\223\201\346\212\245\345\221\212\350\241\250.docx" and /dev/null differ