21点(人机)
一个21点的小游戏(人机)
需要自己在文件夹中新建一个名字为gamemain的txt文件,并在里面打上数字0
即可实现存档,否则就删除game_read和game_print两个函数
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#define rd(a,b) rand()%(b-a+1)+a
using namespace std;
string mpp[14]={"0","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
struct gam
{string name;int val,sum;
}pr[11];
string str_zh;
vector<int>p;
struct mmm
{int P,money;bool flag1,flag2_1,flag2_2,flag3;
};
void print(string x,string str,int y,int z)
{cout<<x;for(int i=1;i<=y;i++){cout<<str;Sleep(z);}
}
void print(string x,int y,int z)
{cout<<x;for(int i=1;i<=y;i++){printf(".");Sleep(z);}
}
void print(string x,int z)
{cout<<x;for(int i=1;i<=3;i++){printf(".");Sleep(z);}
}
void print(string x)
{cout<<x;for(int i=1;i<=3;i++){printf(".");Sleep(350);}
}
mmm mnode(int v=100)
{mmm x;x.flag1=x.flag2_1=x.flag2_2=x.flag3=0;x.P=0;x.money=v;return x;
}
map<string,mmm>mp;
void color(int clr)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),clr);
}
template<typename T>
void color(T t, const int ForeColor = 7, const int BackColor = 0)
{cout << "\033[" << "38;5;" << ForeColor << "m";cout << "\033[" << "48;5;" << BackColor << "m";cout << t << "\033[m";
}
void ready()
{p.clear();p.shrink_to_fit();for(int i=1;i<=13;i++){p.push_back(i);p.push_back(i);p.push_back(i);p.push_back(i);}
}
void into()
{print("In preparation",50,50);system("cls");mp.clear();struct timeb t;ftime(&t);srand(t.time*1000+t.millitm);
// if(!mp.count("game")) mp["game"]=mnode(1e7);
// if(!mp.count("sxtygame")) mp["sxtygame"]=mnode(1e7);pr[0]={"Iron",247,50};pr[1]={"Bronze",130,100};pr[2]={"Silver",7,170};pr[3]={"Gold",220,300};pr[4]={"Platinum",231,500};pr[5]={"Diamond",51,1000};pr[6]={"Pro Gambler",214,2000};pr[7]={"Stars",213,5000};pr[8]={"King",99,10000};pr[9]={"Legend",197,100000};pr[10]={"God of Gamblers",13,(int)2e9};
}
void FW()
{system("cls");color(4);printf(" __________ \n");printf(" | \\ /\\ / \n");printf(" | \\ / \\ / \n");printf(" | \\ / \\ / \n");printf(" |__________ \\ / \\ / \n");printf(" | \\ / \\ / \n");printf(" | \\ / \\ / \n");printf(" | \\ / \\ / \n");printf(" | \\ / \\ / \n");printf(" | \\/ \\/ \n");Sleep(1500);color(7);system("cls");return;
}
int f(int x){return min(10,x);}
int turn_color(int x)
{if(x<=3) return 231;if(x<=7) return 13;return 220;
}
void print_cj()
{if(mp[str_zh].P) color(to_string(mp[str_zh].P),turn_color(mp[str_zh].P)),color(" winning streak!\n",220);if(mp[str_zh].flag1) color("Burn one's boats!\n",13);if(mp[str_zh].flag2_2) color("Work miracles!\n",220);
}
void pd_zh(string str)
{if(!mp.count(str)) mp[str]=mnode();
}
int solvecom()
{int sum=0;while(true){if(sum>=21) break;int x=rd(0,p.size()-1);if(sum+f(p[x])<=21){sum+=f(p[x]);p.erase(x+p.begin());}else{if(sum<=17){x=rd(0,p.size()-1);//while(f(p[x])+sum>21) x=rd(0,int y=rd(0,p.size()-1);if(f(p[x])>=f(p[y])){if(f(p[x])+sum<=21){sum+=f(p[x]);p.erase(x+p.begin());}else{sum+=f(p[y]);p.erase(y+p.begin());}}else{if(f(p[y])+sum<=21){sum+=f(p[y]);p.erase(y+p.begin());}else{sum+=f(p[x]);p.erase(x+p.begin());}}}break;}}return sum;
}
void solve()
{printf("Please give your uid : ");cin>>str_zh;pd_zh(str_zh);while(true){ready();if(mp[str_zh].money<=5) mp[str_zh].flag2_1=1;if(mp[str_zh].flag2_1&&mp[str_zh].money>=200) mp[str_zh].flag2_2=1;printf("Your money : %d\nYou are ",mp[str_zh].money);for(int i=0;i<=10;i++){if(mp[str_zh].money<=pr[i].sum){color(pr[i].name,pr[i].val);break;}}printf("\n");print_cj();
// color("Burn one's boats : ",220);
// color(to_string(trbe),220);
// printf("\n");color(7);int tt;while(true){printf("Bet your money : ");string str;cin>>str;bool flag=0;for(auto it : str){if(!(it>='0'&&it<='9')){flag=1;break;}}if(flag){printf("It isn't a number , please re-enter.\n");continue;}int x=atoi(str.c_str());if(x>mp[str_zh].money) printf("Your haven't!!!\n");else if(x<=0) printf("You can'T bet this!\n");else{tt=x;if(tt==mp[str_zh].money) mp[str_zh].flag1=1;break;}}system("cls");printf("Now , it's you ( Y / N )\n");int sum1=0,sum2=0,q=0;while(true){string str;cin>>str;int x=rd(0,p.size()-1); while(str=="Read"){printf("Next card : ");cout<<mpp[p[x]]<<endl;cin>>str;}if(str=="R") continue;if(str=="N") break;if(str!="Y"){color("NO!!!\n",197);continue;}cout<<"You get "<<mpp[p[x]]<<endl;if(f(p[x])==1) q++;sum1+=f(p[x]);p.erase(x+p.begin());printf("Your score : %d",sum1-q);if(q) printf(" + %dA",q);printf("\n");}for(int i=1;i<=q;i++){game:string str;printf("You have A!\nNow choose one of the two numbers below!\n1.1 2.11\n");cin>>str;int op;if(str=="1") op=1;else if(str=="2") op=11;else{printf("It isn't a number , please re-enter.\n");system("cls");goto game;}sum1=sum1-1+op;}sum2=solvecom();if(sum1>21&&sum2>21){if(sum1<sum2) printf("You win!\n"),mp[str_zh].money+=tt,mp[str_zh].P++;else if(sum1>sum2) printf("You lose!\n"),mp[str_zh].money-=tt,mp[str_zh].P=0;else printf("Draw!\n");}else if(sum1>21) printf("You lose!\n"),mp[str_zh].money-=tt,mp[str_zh].P=0;else if(sum2>21) printf("You win!\n"),mp[str_zh].money+=tt,mp[str_zh].P++;else{if(sum1>sum2) printf("You win!\n"),mp[str_zh].money+=tt,mp[str_zh].P++;else if(sum1<sum2) printf("You lose!\n"),mp[str_zh].money-=tt,mp[str_zh].P=0;else printf("Draw!\n");}printf("%d %d\n",sum1,sum2);Sleep(1500);system("cls");if(mp[str_zh].money==0){color(4);printf("You lost!\nSurrender your life!");color(7);Sleep(1500);system("cls");mp.erase(str_zh);FW();return;}while(true){string str_con;printf("Do you want continue ? ( Y / N ) : ");cin>>str_con;if(str_con=="N") return;if(str_con=="Y") break; printf("It isn't Y or N , please re-enter.\n");}}
}
void game_read()
{freopen("gamemain.txt","r",stdin);int nnt;cin>>nnt;string str;bool x,y,z,rt;int qp,PP;while(nnt--){cin>>str>>PP>>qp>>x>>y>>z>>rt;mmm v;v.money=qp;v.P=PP;v.flag1=x;v.flag2_1=y;v.flag2_2=z;v.flag3=rt;mp[str]=v;}freopen("CON","r",stdin);
}
void game_write()
{system("cls");print("Archiving");system("cls");printf("Archived\n");Sleep(500);system("cls");freopen("gamemain.txt","w",stdout);fflush(stdout);printf("%d\n",mp.size());for(auto it : mp){cout<<it.first;mmm x=it.second;printf(" %d %d %d %d %d %d\n",x.P,x.money,x.flag1,x.flag2_1,x.flag2_2,x.flag3);}freopen("CON","w",stdout);SetConsoleOutputCP(65001);
}
void print_cd()
{printf("%d\n",mp.size());for(auto it : mp){cout<<it.first;printf(" : ");mmm x=it.second;for(int i=0;i<=10;i++){if(x.money<=pr[i].sum){color(pr[i].name,pr[i].val);break;}}printf(" ");if(x.P) color(to_string(x.P),turn_color(x.P)),color(" winning streak! ",220);if(x.flag1) color("Burn one's boats! ",13);if(x.flag2_2) color("Work miracles! ",220);printf(" money : %d \n",x.money);}system("pause");system("cls");
}
int main()
{into();game_read();while(true){system("cls");printf("1.Enter Game 2.Leave Game 3.View all archives\n");printf("Your choice : ");string str;cin>>str;if(str=="1") solve();else if(str=="2") break;else if(str=="3") print_cd();else color("NO!!!\n",197);Sleep(700);}game_write();return 0;
}