游戏开发日志支线8
2026-06-24 18:39:23
发布于:香港
接上回
游戏:Typing Game
更新版本:0.7
代码:李伙子ia
美术:也没美术啊
翻译:Artificial Intelligence
团队:新手团
新增内容:
· 退格键可以跨行退格
· 关卡选择页面优化
· 新增金币系统,每过一关都有金币,数量按关卡表现给予
· 新增商店系统,目前正收集玩家意見新增商品
· 移除關於自定義關卡(廢棄)的殘留信息
· 修復部分Bug和優化部分代碼
源碼:
//TypingGame0.7
//How to found? Goto https://www.acgo.cn/person/4913066
#define GAME_NAME "TypingGame"
#define VERSION "0.7"
#define CODER "李伙子ia"
#define ARTIST "無"
#define ENGLISH_TRANSLATOR "人工智能"
#define SPECIAL_CREDITS "無"
#define AUTHOR_HOMEPAGE "https://www.acgo.cn/person/4913066"
#define TIMING_UNIT 's'
#define LANGUAGE 'c'
#ifdef _WIN32
#include<conio.h>
#else
#include<termios.h>
#include<unistd.h>
#include<cstdio>
int getch(void){
termios old_tc;
tcgetattr(STDIN_FILENO,&old_tc);
termios new_tc=old_tc;
new_tc.c_lflag&=~(ICANON|ECHO);
new_tc.c_cc[VMIN]=1;
new_tc.c_cc[VTIME]=0;
tcsetattr(STDIN_FILENO,TCSANOW,&new_tc);
int chr=getchar();
tcsetattr(STDIN_FILENO,TCSANOW,&old_tc);
return chr;
}
#endif
#include<algorithm>
#include<chrono>
#include<cinttypes>
#include<cstdint>
#include<cstdio>
#include<cstdlib>
#include<fstream>
#include<iostream>
#include<stack>
#include<string>
#include<vector>
std::vector<std::string> built_vector(std::size_t,std::size_t) noexcept;
constexpr std::uint64_t ceil(double) noexcept;
std::uint64_t choose_level(bool) noexcept;
void clear(void) noexcept;
std::pair<char*,char*> coordinates
(const std::pair<std::size_t,std::size_t>&) noexcept;
std::pair<char*,char*> _coordinates_
(const std::pair<std::size_t,std::size_t>&) noexcept;
void exit_msg(void) noexcept;
void exit_msg(const std::string&,const std::string&) noexcept;
char getkey(void) noexcept;
template<typename Tp,std::size_t N>
constexpr std::size_t length(Tp (&)[N]) noexcept{return N;}
std::string unit_string(void) noexcept;
std::uint64_t wordsof(const std::vector<std::string>&) noexcept;
char timing_unit,language;
std::uint64_t type_word_cnt;
bool sync=std::ios::sync_with_stdio(false);
std::vector<std::string> levels[]={
{"Typing Game"},
{"abcdefg hijklmn opqrstu vwxyz"},
{"A big cat dances elegantly fine grass"},
{"Here is just kind lovely moment"},
{"Old pure quiet rain sings true unity"},
{"Vast wild xeriscape yields zest"},
{"!_! @_@ #v# $U$ %v% ^v^ &v& *v* (-_-)"},
{"`v` -std=c++20 [[maybe_unused]] {-_-} ;) :( '_' \"v\" [>_] >v< \\v/ ?v? ||-_-"},
{"Hello!zheshihaoyunzhidediyigeguanqia~<welcome>"},
{"HuangShaBaiZhanChanJingJia,BuPoLouLanZhongBuHuan"},
{"Next station: Shanghai Railway Station"},
};
constexpr std::size_t L=1,R=length(levels)-1;
std::vector<std::string> level_map({built_vector(L,R)});
std::vector<std::string> _levels_[]={
{"Typing Game"},
{
"cpp\r",
"#include<iostream>\r",
"using namespace std;\r",
"int main(){\r",
"\tcout<<\"Hello World!\"<<endl;\r",
"\treturn 0;\r",
"}\r"
},
{
"py\r",
"#welcome message\r",
"def welcome_message():\r",
"\tprint(\"************************\")\r",
"\tprint(\"* *\")\r",
"\tprint(\"* Welcome to Typing! *\")\r",
"\tprint(\"* *\")\r",
"\tprint(\"************************\")\r",
"if __name__==\"__main__\":\r",
"\twelcome_message()\r"
},
{
"java\r",
"public class HelloWorld{\r",
"\tpublic static void main(String[] args){\r",
"\t\tSystem.out.println(\"Hello World!\");\r",
"\t}\r",
"}\r"
},
{
"pi=3.\r",
"1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132\r",
"8230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847\r",
"5648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962822\r",
"5409917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185\r",
"4807446237996274956735188575272489122793818301194912983367336244065664308602139494639522473719070217986094370277\r",
"0539217176293176752346748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465\r",
"4958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973\r",
"1732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147\r",
"3035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572\r",
"0106548586327886593615338182796823030195203530185296899577362259941389124972177528347913151557485724245415069595\r",
}
};
constexpr std::size_t _L_=1,_R_=length(_levels_)-1;
std::vector<std::string> _level_map_({built_vector(_L_,_R_)});
std::uint64_t typing_level(std::size_t level_index,bool mod) noexcept{
if((mod==0&&(level_index>R))||(mod==1&&(level_index>_R_))) return -1ULL;
std::uint64_t wrong_cnt=0ULL;
std::vector<std::string> level(mod?_levels_[level_index]:levels[level_index]);
const std::vector<std::string>::size_type level_length=level.size();
std::stack<std::string::size_type> backspace_stack;
for(std::vector<std::string>::size_type index=0;index<level_length;index++){
std::string level_str=level[index];
std::string::size_type strlen=level_str.size();
do{
std::string::size_type backspace=0;
for(std::string::size_type start=0;start<strlen;start++,backspace++){
int chr=level_str[start];
if(chr=='\r') std::cout<<" [Enter]",backspace+=7;
if(chr=='\t') std::cout<<"Tab]",backspace+=3;
else std::cout.put(chr);
}
std::cout<<std::string(backspace,'\b')<<std::flush;
backspace_stack.push(backspace);
}while(false);
for(std::string::size_type jndex=0;jndex<strlen;){
int chr=level_str[jndex],key=getkey();
if(key==27) return -27ULL;
if((key!=13&&key!=9&&key!=8)&&((key>=0&&key<=31)||key==127)) continue;
if(key=='\b'){
if(!jndex){
if(!index) continue;
level_str=level[--index];
jndex=level_str.size()-1;
strlen=level_str.size();
int last_chr=level_str.back();
std::string::size_type backspace=backspace_stack.top();
std::string::size_type last_backspace=(backspace_stack.pop(),backspace_stack.top());
std::cout<<std::string(backspace,' ')<<std::string(backspace,'\b');
std::cout<<std::flush<<"\033[A\033["+std::to_string(last_backspace)+"C"<<std::flush;
if(last_chr=='\r') std::cout<<std::string(8,'\b')<<" [Enter]"<<std::string(8,'\b');
else if(last_chr=='\t') std::cout<<std::string(4,'\b')<<"Tab]"<<std::string(4,'\b');
else std::cout.put('\b').put(last_chr).put('\b');
}
else{
int last_chr=level_str[--jndex];
if(last_chr=='\r') std::cout<<std::string(8,'\b')<<" [Enter]"<<std::string(8,'\b');
else if(last_chr=='\t') std::cout<<std::string(4,'\b')<<"Tab]"<<std::string(4,'\b');
else std::cout.put('\b').put(last_chr).put('\b');
}
continue;
}
else if(key==chr||(key=='\n'&&chr=='\r')){
if(key=='\r'||key=='\n') std::cout<<"\033[42;37m [Enter]\033[0m";
else if(key=='\t') std::cout<<"\033[42;37mTab]\033[0m";
else std::cout<<"\033[42;37m"<<static_cast<char>(chr)<<"\033[0m";
}
else{
if(chr=='\r') std::cout<<"\033[41;37m [Enter]\033[0m";
else if(chr=='\t') std::cout<<"\033[41;37mTab]\033[0m";
else std::cout<<"\033[41;37m"<<static_cast<char>(chr)<<"\033[0m";
wrong_cnt++;
}
jndex++,type_word_cnt++;
}
std::cout.put('\n');
}
return wrong_cnt;
}
int main(void){
std::fstream fstream("Data.txt",std::ios::in);
std::string name;
std::uint64_t money;
std::uint64_t pass_level_cnt;
if(fstream.is_open()){
std::getline(fstream,name);
fstream>>money>>type_word_cnt>>pass_level_cnt;
fstream>>timing_unit>>language;
}
else{
name.assign("0");
money^=money;
type_word_cnt^=type_word_cnt;
pass_level_cnt^=pass_level_cnt;
timing_unit=TIMING_UNIT;
language=LANGUAGE;
}
#ifdef _WIN32
std::system(((std::string)"title "+GAME_NAME+VERSION).c_str());
#else
std::cout<<(std::string)"\033]0;"+GAME_NAME+VERSION+"\007";
#endif
while(true){
if(language=='c'){
std::cout<<"ID: 001"<<'\n';
std::cout<<"姓名:"<<name<<'\n';
std::cout<<"金幣:$"<<money<<'\n';
std::cout<<"主菜單"<<'\n';
std::cout<<"按 [空格] 開始遊戲"<<'\n';
std::cout<<"按 'x' 進入地獄模式"<<'\n';
std::cout<<"按 's' 更改遊戲設定"<<'\n';
std::cout<<"按 'p' 進入商店"<<'\n';
std::cout<<"按 [Esc] 退出遊戲"<<'\n';
}else{
std::cout<<"ID: 001"<<'\n';
std::cout<<"Name: "<<name<<'\n';
std::cout<<"Money: $"<<money<<'\n';
std::cout<<"Main Menu"<<'\n';
std::cout<<"Press [space] start the game"<<'\n';
std::cout<<"Press 'x' go to hell mode"<<'\n';
std::cout<<"Press 's' change game settings"<<'\n';
std::cout<<"Press 'p' goto shop";
std::cout<<"Press [Esc] exit the game"<<'\n';
}
char main_menu_key=getkey();
clear();
switch(main_menu_key){
case ' ':{
std::uint64_t level=choose_level(0);
clear();
if(level==-27ULL) break;
if(language=='c') std::cout<<"關卡 "<<level<<'\n';
else std::cout<<"level "<<level<<'\n';
auto start=std::chrono::high_resolution_clock::now();
std::uint64_t wrong=typing_level(level,0);
auto end=std::chrono::high_resolution_clock::now();
if(wrong==-27ULL){
clear();
break;
}
if(wrong==-1ULL){
if(language=='c') std::cout<<"未找到該關卡!"<<'\n';
else std::cout<<"Level cannot be found!"<<'\n';
}
else{
if(language=='c') std::cout<<'\n'<<"恭喜通過本關卡!"<<'\n';
else std::cout<<'\n'<<"Congratulation on pass the level!"<<'\n';
std::uint64_t use_time;
if(timing_unit=='s')
use_time=std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
else if(timing_unit=='m')
use_time=std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
else if(timing_unit=='u')
use_time=std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
else if(timing_unit=='n')
use_time=std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count();
else
use_time=std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
if(language=='c') std::cout<<"用時:"<<use_time<<unit_string()<<",錯誤字元數:"<<wrong<<'\n';
else std::cout<<"Used time: "<<use_time<<unit_string()<<", Wrong chars: "<<wrong<<'\n';
std::uint64_t reward_money;
double reward_bonus=1.0;
std::uint64_t speed=ceil(use_time/60.0);
if(timing_unit=='m') speed=ceil(speed/1000.0);
else if(timing_unit=='u') speed=ceil(speed/1000000.0);
else if(timing_unit=='n') speed=ceil(speed/1000000000.0);
std::uint64_t correct=wordsof(levels[level])-wrong;
std::uint64_t WPM=ceil(static_cast<double>(correct)/speed);
if(WPM>=130ULL) reward_bonus*=2.5;
else if(WPM>=125ULL) reward_bonus*=2.4;
else if(WPM>=120ULL) reward_bonus*=2.3;
else if(WPM>=115ULL) reward_bonus*=2.2;
else if(WPM>=110ULL) reward_bonus*=2.1;
else if(WPM>=105ULL) reward_bonus*=2.0;
else if(WPM>=95ULL) reward_bonus*=1.8;
else if(WPM>=70ULL) reward_bonus*=1.5;
else if(WPM>=45ULL) reward_bonus*=1.2;
else if(WPM>=35ULL) reward_bonus*=1.0;
else if(WPM>=20ULL) reward_bonus*=0.8;
else reward_bonus*=0.5;
reward_money=ceil((static_cast<double>(WPM)/10)*reward_bonus);
if(language=='c') std::cout<<"金幣獎勵:$"<<reward_money<<'\n';
else std::cout<<"Money Reward: $"<<reward_money<<'\n';
money+=reward_money;
pass_level_cnt++;
}
exit_msg();
break;
}
case 'X': case 'x':{
std::uint64_t level=choose_level(1);
clear();
if(level==-27ULL) break;
if(language=='c') std::cout<<"關卡 "<<level<<'\n';
else std::cout<<"level "<<level<<'\n';
auto start=std::chrono::high_resolution_clock::now();
std::uint64_t wrong=typing_level(level,1);
auto end=std::chrono::high_resolution_clock::now();
if(wrong==-27ULL){
clear();
break;
}
if(wrong==-1ULL){
if(language=='c') std::cout<<"未找到該關卡!"<<'\n';
else std::cout<<"Level cannot be found!"<<'\n';
}
else{
if(language=='c') std::cout<<"\n恭喜通過本關卡!"<<'\n';
else std::cout<<'\n'<<"Congratulation on pass the level!"<<'\n';
std::uint64_t use_time;
if(timing_unit=='s')
use_time=std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
else if(timing_unit=='m')
use_time=std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
else if(timing_unit=='u')
use_time=std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
else if(timing_unit=='n')
use_time=std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count();
else
use_time=std::chrono::duration_cast<std::chrono::seconds>(end-start).count();
if(language=='c') std::cout<<"用時:"<<use_time<<unit_string()<<",錯誤字元數:"<<wrong<<'\n';
else std::cout<<"Used time: "<<use_time<<unit_string()<<", Wrong chars: "<<wrong<<'\n';
std::uint64_t reward_money;
double reward_bonus=1.3;
std::uint64_t speed=ceil(use_time/60.0);
if(timing_unit=='m') speed=ceil(speed/1000.0);
else if(timing_unit=='u') speed=ceil(speed/1000000.0);
else if(timing_unit=='n') speed=ceil(speed/1000000000.0);
std::uint64_t correct=wordsof(_levels_[level])-wrong;
std::uint64_t WPM=ceil(static_cast<double>(correct)/speed);
if(WPM>=130ULL) reward_bonus*=2.5;
else if(WPM>=125ULL) reward_bonus*=2.4;
else if(WPM>=120ULL) reward_bonus*=2.3;
else if(WPM>=115ULL) reward_bonus*=2.2;
else if(WPM>=110ULL) reward_bonus*=2.1;
else if(WPM>=105ULL) reward_bonus*=2.0;
else if(WPM>=95ULL) reward_bonus*=1.8;
else if(WPM>=70ULL) reward_bonus*=1.5;
else if(WPM>=45ULL) reward_bonus*=1.2;
else if(WPM>=35ULL) reward_bonus*=1.0;
else if(WPM>=20ULL) reward_bonus*=0.8;
else reward_bonus*=0.5;
reward_money=ceil((static_cast<double>(WPM)/9.9)*reward_bonus);
if(language=='c') std::cout<<"金幣獎勵:$"<<reward_money<<'\n';
else std::cout<<"Money Reward: $"<<reward_money<<'\n';
money+=reward_money;
pass_level_cnt++;
}
exit_msg();
break;
}
case 'S':case 's':{
if(language=='c'){
std::cout<<"遊戲設定"<<'\n';
std::cout<<"版本:"<<VERSION<<'\n';
std::cout<<"鳴謝"<<'\n';
std::cout<<"開發者:"<<CODER<<'\n';
std::cout<<"美術:"<<ARTIST<<'\n';
std::cout<<"翻譯:"<<ENGLISH_TRANSLATOR<<'\n';
std::cout<<"特別鳴謝:"<<SPECIAL_CREDITS<<'\n';
std::cout<<"作者主頁:"<<AUTHOR_HOMEPAGE<<'\n';
std::cout.put('\n');
std::cout<<"修改設定"<<'\n';
std::cout<<"按 't' 更改計時單位"<<'\n';
std::cout<<"按 'l' 更改語言"<<'\n';
std::cout<<"按 'h' 開啟作者主頁"<<'\n';
std::cout<<"按 'n' 昵稱改名"<<'\n';
std::cout<<"按 [Esc] 退出設定"<<'\n';
std::cout.put('\n');
std::cout<<"統計資訊"<<'\n';
std::cout<<"已輸入字元數:"<<type_word_cnt<<'\n';
std::cout<<"已通關數:"<<pass_level_cnt<<'\n';
}
else{
std::cout<<"Game Settings"<<'\n';
std::cout<<"Version: "<<VERSION<<'\n';
std::cout<<"Credits"<<'\n';
std::cout<<"Coder: "<<CODER<<'\n';
std::cout<<"Artist: "<<ARTIST<<'\n';
std::cout<<"English translator: "<<ENGLISH_TRANSLATOR<<'\n';
std::cout<<"Special credits"<<SPECIAL_CREDITS<<'\n';
std::cout<<"Author homepage: "<<AUTHOR_HOMEPAGE<<'\n';
std::cout.put('\n');
std::cout<<"Change setting"<<'\n';
std::cout<<"Press 't' change the timing unit"<<'\n';
std::cout<<"Press 'l' change the language"<<'\n';
std::cout<<"Press 'h' go to author homepage"<<'\n';
std::cout<<"Press 'n' go by a new nickname"<<'\n';
std::cout<<"Press [Esc] exit the game setting"<<'\n';
std::cout.put('\n');
std::cout<<"Statistics"<<'\n';
std::cout<<"Typed Chars: "<<type_word_cnt<<'\n';
std::cout<<"Passed Levels: "<<pass_level_cnt<<'\n';
}
char game_setting_key=getkey();
clear();
switch(game_setting_key){
case 'T': case 't':{
if(language=='c'){
std::cout<<"當前計時單位:"<<timing_unit<<'\n';
std::cout<<"支援的單位"<<'\n';
std::cout<<"- s: 秒"<<'\n';
std::cout<<"- m: 毫秒 (1/1000秒)"<<'\n';
std::cout<<"- u: 微秒 (1/1000000秒)"<<'\n';
std::cout<<"- n: 奈秒 (1/1000000000秒)"<<'\n';
std::cout<<"更改為 (s, m, u, n) . . . ";
}
else{
std::cout<<"Using timing unit: "<<timing_unit<<'\n';
std::cout<<"Support units"<<'\n';
std::cout<<"- s: second"<<'\n';
std::cout<<"- m: millisecond (1/1,000s)"<<'\n';
std::cout<<"- u: microsecond (1/1,000,000s)"<<'\n';
std::cout<<"- n: nanosecond (1/1,000,000,000s)"<<'\n';
std::cout<<"Change to (s, m, u, n) . . . ";
}
do{
timing_unit=getkey();
}while(!(timing_unit=='s'||timing_unit=='m'||timing_unit=='u'||timing_unit=='n'));
exit_msg("設定已儲存!","Setting saved!");
break;
}
case 'L': case 'l':{
if(language=='c'){
std::cout<<"語言設定"<<'\n';
std::cout<<"- c: 中文"<<'\n';
std::cout<<"- e: 英文"<<'\n';
std::cout<<"更改為 (c, e) . . . ";
}else{
std::cout<<"Language setting"<<'\n';
std::cout<<"- c: Chinese"<<'\n';
std::cout<<"- e: English"<<'\n';
std::cout<<"Change to (c, e) . . . ";
}
do{
language=getkey();
}while(language=='c'||language=='e');
exit_msg("設定已儲存!","Setting saved!");
break;
}
case 'H': case 'h':{
#ifdef _WIN32
std::system(((std::string)"start "+AUTHOR_HOMEPAGE).c_str());
#else
std::system(((std::string)"xdg-open "+AUTHOR_HOMEPAGE).c_str());
#endif
exit_msg();
break;
}
case 'N': case 'n':{
if(language=='c'){
std::cout<<"請輸入您的新昵稱"<<'\n';
std::cout<<"昵稱> ";
}
else{
std::cout<<"Please enter your new nickname"<<'\n';
std::cout<<"Nickname> ";
}
std::getline(std::cin,name);
exit_msg();
break;
}
case 27:
break;
}
break;
}
case 'P': case 'p':{
if(language=='c'){
std::cout<<"TypingGame 商店"<<'\n';
std::cout<<"金幣數量:$"<<money<<'\n';
std::cout.put('\n');
std::cout<<"~暫時沒有商品,請見諒~"<<'\n';
}
else{
std::cout<<"TypingGame Shop"<<'\n';
std::cout<<"Number of money: $"<<money<<'\n';
std::cout.put('\n');
std::cout<<"~No items temporarily, Sorry for any trouble~"<<'\n';
}
exit_msg();
break;
}
case 27:
if(language=='c') std::cout<<"再見!"<<'\n';
else std::cout<<"Goodbye!"<<'\n';
goto post_processing;
}
}
post_processing:{
fstream.close();
fstream.open("Data.txt",std::ios::out);
if(fstream.is_open()){
fstream<<name<<'\n'<<money<<'\n';
fstream<<type_word_cnt<<'\n'<<pass_level_cnt<<'\n';
fstream<<timing_unit<<'\n'<<language<<'\n';
}
return 0;
}
}
std::vector<std::string> built_vector(std::size_t from,std::size_t to) noexcept{
std::vector<std::string> result;
std::string temp;
for(std::size_t cnt=from;cnt<=to;cnt++){
temp.push_back(' ');
std::string to_string(4,'\0');
std::snprintf(&to_string[0],to_string.size(),"%03" PRIu64,cnt);
to_string.pop_back();
temp.append(to_string);
if(!(cnt%10)){
temp.push_back(' ');
result.push_back(temp);
temp.clear();
}
}
if(!temp.empty()){
std::size_t diff=10-(to%10);
for(std::size_t cnt=0;cnt<diff;cnt++){
temp.push_back(' ');
temp.append(3,'x');
}
temp.push_back(' ');
result.push_back(temp);
}
return result;
}
constexpr std::uint64_t ceil(double flt) noexcept{
return flt+(static_cast<std::uint64_t>(flt)!=flt);
}
std::uint64_t choose_level(bool mod) noexcept{
std::uint64_t result=0ULL;
std::pair<std::size_t,std::size_t> point=
std::pair<std::size_t,std::size_t>();
std::vector<std::string>& rmap(mod?_level_map_:level_map);
std::pair<char*,char*> (*coor)(const std::pair
<std::size_t,std::size_t>&)=(mod?_coordinates_:coordinates);
rmap.front()[0]='['; rmap.front()[4]=']';
while(true){
if(language=='c')
std::cout<<"請選擇關卡(按WASD移動選擇框,按[空格]確定,按[Esc]退出)"<<'\n';
else{
std::cout<<"Please choose a level"<<'\n';
std::cout<<"(Use WASD to move the selection box, Press [Space] to confirm, Press [Esc] exit)"<<'\n';
}
std::cout.put('\n');
for(std::vector<std::string>::size_type idx=0;idx<rmap.size();idx++)
std::cout<<rmap[idx]<<'\n';
switch(getkey()){
case (char)27:
return -27ULL;
case ' ':
*coor(point).first=' ';
*coor(point).second=' ';
goto jump;
case 'W': case 'w':
if(!point.first) break;
*coor(point).first=' ';
*coor(point).second=' ';
point.first--;
*coor(point).first='[';
*coor(point).second=']';
break;
case 'A': case 'a':
if(!point.second) break;
*coor(point).first=' ';
*coor(point).second=' ';
point.second--;
*coor(point).first='[';
*coor(point).second=']';
break;
case 'S': case 's':
if(!(point.first<rmap.size()-1)) break;
*coor(point).first=' ';
*coor(point).second=' ';
point.first++;
*coor(point).first='[';
*coor(point).second=']';
break;
case 'D': case 'd':
if(!(point.second<9)) break;
*coor(point).first=' ';
*coor(point).second=' ';
point.second++;
*coor(point).first='[';
*coor(point).second=']';
break;
default:
break;
}
clear();
}
jump:{
try{result=std::stoull(std::string(coor(point).first+1,coor(point).second));}
catch(...){result=0ULL;}
}
return result;
}
void clear(void) noexcept{
#ifdef _WIN32
std::system("cls");
#else
std::system("clear");
#endif
}
std::pair<char*,char*> coordinates
(const std::pair<std::size_t,std::size_t>& index) noexcept{
char* ptr=&level_map[index.first][(index.second<<2)];
return std::pair<char*,char*>(ptr,ptr+4);
}
std::pair<char*,char*> _coordinates_
(const std::pair<std::size_t,std::size_t>& index) noexcept{
char* _ptr_=&_level_map_[index.first][(index.second<<2)];
return std::pair<char*,char*>(_ptr_,_ptr_+4);
}
void exit_msg(void) noexcept{
std::cout.put('\n');
if(language=='c') std::cout<<"按任意鍵繼續 . . . ";
else std::cout<<"Press any key to continue . . . ";
getkey();
clear();
}
void exit_msg(const std::string& chi,const std::string& eng) noexcept{
std::cout.put('\n');
if(language=='c'){
std::cout<<chi<<'\n';
std::cout<<"按任意鍵繼續 . . . ";
}else{
std::cout<<eng<<'\n';
std::cout<<"Press any key to continue . . . ";
}
getkey();
clear();
}
char getkey(void) noexcept{
std::cout.flush();
return static_cast<char>(getch());
}
std::string unit_string(void) noexcept{
if(language=='c')
switch(timing_unit){
case 's': return std::string("s");
case 'm': return std::string("ms");
case 'u': return std::string("mus");
case 'n': return std::string("ns");
}
else
switch(timing_unit){
case 's': return std::string("秒");
case 'm': return std::string("毫秒");
case 'u': return std::string("微秒");
case 'n': return std::string("奈秒");
}
return std::string();
}
std::uint64_t wordsof(const std::vector<std::string>& level) noexcept{
std::uint64_t result=0ULL;
std::vector<std::string>::size_type left=0,right=level.size()-1;
for(;left<right;left++,right--) result+=(level[left].size()+level[right].size());
if(left==right) result+=level[left].size();
return result;
}
这里空空如也

















有帮助,赞一个