游戏开发日志支线7
2026-05-09 22:28:00
发布于:香港
接上回
游戏:Typing Game
更新版本:0.6 (半成品)
代码:李伙子ia
美术:也没美术啊
翻译:Artificial Intelligence
团队:新手团
//TypingGame0.6
//How to found? Goto https://www.acgo.cn/person/4913066
static constexpr char GAME_NAME[]="TypingGame";
static constexpr char VERSION[]="0.6";
static constexpr char CODER[]="李伙子ia";
static constexpr char ARTIST[]="無";
static constexpr char ENGLISH_TRANSLATOR[]="人工智能";
static constexpr char LAST_UPDATE_DATE[]="2026/4/19";
static constexpr char AUTHOR_HOMEPAGE[]="https://www.acgo.cn/person/4913066";
static constexpr char TIMING_UNIT='s';
static constexpr char LANGUAGE='c';
#ifdef _WIN32
#include<conio.h>
#else
#include<termios.h>
#include<unistd.h>
#include<cstdio>
char _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);
char chr=getchar();
tcsetattr(STDIN_FILENO,TCSANOW,&old_tc);
return chr;
}
#endif
#include<cstdint>
#include<chrono>
#include<string>
#include<vector>
#include<iostream>
void clear() noexcept{
#ifdef _WIN32
system("cls");
#else
system("clear");
#endif
}
char timing_unit=TIMING_UNIT,language=LANGUAGE;
int32_t type_word_cnt=0,pass_level_cnt=0;
std::vector<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? ||-_-"},
};
const int32_t L=1,R=levels.size()-1;
std::vector<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",
"# -*- coding: utf-8 -*-\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",
}
};
const int32_t _L_=1,_R_=_levels_.size()-1;
std::vector<std::vector<std::string>> my_levels={
{"Typing Game"},
};
int32_t my_L=0,my_R=0;
int32_t typing_level(int32_t level_index,uint8_t mod) noexcept{
if(
(mod==0&&(level_index>R))||
(mod==1&&(level_index>_R_))||
(mod==2&&(level_index>my_R))
) return -1;
int32_t wrong_cnt=0;
std::vector<std::string> level;
try{
level=(
mod==0? levels.at(level_index):
mod==1?_levels_.at(level_index): my_levels.at(level_index)
);
}catch(...){
level=(
mod==0? levels.at(0):
mod==1?_levels_.at(0): my_levels.at(0)
);
}
const std::vector<std::string>::size_type level_length=level.size();
for(std::vector<std::string>::size_type index=0;index<level_length;index++){
const std::string& level_str=level.at(index);
std::string::size_type strlen=level_str.size(),backspace=0;
for(std::string::size_type start=0;start<strlen;start++,backspace++){
int chr=level_str.at(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;
for(std::string::size_type jndex=0;jndex<strlen;){
int chr=level_str.at(jndex),key=_getch();
if(key==27) return -27;
if((key!=13&&key!=9&&key!=8)&&((key>=0&&key<=31)||key==127)) continue;
if(key=='\b'){
if(!jndex) continue;
int last_chr=level_str.at(--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() noexcept{
int32_t main_menu_key,game_setting_key;
std::string name="s001";
auto main_start=std::chrono::high_resolution_clock::now();
#ifdef _WIN32
system(((std::string)"title "+GAME_NAME+VERSION).c_str());
#else
std::cout<<(std::string)"\033]0;"+GAME_NAME+VERSION+"\007";
#endif
/*
if(language=='c'){
std::cout<<"你叫什麼名字? "<<'\n';
std::cout<<"你的回答:";
}else{
std::cout<<"What is your name? "<<'\n';
std::cout<<"Your answer: ";
}
std::cout.flush();
std::getline(std::cin,name);
clear();
*/
while(1){
if(language=='c'){
std::cout<<"ID: 001"<<'\n';
std::cout<<"姓名:"<<name<<'\n';
std::cout<<"主菜單"<<'\n';
std::cout<<"按 [空格] 開始遊戲"<<'\n';
std::cout<<"按 'x' 進入地獄模式"<<'\n';
std::cout<<"按 [Esc] 退出遊戲"<<'\n';
std::cout<<"按 's' 更改遊戲設定"<<'\n';
// std::cout<<"按 'c' 進入自定義模式"<<'\n';
}else{
std::cout<<"ID: 001"<<'\n';
std::cout<<"Name: "<<name<<'\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 [Esc] exit the game"<<'\n';
std::cout<<"Press 's' change game settings"<<'\n';
// std::cout<<"Press 'c' go to custom mode"<<'\n';
}
main_menu_key=_getch();
clear();
switch(main_menu_key){
case ' ':{
if(language=='c'){
std::cout<<"請選擇關卡"<<'\n';
std::cout<<"關卡 "<<L<<"~"<<R<<":";
}else{
std::cout<<"Please choose a level"<<'\n';
std::cout<<"Level "<<L<<"~"<<R<<": ";
}
std::string level_str;
std::getline(std::cin,level_str);
int32_t level;
try{
level=std::stoi(level_str);
}catch(...){
level=0;
}
clear();
if(language=='c') std::cout<<"關卡 "<<level<<'\n';
else std::cout<<"level "<<level<<'\n';
auto start=std::chrono::high_resolution_clock::now();
int32_t wrong=typing_level(level,0);
auto end=std::chrono::high_resolution_clock::now();
if(wrong==-27){
clear();
break;
}
if(wrong==-1){
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';
}
int64_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<<timing_unit<<",錯誤字元數:"<<wrong<<'\n';
}else{
std::cout<<"Used time: "<<use_time<<timing_unit<<", Wrong chars: "<<wrong<<'\n';
}
pass_level_cnt++;
}
if(language=='c'){
std::cout<<"按任意鍵繼續 . . . ";
}else{
std::cout<<"Press any key to continue . . . ";
}
_getch();
clear();
break;
}
case 'X':
case 'x':{
if(language=='c'){
std::cout<<"請選擇關卡"<<'\n';
std::cout<<"關卡 "<<_L_<<"~"<<_R_<<":";
}else{
std::cout<<"Please choose a level"<<'\n';
std::cout<<"Level "<<_L_<<"~"<<_R_<<": ";
}
std::string level_str;
std::getline(std::cin,level_str);
int32_t _level_;
try{
_level_=std::stoi(level_str);
}catch(...){
_level_=0;
}
clear();
if(language=='c') std::cout<<"關卡 "<<_level_<<'\n';
else std::cout<<"level "<<_level_<<'\n';
auto _start_=std::chrono::high_resolution_clock::now();
int32_t _wrong_=typing_level(_level_,1);
auto _end_=std::chrono::high_resolution_clock::now();
if(_wrong_==-27){
clear();
break;
}
if(_wrong_==-1){
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';
}
int64_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_<<timing_unit<<",錯誤字元數:"<<_wrong_<<'\n';
}else{
std::cout<<"Used time: "<<_use_time_<<timing_unit<<", Wrong chars: "<<_wrong_<<'\n';
}
pass_level_cnt++;
}
if(language=='c'){
std::cout<<"按任意鍵繼續 . . . ";
}else{
std::cout<<"Press any key to continue . . . ";
}
_getch();
clear();
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<<"作者主頁:"<<AUTHOR_HOMEPAGE<<'\n';
std::cout.put('\n');
std::cout<<"修改設定"<<'\n';
std::cout<<"按 't' 更改計時單位"<<'\n';
std::cout<<"按 'l' 更改語言"<<'\n';
std::cout<<"按 'h' 開啟作者主頁"<<'\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<<"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 [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';
}
game_setting_key=_getch();
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=_getch();
if(timing_unit=='s'||timing_unit=='m'||timing_unit=='u'||timing_unit=='n') break;
}while(true);
std::cout.put('\n');
if(language=='c'){
std::cout<<"設定已儲存!"<<'\n';
std::cout<<"按任意鍵繼續 . . . ";
}else{
std::cout<<"Setting saved!"<<'\n';
std::cout<<"Press any key to continue . . . ";
}
_getch();
clear();
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=_getch();
if(language=='c'||language=='e') break;
}while(true);
std::cout.put('\n');
if(language=='c'){
std::cout<<"設定已儲存!"<<'\n';
std::cout<<"按任意鍵繼續 . . . ";
}else{
std::cout<<"Setting saved!"<<'\n';
std::cout<<"Press any key to continue . . . ";
}
_getch();
clear();
break;
}
case 'H':
case 'h':{
#ifdef _WIN32
system(((std::string)"start "+AUTHOR_HOMEPAGE).c_str());
#else
system(((std::string)"xdg-open "+AUTHOR_HOMEPAGE).c_str());
#endif
if(language=='c'){
std::cout<<"按任意鍵繼續 . . . ";
}else{
std::cout<<"Press any key to continue . . . ";
}
_getch();
clear();
break;
}
case 27:{
break;
}
}
break;
}
case 27:{
if(language=='c'){
std::cout<<"再見!"<<'\n';
}else{
std::cout<<"Goodbye!"<<'\n';
}
auto main_end=std::chrono::high_resolution_clock::now();
auto _cnt_time=std::chrono::duration_cast<std::chrono::seconds>(main_end-main_start).count();
if(language=='c'){
std::cout<<"--------------------------------"<<'\n';
std::cout<<"程式執行 "<<_cnt_time<<" 秒後退出,返回值 0"<<'\n';
std::cout<<"按任意鍵繼續 . . . ";
}else{
std::cout<<"--------------------------------"<<'\n';
std::cout<<"Process exited after "<<_cnt_time<<" seconds with return value 0"<<'\n';
std::cout<<"Press any key to continue . . . ";
}
while(1) _getch();
}
}
}
}
全部评论 2
怎么没人评论
2026-05-17 来自 上海
0中文终于好了
2026-05-17 来自 上海
0





















有帮助,赞一个