<胎神游戏集2025> 小胎牌1.1.1
先祝大家2025新年快乐!
小胎牌基础玩法已更新完成,后续随缘更新
(版本1.1.1)
1、优化了新手教程
2、新增存档系统,补全原有成就系统
3、以很少的牌达成目标分也可以获得万能花色牌作为奖励了!
4、卡牌平衡性调整,同花被削,顺子加强
5、完善了剩余的胜利动画和入场动画
6、理牌、隐藏牌型bug修复
7、新增胎神语录
最新更新时间:25/1/19 23:07
#include<bits/stdc++.h>
#include<windows.h>
#include<stdio.h>
#include<conio.h>
#include<time.h>
using namespace std;
void Color(int a);
char s[350][12][32]={
{"Lock"," "," +-------+ "," | +=+ | "," | | | | "," |[LOCK!]| "," |[_____]| "," | | "," +-------+ "," ",},
{"A-red","+---------+","|A |","| .. .. |","| ....... |","| ..... |","| . |","| |","| A|","+---------+",},{"A-black","+---------+","|A . |","| ... |","| .. .. |","| ....... |","| . |","| .. .. |","| A|","+---------+",},{"A-diamond","+---------+","|A |","| . |","| ... |","| ..... |","| ... |","| . |","| A|","+---------+",},{"A-club","+---------+","|A ... |","| ... |","| .. . .. |","| ... ... |","| . |","| ... |","| A|","+---------+",},{"2-red","+---------+","|2 . . |","| ..... |","| . |","| |","| . . |","| ..... |","| . 2|","+---------+",},{"2-black","+---------+","|2 . |","| .. .. |","| ..... |","| |","| . |","| .. .. |","| ..... 2|","+---------+",},{"2-diamond","+---------+","|2 . |","| ... |","| . |","| |","| . |","| ... |","| . 2|","+---------+",},{"2-club","+---------+","|2 ... |","| .. .. |","| ..... |","| |","| ... |","| .. .. |","| ..... 2|","+---------+",},{"3-red","+---------+","|3 ...|","| . |","| ... |","| . |","|... |","| . |","| 3|","+---------+",},{"3-black","+---------+","|3 . |","| ...|","| . |","| ... |","| . |","|... |","| 3|","+---------+",},{"3-diamond","+---------+","|3 . |","| ...|","| . . |","| ... |","| . . |","|... |","| . 3|","+---------+",},{"3-club","+---------+","|3 ...|","| . .|","| ... |","| . . |","|... |","|. . |","| 3|","+---------+",},{"4-red","+---------+","|4 |","| ... ... |","| . . |","| |","| ... ... |","| . . |","| 4|","+---------+",},{"4-black","+---------+","|4 |","| . . |","| ... ... |","| |","| . . |","| ... ... |","| 4|","+---------+",},{"4-diamond","+---------+","|4 . . |","| ... ... |","| . . |","| |","| . . |","| ... ... |","| . . 4|","+---------+",},{"4-club","+---------+","|4 |","| ... ... |","| . . . . |","| |","| ... ... |","| . . . . |","| 4|","+---------+",},{"5-red","+---------+","|5... ... |","| . . |","| ... |","| . |","| ... ... |","| . . |","| 5|","+---------+",},{"5-black","+---------+","|5 . . |","| ... ... |","| . |","| ... |","| . . |","| ... ... |","| 5|","+---------+",},{"5-diamond","+---------+","|5. . |","|... ...|","| . . . |","| ... |","| . . . |","|... ...|","| . .5|","+---------+",},{"5-club","+---------+","|5.. ...|","|. . . .|","| ... |","| . . |","|... ...|","|. . . .|","| 5|","+---------+",},{"6-red","+---------+","|6... ... |","| . . |","| |","| ... ... |","| . . |","| ... ... |","| . . 6|","+---------+",},{"6-black","+---------+","|6 . . |","| ... ... |","| |","| . . |","| ... ... |","| . . |","| ... ...6|","+---------+",},{"6-diamond","+---------+","|6 . . |","| ... ... |","| . . |","| . . |","| ... ... |","| . . |","| ... ...6|","+---------+",},{"6-club","+---------+","|6... ... |","| . . . . |","| |","| ... ... |","| . . . . |","| ... ... |","| . . . .6|","+---------+",},{"7-red","+---------+","|7 .. .. |","| |","| ... |","|.. . ..|","| . . |","| |","| .. .. 7|","+---------+",},{"7-black","+---------+","|7 .. .. |","| |","| . |","| . ... . |","|.. ..|","| |","| .. .. 7|","+---------+",},{"7-diamond","+---------+","|7 .. .. |","| |","| . |","|. ... .|","|.. . ..|","| |","| .. .. 7|","+---------+",},{"7-club","+---------+","|7 .. .. |","| |","| ... |","|. .. .. .|","|. ..... .|","| |","| .. .. 7|","+---------+",},{"8-red","+---------+","|8... ... |","| ... ... |","| . . |","| |","| ... ... |","| . . |","| ... ...8|","+---------+",},{"8-black","+---------+","|8... ... |","| . . |","| ... ... |","| |","| . . |","| ... ... |","| ... ...8|","+---------+",},{"8-diamond","+---------+","|8... ... |","| . . |","| ... ... |","| . . |","| . . |","| ... ... |","| ... ...8|","+---------+",},{"8-club","+---------+","|8... ... |","| ... ... |","| . . . . |","| |","| ... ... |","| . . . . |","| ... ...8|","+---------+",},{"9-red","+---------+","|9. . ...|","| . |","| ... |","| . . . |","| |","|... . . |","| . . .9|","+---------+",},{"9-black","+---------+","|9. . . |","| ...|","| . |","| . ... . |","| |","| . . . |","|... . .9|","+---------+",},{"9-diamond","+---------+","|9. . . |","| ...|","| . . . |","| ... |","| . . . |","|... |","| . . .9|","+---------+",},{"9-club","+---------+","|9. . ...|","| . .|","| ... |","|. . . .|","| |","|... . .|","|. . . 9|","+---------+",},{"10-red","+---------+","|10 . |","|. .|","| . . |","|. ..... .|","| . |","|. .|","| . . 10|","+---------+",},{"10-black","+---------+","|10 . |","|. .|","| . |","|. .. .. .|","| ..... |","|. .|","| . . 10|","+---------+",},{"10-diamond","+---------+","|10 . |","|. .|","| . |","|. ... .|","| . |","|. .|","| . . 10|","+---------+",},{"10-club","+---------+","|10 . |","|. .|","| ... |","|. .. .. .|","| ..... |","|. .|","| . . 10|","+---------+",},{"J-red","+---------+","|J ### |","| ()# |","|^ ++# +|","|| ++ +#+||","|++ # ++ v|","| #() |","| ### J|","+---------+",},{"Q-red","+---------+","|Q && |","| &()& ++|","|^ ++&+ ||","|| ++ +& ||","|| +& ++ v|","|++ &()& |","| && Q|","+---------+",},{"K-red","+---------+","|K @@@ +|","| @()@ +||","| @ ++@+ ||","|^ + + v|","|| +@ ++@ |","||+ @()@ |","|+ @@@ K|","+---------+",},{"J-black","+---------+","|J ### |","| ()# |","|^ --# +|","|| -- -#-||","|+- # -- v|","| #() |","| ### J|","+---------+",},{"Q-black","+---------+","|Q && |","| &()& -+|","|^ --&- ||","|| -- -& ||","|| -& -- v|","|+- &()& |","| && Q|","+---------+",},{"K-black","+---------+","|K @@@ +|","| @()@ -||","| @ --@- ||","|^ - - v|","|| -@ --@ |","||- @()@ |","|+ @@@ K|","+---------+",},{"J-diamond","+---------+","|J ### |","| ()# |","|^ //# +|","|| // /#/||","|+/ # // v|","| #() |","| ### J|","+---------+",},{"Q-diamond","+---------+","|Q && |","| &()& /+|","|^ //&/ ||","|| // /& ||","|| /& // v|","|+/ &()& |","| && Q|","+---------+",},{"K-diamond","+---------+","|K @@@ +|","| @()@ /||","| @ //@/ ||","|^ / / v|","|| /@ //@ |","||/ @()@ |","|+ @@@ K|","+---------+",},{"J-club","+---------+","|J ### |","| ()# |","|^ ==# +|","|| == =#=||","|+= # == v|","| #() |","| ### J|","+---------+",},{"Q-club","+---------+","|Q && |","| &()& =+|","|^ ==&= ||","|| == =& ||","|| =& == v|","|+= &()& |","| && Q|","+---------+",},{"K-club","+---------+","|K @@@ +|","| @()@ =||","| @ ==@= ||","|^ = = v|","|| =@ ==@ |","||= @()@ |","|+ @@@ K|","+---------+",},
{"Rock","+-----#---+","|* # # |","| #|","| #|","# |","| |","|# # |","| ## # *|","+---------+",},
};
struct node
{
int n;//在s当中的标签号
int point;
char material[10];// Blue Red Wild Glass Steel Gold Rock Lucky
char seal[10];// Gold Blue Purple Red
int color;// 1red 2black 3diamond 4club
bool Life;// 是否被删除
bool Used;// 是否还可以被抽到
}c[1000];
void Setpos(float x,int y){COORD pos;pos.X=x*2+1,pos.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}
void ClearTips(){for(int i=1;i<=18;i++){Setpos(2,19+i);for(int j=1;j<=19;j++) cout<<" ";}}
char t[500][500]={" 单牌 1 x 5 对子 2 x 10 两对 2.5 x 20 连对 2.5 x 30 三对 3 x 30 三条 3 x 30 三带一 3 x 25+ 三带二 4 x 40 同花 4 x 30+ 顺子 5+ x 35+ 三连对 6 x 40 飞机 6 x 50 炸弹 7 x 60 四带二 7 x 70 同花顺 8+ x 100+ “+ ”代表该数值会随玩家的跟牌变化 隐藏牌型另算",
"AWSD或上下左右箭头移动,空格键或回车键来选卡/按下按钮。 选完卡后,回车按下【出牌!】按钮即可出牌!你还可以理牌和弃牌。 红色数字为倍率,由牌型提供; 蓝色数字为基数,由牌提供! 得分 = 基数 * 倍率 非特殊牌型一次只能出5张牌。想了解牌型倍率信息 ,请点击上方按钮,还可以回主菜单查看!",
};
void printTips(int n){ClearTips();char *p=t[n];int Line=0,num=0;Setpos(2,20);while(1){if(num>=19) Setpos(2,21+Line),num=0,Line++;if(*p!=0){printf("%c",*p++),num++;if(!kbhit())Sleep(10);}else {break;}}}
void Slow(const char *p) {while(1){if(*p!=0) printf("%c",*p++);else break;Sleep(10);}}void Slow2(const char *p) {while(1){if(*p!=0) printf("%c",*p++);else break;Sleep(50);}}
int Cardnum,NotUsedCardnum,Dienum;bool TipsOn;
void printFrame(int color,int x,int y,int xx,int yy){Color(color);for(int i=x;i<=xx+1;i++)for(int j=y;j<=yy+1;j++){Setpos(i,j);if((j==y||j==yy+1)&&(i==x||i==xx+1)) printf("++");else if(j==y||j==yy+1)printf("==");else if(i==x||i==xx+1) printf("||");}}
bool Have(char s[50],char a[50])//检测s里面有没有a
{
for(int i=0;i<strlen(s);i++)
{
if(a[0]==s[i])
{
int flag=1;
for(int j=1;j<strlen(a);j++) if(a[j]!=s[i+j]) {flag=0;break;}
if(flag==1&&i+strlen(a)-1<strlen(s)&&a=="1"&&s[i+strlen(a)]=='0') flag=0;//特判输1不判10
if(flag==1) return 1;
}
}
return 0;
}
void printCard(int n,float x,int y,bool kill,int yy)
{Color(0);
int color=7,Frameflag=0,ccolor=c[n].color;
if(ccolor==1) color=4;
else if(ccolor==2) color=1;
else if(ccolor==3) color=10;
else if(ccolor==4) color=2;
for(int i=1;i<=9;i++)
{
if(i>1&&!strcmp(c[n].material,"Wild"))
{
if(ccolor==1) color=4;
else if(ccolor==2) color=1;
else if(ccolor==3) color=10;
else if(ccolor==4) color=2;
ccolor%=4;ccolor++;
}
for(int j=0;j<strlen(s[c[n].n][i]);j++)
{
if(kill==1) Setpos(x+j*0.5,y+i),cout<<' ';
else{
if(Frameflag==0&&(i==1||i==9||j==0||j==strlen(s[c[n].n][i])-1))
{
if(yy!=0) Color(-5);
else Color(0);
}else Color(color);
Setpos(x+j*0.5,y+i),cout<<s[c[n].n][i][j];
}
}
}
}
int JOKERplace[2]={15,1},OUTCARDplace[2]={19,13},HANDCARDplace[2]={15,27},SKILLCARDplace[2]={48,1},JOKER[20]={0},OUTCARD[20]={},HANDCARD[20]={},SKILLCARD[20]={0},JOKERnum,OUTCARDnum,HANDCARDnum,SKILLCARDnum,HANDCARDnumMAX,JOKERnumMAX,SKILLCARDnumMAX;
int up,dn,lf,rt,uplock,dnlock,lflock,rtlock,Consornum=4,lastConsornum,lastlastConsornum,level,Bonus;
char Type[20]="单牌",Status[50]="POP",Status2[50]="RIGHT",lastStatus[50],lastStatus2[50],lastlastStatus[50],lastlastStatus2[50];
bool ChoosenCard[50],spacelock;
float HANDCARDgap;
double AimScore,Score,Blue,Red;
void printHandCard(int consornum,int yy,bool kill);void printStatus();void printAll();
double AimScores[50]={1,100,300,800 ,1800,2250,2750 ,2560,2950 ,3250 ,3450,3900 ,4040,4250,4500,4750,5050,6050,7050,8050,9050,10050,12050,15050,114,514,1919,810,1145,1419,19810,114514,1919810,1,1,1,1,1,1,1,1,1};
bool CalculateCard[10];int Choosennum=0,NumCard[15],ColorCard[6],link=0,two=0,two2=0,two3=0,three=0,three2=0,four=0,five=0,colornum=0;
int StartTime;float Wildrate;
void StartLevel()
{
Score=Blue=Red=0;Color(0);Setpos(4,3),printf("level %d /%d ",level,8*((level-1)/8+1));
if(level%3==1) Setpos(4,4),printf("盲注 "),Setpos(3.5,5),printf("Small Blind "),Bonus=3;
else if(level%3==2) Setpos(4,4),printf("大盲注 "),Setpos(3.5,5),printf("Big Blind "),Bonus=4;
else Setpos(4,4),printf("超大盲注 "),Setpos(3.5,5),printf("Boss Blind "),Bonus=5;
AimScore=AimScores[level];
Setpos(2,8);printf("目标金额:");Color(5);if(Blue>1e8) printf("【%.3e】",AimScore);else printf("【%.0lf】",AimScore);Color(0);
Setpos(2,10);printf("本注奖励:$");if(Bonus<=8) for(int i=1;i<=Bonus-1;i++) cout<<'$'; else cout<<Bonus;cout<<" ";
Setpos(2,12);Color(0),cout<<" ";
printStatus();
}
void CheckType()
{
if(colornum<=1&&link==Choosennum-1&&Choosennum>=5) strcpy(Type,"同花顺"),Red=4.25+0.75*Choosennum,Blue=75+5*Choosennum;
else if(link==Choosennum-1&&Choosennum>=5) strcpy(Type,"顺子"),Red=1.25+0.75*Choosennum,Blue=10+5*Choosennum;
else if(colornum<=1)
{
if(five>0) strcpy(Type,"同花五条"),Red=16,Blue=160;
else if(four>0&&two>0) strcpy(Type,"同花四带二"),Red=12,Blue=180;
else if(four>0) strcpy(Type,"同花炸弹"),Red=12,Blue=160;
else if(three2>0&&link>=1&&Choosennum==6) strcpy(Type,"同花飞机"),Red=10,Blue=150;
else if(three>0&&two>0) strcpy(Type,"同花三带二"),Red=9,Blue=140;
else if(three>0&&Choosennum==3) strcpy(Type,"同花三条"),Red=8,Blue=90;
else if(three>0) strcpy(Type,"同花三带一"),Red=8,Blue=95;
else if(two3>0&&link>=2&&Choosennum==6) strcpy(Type,"同花三连对"),Red=10,Blue=140;
else if(two3>0) strcpy(Type,"同花三对"),Red=5,Blue=60;
else if(two2>0&&(abs(two-two2)==1||abs(two-two2)==12)) strcpy(Type,"同花连对"),Red=4.5,Blue=50;
else if(Choosennum>=5) strcpy(Type,"同花"),Red=4,Blue=-20+Choosennum*10;
else if(two2>0) strcpy(Type,"同花两对"),Red=3.5,Blue=30;
else if(two>0) strcpy(Type,"同花对子"),Red=3,Blue=20;
else strcpy(Type,"单牌"),Red=1,Blue=5;
}
else if(five>0) strcpy(Type,"五条"),Red=12,Blue=120;
else if(four>0&&two>0) strcpy(Type,"四带二"),Red=7,Blue=70;
else if(four>0) strcpy(Type,"炸弹"),Red=7,Blue=60;
else if(three2>0&&link>=1&&Choosennum==6) strcpy(Type,"飞机"),Red=6,Blue=50;
else if(three>0&&two>0) strcpy(Type,"三带二"),Red=4,Blue=40;
else if(three>0&&Choosennum==3) strcpy(Type,"三条"),Red=3,Blue=30;
else if(three>0) strcpy(Type,"三带一"),Red=3,Blue=25;
else if(two3>0&&link>=2&&Choosennum==6) strcpy(Type,"三连对"),Red=6,Blue=40;
else if(two3>0) strcpy(Type,"三对"),Red=3,Blue=30;
else if(two2>0&&(abs(two-two2)==1||abs(two-two2)==12)) strcpy(Type,"连对"),Red=2.5,Blue=30;
else if(two2>0) strcpy(Type,"两对"),Red=2.5,Blue=20;
else if(two>0) strcpy(Type,"对子"),Red=2,Blue=10;
else strcpy(Type,"单牌"),Red=1,Blue=5;
}
int MaxType[30],MaxOnceScore,MaxMaxOnceScore,DiscardNum,PopNum,PopNice,PopLegend,Wildnum,PlayTurnNum,MaxMaxLevel,MaxMaxTime,MaxLevel,MaxTime,WinTurnNum;double MaxMaxAllScore,MaxSumScore,MaxMaxSumScore,MaxAllScore;char MaxOnceType[30];
void CalculateSum()
{PopNum++;
if(!strcmp(Type,"同花顺")) MaxType[15]++,PopLegend++;
else if(!strcmp(Type,"顺子")) MaxType[14]++,PopNice++;
else if(!strcmp(Type,"同花")) MaxType[13]++;
else if(Have(Type,"五条")) MaxType[18]++,PopLegend++;
else if(Have(Type,"四带二")) MaxType[12]++,PopLegend++;
else if(Have(Type,"炸弹")) MaxType[11]++,PopLegend++;
else if(Have(Type,"飞机")) MaxType[10]++,PopNice++;
else if(Have(Type,"三带二")) MaxType[9]++;
else if(Have(Type,"三条")) MaxType[8]++;
else if(Have(Type,"三带一")) MaxType[7]++;
else if(Have(Type,"三连对")) MaxType[6]++,PopNice++;
else if(Have(Type,"三对")) MaxType[5]++;
else if(Have(Type,"连对")) MaxType[4]++;
else if(Have(Type,"两对")) MaxType[3]++;
else if(Have(Type,"对子")) MaxType[2]++;
else if(!strcmp(Type,"单牌")) MaxType[1]++;
int maxpoint=0,maxcard;float OUTCARDgap=round(84.0/OUTCARDnum*1.0)/2.0-1;
for(int i=0;i<OUTCARDnum;i++)
{
if(Have(Type,"同花")||link>=4) CalculateCard[i]=1;
else
{
if(c[OUTCARD[i]].point>maxpoint&&c[OUTCARD[i]].point!=three) maxpoint=c[OUTCARD[i]].point,maxcard=i;
if(c[OUTCARD[i]].point!=0&&(c[OUTCARD[i]].point==two||c[OUTCARD[i]].point==two2||c[OUTCARD[i]].point==two3||c[OUTCARD[i]].point==three||c[OUTCARD[i]].point==three2||c[OUTCARD[i]].point==four||c[OUTCARD[i]].point==five)) CalculateCard[i]=1;
}
}
if(!strcmp(Type,"单牌")||!strcmp(Type,"三带一")) CalculateCard[maxcard]=1;
if(level==1&&Dienum==0) Sleep(700);
for(int i=0;i<OUTCARDnum;i++) //真正的轮流计分环节
{
if(CalculateCard[i]==1)
{
Blue+=c[OUTCARD[i]].point;Color(1);
if(OUTCARDnum<=5) Setpos(OUTCARDplace[0]+i*6+2,OUTCARDplace[1]); else Setpos(OUTCARDplace[0]+i*OUTCARDgap+1,OUTCARDplace[1]);
printf("+%d",c[OUTCARD[i]].point);
printStatus();
Setpos(30,11);Color(3),cout<<Type<<" ";Color(1),cout<<"当前倍率 "<<Blue;Color(4);cout<<" x "<<Red<<" ! ";
Sleep(300);if(level==1&&Dienum==0) Sleep(700);
if(OUTCARDnum<=5) Setpos(OUTCARDplace[0]+i*6+2,OUTCARDplace[1]); else Setpos(OUTCARDplace[0]+i*OUTCARDgap+1,OUTCARDplace[1]);
printf(" ");
}
}
for(int i=1;i<=Red*3;i++)
{
Setpos(30,11);Color(3),cout<<Type<<" ";Color(1),cout<<"回合得分 ";
if(i>=20&&i%8==1) Color(8);
else if(i>=16&&i%5==1) Color(0);
else if(i>=12&&i%4==1) Color(3);
else if(i>=8&&i%3==0) Color(5);
else if(i>=4&&i%2==0) Color(4);
else Color(1);
cout<<int(Blue*i/3.0);Color(0);cout<<" ! ",Sleep(25);
}
Setpos(30,11);cout<<" ";Setpos(30,10);Color(3),cout<<Type<<" ";Color(1),cout<<"回合得分 ";Color(5);cout<<int(Red*Blue);Color(0);cout<<" ! ";
Setpos(4,13);Color(3);if(Red*Blue>1e8) printf(" 【%.3e】",Red*Blue);else printf(" 【%.0lf】",Red*Blue);
Sleep(100);
Setpos(30,10);cout<<" ";Setpos(30,11);Color(3),cout<<Type<<" ";Color(1),cout<<"回合得分 ";Color(5);cout<<int(Red*Blue);Color(0);cout<<" ! ";
Score+=Red*Blue;MaxAllScore=max(MaxAllScore,Score);MaxSumScore+=Red*Blue;
if(MaxOnceScore<=int(Red*Blue)) strcpy(MaxOnceType,Type),MaxOnceScore=int(Red*Blue);
Red=0,Blue=0;Setpos(2,13);Color(0);printf(" ");
printStatus();
Sleep(100);if(level==1&&Dienum==0) Sleep(900);
if(OUTCARDnum<=5) for(int i=0;i<OUTCARDnum;i++) printCard(OUTCARD[i],OUTCARDplace[0]+i*6,OUTCARDplace[1],1,0); else for(int i=0;i<OUTCARDnum;i++) printCard(OUTCARD[i],OUTCARDplace[0]+i*OUTCARDgap-1,OUTCARDplace[1],1,0);
memset(OUTCARD,0,sizeof(OUTCARD));
OUTCARDnum=0;
memset(CalculateCard,0,sizeof(CalculateCard));memset(NumCard,0,sizeof(NumCard));memset(ColorCard,0,sizeof(ColorCard));Choosennum=link=two=two2=two3=three2=three=four=five=colornum=0;Setpos(30,11),Color(0),cout<<" ";Setpos(30,11),Color(0),cout<<" ";
}
void PrintAllHandCard(int kill)
{
Setpos(53,37),Color(7),printf("牌堆剩余 %d/%d ",NotUsedCardnum,Cardnum);
HANDCARDgap=round(84.0/HANDCARDnum*1.0)/2.0;if(HANDCARDnum>=11) HANDCARDgap-=0.5;
if(abs(kill)==2) HANDCARDgap=min(3.0,(double)HANDCARDgap);if(kill==2) kill=0;if(kill==-2) kill=1;
for(int i=1;i<=HANDCARDnum;i++) printHandCard(i,0,kill);
}
void GiveHandCard()
{
if(level<=2) HANDCARDnumMAX=7;
else if(level<=3) HANDCARDnumMAX=8;
else if(level<=5) HANDCARDnumMAX=9;
else if(level<=9) HANDCARDnumMAX=10;
else if(level<=14) HANDCARDnumMAX=11;
else if(level<=18) HANDCARDnumMAX=12;
else if(level<=21) HANDCARDnumMAX=min(30,level/2+3);
while(NotUsedCardnum>0&&HANDCARDnum<HANDCARDnumMAX)
{
PrintAllHandCard(1);
int r=rand()%NotUsedCardnum+1,rr=0;
for(int i=1;i<=Cardnum;i++)
{
if(c[i].Life!=0&&c[i].Used!=1) rr++;
if(rr==r) {r=i;break;}
}
int w=rand()%200+1;
if(w<=Wildrate&&strcmp(c[r].material,"Wild")) strcpy(c[r].material,"Wild"),Wildnum++,Wildrate*=0.6;
HANDCARDnum++;HANDCARD[HANDCARDnum-1]=r;
c[r].Used=1;NotUsedCardnum--;
PrintAllHandCard(0);
Sleep(120);
}
}
void SortByPoint()
{
PrintAllHandCard(1);memset(ChoosenCard,0,sizeof(ChoosenCard));PrintAllHandCard(2);
for(int i=0;i<HANDCARDnum;i++)
for(int j=i+1;j<HANDCARDnum;j++)
{
if(c[HANDCARD[i]].point>c[HANDCARD[j]].point) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].point==c[HANDCARD[j]].point&&c[HANDCARD[i]].color>c[HANDCARD[j]].color) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].point==c[HANDCARD[j]].point&&c[HANDCARD[i]].color==c[HANDCARD[j]].color&&strcmp(c[HANDCARD[i]].material,c[HANDCARD[j]].material)==-1) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].point==c[HANDCARD[j]].point&&c[HANDCARD[i]].color==c[HANDCARD[j]].color&&strcmp(c[HANDCARD[i]].material,c[HANDCARD[j]].material)==0&&strcmp(c[HANDCARD[i]].seal,c[HANDCARD[j]].seal)==-1) swap(HANDCARD[i],HANDCARD[j]);
}
memset(CalculateCard,0,sizeof(CalculateCard));memset(NumCard,0,sizeof(NumCard));memset(ColorCard,0,sizeof(ColorCard));Choosennum=link=two=two2=two3=three2=three=four=five=colornum=0;Setpos(30,11),Color(0),cout<<" ";Setpos(30,11),Color(0),cout<<" ";
PrintAllHandCard(-2);PrintAllHandCard(0);
}
void SortByColor()
{
PrintAllHandCard(1);memset(ChoosenCard,0,sizeof(ChoosenCard));PrintAllHandCard(2);
for(int i=0;i<HANDCARDnum;i++)
for(int j=i+1;j<HANDCARDnum;j++)
{
if(strcmp(c[HANDCARD[i]].material,"Wild")&&strcmp(c[HANDCARD[j]].material,"Wild"))//全是普通牌
{
if(c[HANDCARD[i]].color>c[HANDCARD[j]].color) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].color==c[HANDCARD[j]].color&&c[HANDCARD[i]].point>c[HANDCARD[j]].point) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].color==c[HANDCARD[j]].color&&c[HANDCARD[i]].point==c[HANDCARD[j]].point&&strcmp(c[HANDCARD[i]].material,c[HANDCARD[j]].material)==-1) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].color==c[HANDCARD[j]].color&&c[HANDCARD[i]].point==c[HANDCARD[j]].point&&strcmp(c[HANDCARD[i]].material,c[HANDCARD[j]].material)==0&&strcmp(c[HANDCARD[i]].seal,c[HANDCARD[j]].seal)==-1) swap(HANDCARD[i],HANDCARD[j]);
}
else if(!strcmp(c[HANDCARD[i]].material,"Wild")&&!strcmp(c[HANDCARD[j]].material,"Wild"))//全是花牌
{
if(c[HANDCARD[i]].point>c[HANDCARD[j]].point) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].point==c[HANDCARD[j]].point&&c[HANDCARD[i]].color>c[HANDCARD[j]].color) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].color==c[HANDCARD[j]].color&&c[HANDCARD[i]].point==c[HANDCARD[j]].point&&strcmp(c[HANDCARD[i]].material,c[HANDCARD[j]].material)==-1) swap(HANDCARD[i],HANDCARD[j]);
else if(c[HANDCARD[i]].color==c[HANDCARD[j]].color&&c[HANDCARD[i]].point==c[HANDCARD[j]].point&&strcmp(c[HANDCARD[i]].material,c[HANDCARD[j]].material)==0&&strcmp(c[HANDCARD[i]].seal,c[HANDCARD[j]].seal)==-1) swap(HANDCARD[i],HANDCARD[j]);
}
else if(strcmp(c[HANDCARD[i]].material,"Wild")&&!strcmp(c[HANDCARD[j]].material,"Wild")) swap(HANDCARD[i],HANDCARD[j]);
}
memset(CalculateCard,0,sizeof(CalculateCard));memset(NumCard,0,sizeof(NumCard));memset(ColorCard,0,sizeof(ColorCard));Choosennum=link=two=two2=two3=three2=three=four=five=colornum=0;Setpos(30,11),Color(0),cout<<" ";
PrintAllHandCard(-2);PrintAllHandCard(0);
}
void Discard()
{if(Wildrate<10) Wildrate+=Choosennum;else if(Wildrate<15) Wildrate+=0.5*Choosennum;else Wildrate+=0.25*Choosennum;
DiscardNum+=Choosennum;
PrintAllHandCard(1);
for(int i=1;i<=HANDCARDnum;i++)
{
if(ChoosenCard[i]==1)
{
for(int j=i;j<HANDCARDnum;j++)
{
HANDCARD[j-1]=HANDCARD[j];
ChoosenCard[j]=ChoosenCard[j+1];
}
HANDCARD[HANDCARDnum-1]=0;
HANDCARDnum--;
i--;
}
}
memset(ChoosenCard,0,sizeof(ChoosenCard));
memset(CalculateCard,0,sizeof(CalculateCard));memset(NumCard,0,sizeof(NumCard));memset(ColorCard,0,sizeof(ColorCard));Choosennum=link=two=two2=two3=three2=three=four=five=colornum=0;Setpos(30,11),Color(0),cout<<" ";
PrintAllHandCard(0);
Sleep(10);
GiveHandCard();
}
void Pop()
{
PrintAllHandCard(1);
for(int i=1;i<=HANDCARDnum;i++)
{
if(ChoosenCard[i]==1) OUTCARDnum++,OUTCARD[OUTCARDnum-1]=HANDCARD[i-1];
}
for(int i=1;i<=HANDCARDnum;i++)
{
if(ChoosenCard[i]==1)
{
for(int j=i;j<HANDCARDnum;j++)
{
HANDCARD[j-1]=HANDCARD[j];
ChoosenCard[j]=ChoosenCard[j+1];
}
HANDCARD[HANDCARDnum-1]=0;
HANDCARDnum--;
i--;
}
}
memset(ChoosenCard,0,sizeof(ChoosenCard));
PrintAllHandCard(0);
printAll();
CalculateSum();
if(Score>=AimScore) return;
GiveHandCard();
}
void DeleteCard(int i) //销毁手牌中的第 i张
{
c[i].Life=0;
c[i].n=0;
c[i].color=0;
strcpy(c[i].material,"");
strcpy(c[i].seal,"");
}
void ReturnCard() //归还已出手牌
{Wildrate/=10;if(NotUsedCardnum>=5) Wildrate+=(NotUsedCardnum-10)*0.8;
for(int i=1;i<=Cardnum;i++) c[i].Used=0;NotUsedCardnum=Cardnum;
for(int i=0;i<HANDCARDnum;i++) c[HANDCARD[i]].Used=1,NotUsedCardnum--;
}
void InitializationCard() //手牌,小丑牌,出的牌归零
{
level=1;StartTime=clock();
memset(MaxType,0,sizeof(MaxType)),MaxAllScore=MaxSumScore=MaxOnceScore=Wildrate=DiscardNum=PopNum=PopNice=PopLegend=Wildnum=0;memset(MaxOnceType,0,sizeof(MaxOnceType));
for(int i=1;i<=52;i++)
{
c[i].Life=1;
c[i].Used=0;
c[i].n=i;
if(Have(s[c[i].n][0],"-red")) c[i].color=1;
else if(Have(s[c[i].n][0],"-black")) c[i].color=2;
else if(Have(s[c[i].n][0],"-diamond")) c[i].color=3;
else if(Have(s[c[i].n][0],"-club")) c[i].color=4;
if(Have(s[c[i].n][0],"A-")) c[i].point=1;
if(Have(s[c[i].n][0],"2-")) c[i].point=2;
if(Have(s[c[i].n][0],"3-")) c[i].point=3;
if(Have(s[c[i].n][0],"4-")) c[i].point=4;
if(Have(s[c[i].n][0],"5-")) c[i].point=5;
if(Have(s[c[i].n][0],"6-")) c[i].point=6;
if(Have(s[c[i].n][0],"7-")) c[i].point=7;
if(Have(s[c[i].n][0],"8-")) c[i].point=8;
if(Have(s[c[i].n][0],"9-")) c[i].point=9;
if(Have(s[c[i].n][0],"10-")) c[i].point=10;
if(Have(s[c[i].n][0],"J-")) c[i].point=11;
if(Have(s[c[i].n][0],"Q-")) c[i].point=12;
if(Have(s[c[i].n][0],"K-")) c[i].point=13;
strcpy(c[i].material,"");
strcpy(c[i].seal,"");
}
for(int i=53;i<=Cardnum;i++)
{
c[i].Life=0;
c[i].Used=0;
c[i].n=0;
c[i].color=0;
strcpy(c[i].material,"");
strcpy(c[i].seal,"");
}
Cardnum=NotUsedCardnum=52;
memset(JOKER,0,sizeof(JOKER));memset(OUTCARD,0,sizeof(OUTCARD));memset(HANDCARD,0,sizeof(HANDCARD));memset(SKILLCARD,0,sizeof(SKILLCARD));
JOKERnum=SKILLCARDnum=1;OUTCARDnum=HANDCARDnum=0;JOKER[0]=0;SKILLCARD[0]=0;
HANDCARDnumMAX=7,JOKERnumMAX=5,SKILLCARDnumMAX=1;
}
void printAllFrame()
{
printFrame(7,0,0,60,40);
printFrame(7,0,0,60,39);
printFrame(7,0,0,12,39);
printFrame(7,2,2,10,5);//游戏关卡名
printFrame(7,2,17,10,18);Setpos(4,18);cout<<"【牌型倍率】";//倍率查看
printFrame(7,2,38,10,39);Setpos(4,39);cout<<"【返回菜单】";//返回键
printFrame(7,27,23,42,24);Setpos(33,24);cout<<"【 出牌!】";// 出牌
printFrame(7,18,38,30,39);Setpos(23,39);cout<<"【弃牌】";//弃牌
printFrame(7,35,38,43,39);Setpos(36,39);cout<<"【理牌】-按点数";//理牌-点数
printFrame(7,46,38,54,39);Setpos(47,39);cout<<"【理牌】-按花色";//理牌-花色
}
void printStatus()
{
Setpos(2,12);Color(0);
Color(0);if(Score>1e8) printf("Score:【%.3e】 ",Score);else printf("Score:【%.0lf】 ",Score);
Setpos(2,14);Color(1);
if(Blue>1e8) printf("【%.3e】",Blue);else printf("【%.0lf】",Blue);
if(Blue*Red>1e11) Setpos(2,15); Color(4),cout<<" x ";
if(Red>1e8) printf("【%.3e】",Red);else printf("【%.0lf】",Red);
Color(7);
}
void printAll()
{
printStatus();
for(int i=0;i<JOKERnum;i++) printCard(JOKER[i],JOKERplace[0]+i*6,JOKERplace[1],0,0);
if(OUTCARDnum<=5) for(int i=0;i<OUTCARDnum;i++) printCard(OUTCARD[i],OUTCARDplace[0]+i*6,OUTCARDplace[1],0,0); else {float OUTCARDgap=round(84.0/OUTCARDnum*1.0)/2.0-1;for(int i=0;i<OUTCARDnum;i++) printCard(OUTCARD[i],OUTCARDplace[0]+i*OUTCARDgap-1,OUTCARDplace[1],0,0);}
for(int i=0;i<SKILLCARDnum;i++) printCard(SKILLCARD[i],SKILLCARDplace[0]+i*6,SKILLCARDplace[1],0,0);
}
void printHandCard(int consornum,int yy,bool kill)
{
int ynextup=HANDCARDplace[1]-ChoosenCard[consornum+1];int ynextdown=HANDCARDplace[1]-ChoosenCard[consornum+1]+8;
if(!strcmp(Status,"HANDCARD")&&!strcmp(Status2,"RIGHT")&&consornum+1==Consornum) ynextup--,ynextdown--;
int n=c[HANDCARD[consornum-1]].n;
float x=HANDCARDplace[0]+(consornum-1)*HANDCARDgap;int y=HANDCARDplace[1]-ChoosenCard[consornum]-yy;
Color(0);int color=7,ccolor=c[HANDCARD[consornum-1]].color;
if(ccolor==1) color=4;
else if(ccolor==2) color=1;
else if(ccolor==3) color=10;
else if(ccolor==4) color=2;
for(int i=1;i<=9;i++)
{
if(i>1&&!strcmp(c[HANDCARD[consornum-1]].material,"Wild"))
{
if(ccolor==1) color=4;
else if(ccolor==2) color=1;
else if(ccolor==3) color=10;
else if(ccolor==4) color=2;
ccolor%=4;ccolor++;
}
for(int j=0;j<strlen(s[n][i]);j++)
{
if(consornum!=HANDCARDnum&&j>=HANDCARDgap*2.0&&y+i-1>=ynextup&&y+i-1<=ynextdown) continue;
if(kill==1) Setpos(x+j*0.5,y+i),cout<<' ';
else
{
if(i==1||i==9||j==0||j==strlen(s[n][i])-1)
{
if(!strcmp(Status,"HANDCARD")&&!strcmp(Status2,"RIGHT")&&Consornum==consornum) Color(-5);
else if (ChoosenCard[consornum]==1) Color(5);
else Color(0);
}
else Color(color);
Setpos(x+j*0.5,y+i),cout<<s[n][i][j];
}
}
}
}
void Move(){up=dn=lf=rt=0;if(GetAsyncKeyState(VK_UP)&0x8000){if(uplock==0) up=1,uplock=1;} else uplock=0;if(GetAsyncKeyState(VK_DOWN)&0x8000){if(dnlock==0&&up==0)dn=1,dnlock=1;} else dnlock=0; if(GetAsyncKeyState(VK_LEFT)&0x8000) {if(lflock==0) lf=1,lflock=1;} else lflock=0; if(GetAsyncKeyState(VK_RIGHT)&0x8000) {if(rtlock==0&&lf==0) rt=1,rtlock=1;} else rtlock=0; if(kbhit()) {char g=_getch();if(g=='W'||g=='w'&&dn==0) up=1;if(g=='S'||g=='s'&&up==0) dn=1;if(g=='A'||g=='a'&&rt==0) lf=1;if(g=='D'||g=='d'&&lf==0) rt=1;}if(up+dn+lf+rt!=0){strcpy(lastlastStatus,lastStatus);strcpy(lastlastStatus2,lastStatus2);lastlastConsornum=lastConsornum;strcpy(lastStatus,Status);strcpy(lastStatus2,Status2);lastConsornum=Consornum;bool NotMove=0;if(up==1) {if(!strcmp(Status,"JOKER")) NotMove=1;else if(!strcmp(Status2,"RIGHT")){if(!strcmp(Status,"HANDCARD")) strcpy(Status,"POP");else if(!strcmp(Status,"POP")){if(!strcmp(lastlastStatus,"HANDCARD")){if(HANDCARDplace[0]+Consornum*HANDCARDgap<=25) Consornum=1,strcpy(Status,"JOKER");else if(HANDCARDplace[0]+Consornum*HANDCARDgap<=32) Consornum=2,strcpy(Status,"JOKER");else if(HANDCARDplace[0]+Consornum*HANDCARDgap<=37) Consornum=3,strcpy(Status,"JOKER");else if(HANDCARDplace[0]+Consornum*HANDCARDgap<=44) Consornum=4,strcpy(Status,"JOKER");else if(HANDCARDplace[0]+Consornum*HANDCARDgap<=53) Consornum=5,strcpy(Status,"JOKER");else Consornum=1,strcpy(Status,"SKILLCARD");}else if(!strcmp(lastlastStatus,"JOKER")||!strcmp(lastlastStatus,"SKILLCARD")){strcpy(Status,lastlastStatus);Consornum=lastlastConsornum;}else Consornum=4,strcpy(Status,"JOKER");}else if(!strcmp(Status,"DISCARD")||!strcmp(Status,"SORTBYPOINT")||!strcmp(Status,"SORTBYCOLOR")){int midx,mind=100,minn=0;if(!strcmp(Status,"DISCARD")) midx=29;else if(!strcmp(Status,"SORTBYPOINT")) midx=48;else midx=58;for(int i=0;i<HANDCARDnum+1;i++) if(mind>abs(midx-(HANDCARDplace[0]+i*HANDCARDgap))) minn=i,mind=abs(midx-(HANDCARDplace[0]+i*HANDCARDgap));Consornum=minn;strcpy(Status,"HANDCARD");}}else strcpy(Status,"JOKER"),Consornum=1;}else if(dn==1){if(!strcmp(Status,"DISCARD")||!strcmp(Status,"SORTBYPOINT")||!strcmp(Status,"SORTBYCOLOR")) NotMove=1;else if (!strcmp(Status2,"LEFT")&&!strcmp(Status,"HANDCARD")) NotMove=1;else if(!strcmp(Status2,"RIGHT")){if(!strcmp(Status,"POP")){if(!strcmp(lastlastStatus,"HANDCARD")){strcpy(Status,lastlastStatus);Consornum=lastlastConsornum;}else{int midx=39,mind=100,minn=0;if(!strcmp(lastlastStatus,"JOKER")||!strcmp(lastlastStatus,"SKILLCARD")){if(!strcmp(lastlastStatus,"SKILLCARD")) lastlastConsornum+=5;midx=JOKERplace[0]+(lastlastConsornum-1)*8+3;}for(int i=0;i<HANDCARDnum+1;i++) if(mind>abs(midx-(HANDCARDplace[0]+i*HANDCARDgap))) minn=i,mind=abs(midx-(HANDCARDplace[0]+i*HANDCARDgap));Consornum=minn;strcpy(Status,"HANDCARD");}}else if(!strcmp(Status,"SKILLCARD")) strcpy(Status,"POP"),Consornum+=5;else if(!strcmp(Status,"JOKER")) strcpy(Status,"POP");else if(!strcmp(Status,"HANDCARD")){int midx=HANDCARDplace[0]+Consornum*HANDCARDgap;if(midx<=37) strcpy(Status,"DISCARD");else if(midx<=48) strcpy(Status,"SORTBYPOINT");else strcpy(Status,"SORTBYCOLOR");}}else strcpy(Status,"HANDCARD"),Consornum=1;}
if(lf==1){if(!strcmp(Status2,"LEFT")) NotMove=1;else if(!strcmp(Status,"SKILLCARD")&&Consornum==1) strcpy(Status,"JOKER"),Consornum=JOKERnum;else if(!strcmp(Status,"POP")) strcpy(Status2,"LEFT");else if(!strcmp(Status,"DISCARD")) strcpy(Status2,"LEFT");else if(!strcmp(Status,"SORTBYPOINT")) strcpy(Status,"DISCARD");else if(!strcmp(Status,"SORTBYCOLOR")) strcpy(Status,"SORTBYPOINT");else if(!strcmp(Status,"JOKER")&&Consornum==1) strcpy(Status2,"LEFT");else if(!strcmp(Status,"HANDCARD")&&Consornum==1) Consornum=HANDCARDnum;else if(!strcmp(Status2,"RIGHT")) Consornum--;}
else if(rt==1){if(!strcmp(Status2,"RIGHT")&&!strcmp(Status,"SKILLCARD")&&Consornum==SKILLCARDnum) NotMove=1;else if(!strcmp(Status2,"RIGHT")&&!strcmp(Status,"HANDCARD")&&Consornum==HANDCARDnum) Consornum=1;else if(!strcmp(Status2,"RIGHT")&&(!strcmp(Status,"POP")||!strcmp(Status,"SORTBYCOLOR"))) NotMove=1;else if(!strcmp(Status2,"LEFT")) strcpy(Status2,"RIGHT");else if(!strcmp(Status,"JOKER")&&Consornum==JOKERnum) strcpy(Status,"SKILLCARD"),Consornum=1;else if(!strcmp(Status,"DISCARD")) strcpy(Status,"SORTBYPOINT");else if(!strcmp(Status,"SORTBYPOINT")) strcpy(Status,"SORTBYCOLOR");else if(!strcmp(Status2,"RIGHT")) Consornum++;}if(!strcmp(Status2,"RIGHT")) {int LastConsornum=Consornum;if(!strcmp(Status,"JOKER")) Consornum=min(JOKERnum,max(1,Consornum));else if(!strcmp(Status,"HANDCARD")) Consornum=min(HANDCARDnum,max(1,Consornum));else if(!strcmp(Status,"SKILLCARD")) Consornum=min(SKILLCARDnum,max(1,Consornum));}if(NotMove==0){if(!strcmp(lastStatus2,"LEFT")){if(!strcmp(lastStatus,"JOKER")||!strcmp(lastStatus,"POP")) printFrame(7,2,17,10,18),Color(7),Setpos(4,18),cout<<"【牌型倍率】";else printFrame(7,2,38,10,39),Color(7),Setpos(4,39),cout<<"【返回菜单】";}else{if(!strcmp(lastStatus,"JOKER")) printCard(JOKER[(lastConsornum-1)],JOKERplace[0]+(lastConsornum-1)*6,JOKERplace[1]-1,1,1),printCard(JOKER[(lastConsornum-1)],JOKERplace[0]+(lastConsornum-1)*6,JOKERplace[1],0,0);else if(!strcmp(lastStatus,"HANDCARD"))printHandCard(lastConsornum,1,1),printHandCard(lastConsornum,0,0);else if(!strcmp(lastStatus,"SKILLCARD")) printCard(SKILLCARD[(lastConsornum-1)],SKILLCARDplace[0]+(lastConsornum-1)*6,SKILLCARDplace[1]-1,1,1), printCard(SKILLCARD[(lastConsornum-1)],SKILLCARDplace[0]+(lastConsornum-1)*6,SKILLCARDplace[1],0,0);else if(!strcmp(lastStatus,"POP")) printFrame(7,27,23,42,24),Setpos(33,24),Color(7),cout<<"【 出牌!】"; else if(!strcmp(lastStatus,"DISCARD")) printFrame(7,18,38,30,39),Setpos(23,39),Color(7),cout<<"【弃牌】";else if(!strcmp(lastStatus,"SORTBYPOINT")) printFrame(7,35,38,43,39),Setpos(36,39),Color(7),cout<<"【理牌】-按点数";else if(!strcmp(lastStatus,"SORTBYCOLOR")) printFrame(7,46,38,54,39),Setpos(47,39),Color(7),cout<<"【理牌】-按花色";}if(!strcmp(Status2,"RIGHT")){if(!strcmp(Status,"JOKER")) printCard(JOKER[(Consornum-1)],JOKERplace[0]+(Consornum-1)*6,JOKERplace[1],1,0);else if(!strcmp(Status,"HANDCARD"))printHandCard(Consornum,0,1);else if(!strcmp(Status,"SKILLCARD")) printCard(SKILLCARD[(Consornum-1)],SKILLCARDplace[0]+(Consornum-1)*6,SKILLCARDplace[1],1,0);}if(!strcmp(Status2,"LEFT")){if(!strcmp(Status,"JOKER")||!strcmp(Status,"POP")) printFrame(-5,2,17,10,18),Color(5),Setpos(4,18),cout<<"【牌型倍率】";else printFrame(-5,2,38,10,39),Color(5),Setpos(4,39),cout<<"【返回菜单】";}else{if(!strcmp(Status,"JOKER")) printCard(JOKER[(Consornum-1)],JOKERplace[0]+(Consornum-1)*6,JOKERplace[1]-1,0,1);
else if(!strcmp(Status,"HANDCARD")){printHandCard(Consornum,1,0);if(Consornum>1) printHandCard(Consornum-1,0,0);if(ChoosenCard[lastlastConsornum]==1&&lastlastConsornum!=Consornum) printHandCard(lastlastConsornum,0,0);}else if(!strcmp(Status,"SKILLCARD")) printCard(SKILLCARD[(Consornum-1)],SKILLCARDplace[0]+(Consornum-1)*6,SKILLCARDplace[1]-1,0,1);else if(!strcmp(Status,"POP")) printFrame(-5,27,23,42,24),Setpos(33,24),Color(5),cout<<"【 出牌!】";else if(!strcmp(Status,"DISCARD")) printFrame(-5,18,38,30,39),Setpos(23,39),Color(5),cout<<"【弃牌】";else if(!strcmp(Status,"SORTBYPOINT")) printFrame(-5,35,38,43,39),Setpos(36,39),Color(5),cout<<"【理牌】-按点数";else if(!strcmp(Status,"SORTBYCOLOR")) printFrame(-5,46,38,54,39),Setpos(47,39),Color(5),cout<<"【理牌】-按花色";}}}}
bool ToMenu=0;
void Choose()
{
int space=0;
if((GetAsyncKeyState(VK_RETURN)&0x8000||GetAsyncKeyState(VK_SPACE)&0x8000)) {if(spacelock==0) space=1,spacelock=1;} else spacelock=0;
if(space==1)
{
if((!strcmp(Status,"JOKER")||!strcmp(Status,"POP"))&&!strcmp(Status2,"LEFT"))
{
if(TipsOn==false) Color(5),printTips(0); else {if(Dienum==0) Color(0),printTips(1);else ClearTips();}TipsOn=!TipsOn;
}
else if(!strcmp(Status2,"LEFT"))
{
if(DiscardNum!=0||level>1||PopNum!=0)
{
Setpos(20,17);Color(3);cout<<"---------------#【 返回菜单?(y/n)】#---------------";
B:char a=_getch();if(a!='y'&&a!='Y'&&a!='n'&&a!='N') {goto B;}
if(a=='y'||a=='Y') {Dienum++;ToMenu=1;return;} else Setpos(20,17),Color(0),cout<<" ";
}
else {ToMenu=1;return;}
}
if(!strcmp(Status,"HANDCARD")&&!strcmp(Status2,"RIGHT"))
{
printHandCard(Consornum,1,1);
ChoosenCard[Consornum]=!ChoosenCard[Consornum];
if(Consornum>1) printHandCard(Consornum-1,0,0);
printHandCard(Consornum,1,0);
if(Consornum<HANDCARDnum) printHandCard(Consornum+1,0,0);
//预显示牌型
if(ChoosenCard[Consornum]==1)
{
NumCard[c[HANDCARD[Consornum-1]].point]++;if(strcmp(c[HANDCARD[Consornum-1]].material,"Wild")) ColorCard[c[HANDCARD[Consornum-1]].color]++;Choosennum++;
}
else
{
NumCard[c[HANDCARD[Consornum-1]].point]--;if(strcmp(c[HANDCARD[Consornum-1]].material,"Wild")) ColorCard[c[HANDCARD[Consornum-1]].color]--;Choosennum--;
}
two2=two3=three2=two=three=four=five=link=colornum=0;
for(int i=1;i<=13;i++)
{
if(NumCard[i]==2&&two2!=0) two3=i;
else if(NumCard[i]==2&&two!=0) two2=i;
else if(NumCard[i]==2) two=i;
if(NumCard[i]==3&&three!=0) three2=i;
else if(NumCard[i]==3) three=i;
if(NumCard[i]==4) four=i;
if(NumCard[i]==5) five=i;
}
int linkmax=0;
for(int i=1;i<=13;i++){if(i<13&&NumCard[i]>0&&NumCard[i+1]>0) link++,linkmax=max(link,linkmax);else if(i==13&&NumCard[i]>0&&NumCard[1]>0) link++,linkmax=max(link,linkmax);else link=0;}link=linkmax;
for(int i=1;i<=4;i++)
{
if(ColorCard[i]>0) colornum++;
}
if(Choosennum>0)
{
CheckType();
Setpos(30,11);Color(3),cout<<Type<<" ";Color(1),cout<<"初始倍率 "<<Blue;Color(4);cout<<" x "<<Red<<" ";
}
else Setpos(30,11),Color(0),cout<<" ";
}
if(!strcmp(Status,"POP")&&!strcmp(Status2,"RIGHT"))
{
if(Choosennum==0) return;
if(!strcmp(Type,"顺子")||!strcmp(Type,"同花顺")||!strcmp(Type,"同花")) Pop();
else if((Have(Type,"三对")||Have(Type,"三连对")||Have(Type,"四带二")||Have(Type,"飞机"))&&Choosennum<=6) Pop();
else if(Choosennum<=5) Pop();
if(Score>=AimScore) return;
}
if((!strcmp(Status,"DISCARD")||!strcmp(Status,"SORTBYCOLOR")||!strcmp(Status,"SORTBYPOINT"))&&!strcmp(Status2,"RIGHT"))
{
if(!strcmp(Status,"DISCARD"))
{
if(Choosennum==0) return;
if(Choosennum==HANDCARDnum&&NotUsedCardnum==0) return;
Discard();
}
else if(!strcmp(Status,"SORTBYCOLOR")) SortByColor();
else if(!strcmp(Status,"SORTBYPOINT")) SortByPoint();
}
}
}
void Menu(){Color(0); Setpos(2,0);cout<<" +----------+"; Sleep(50),Setpos(2,1);cout<<" |Tai |"; Sleep(40),Setpos(2,2);cout<<"+-----------------*#| 小胎牌 |#*-----------------+"; Sleep(30),Setpos(2,3);cout<<"| | iaT| Edition_1.1.1|"; Sleep(20),Setpos(2,4);cout<<"| +----------+ |"; Sleep(20),Setpos(2,5);cout<<"| 作者:胎神大大(摆烂版) |"; Sleep(20),Setpos(2,6);cout<<"| |"; Sleep(10),Setpos(2,7);cout<<"| 规则:通过 打牌 达到相应的分来通关! |"; Sleep(10),Setpos(2,8);cout<<"| |"; Sleep(10),Setpos(2,9);cout<<"| 游戏规则: |"; Sleep(10),Setpos(2,10);cout<<"| 每次可以出或弃掉 5 张牌,弃牌 和 每局结束牌堆剩余牌数 "; Sleep(10),Setpos(2,11);cout<<"| 可以增加【万能花色】牌出现的几率 |";Sleep(10),Setpos(2,12);cout<<"| (顺子,飞机,四带二等稀有牌型出牌限制放宽)";Sleep(10),Setpos(2,13);cout<<"| 牌型解释: |"; Sleep(10),Setpos(2,14);cout<<"| |";Sleep(10),Setpos(2,15);cout<<"| 1.单牌 凑不出其他牌型时,取最高点数的牌计分|";Color(1);Sleep(10),Setpos(2,16);cout<<"| 2.对子 两张相同牌 |";Color(0);Sleep(10),Setpos(2,17);cout<<"| 3.两对 两个对子 |";Sleep(5),Setpos(2,18);cout<<"| 4.连对 两个对子,且点数相连 |";Sleep(10),Setpos(2,19);cout<<"| 5.三对 三个不相互相连的对子 |";Color(1);Sleep(10),Setpos(2,20);cout<<"| 6.三条 三张相同牌 |";Color(0);Sleep(5),Setpos(2,21);cout<<"| 7.三带一 三条带单牌 |";Sleep(5),Setpos(2,22);cout<<"| 8.三带二 三条带一对 |";Color(1);Sleep(5),Setpos(2,23);cout<<"| 9.同花 五张以上相同花色的牌 |";Color(0); Sleep(5),Setpos(2,24);cout<<"| |";Color(5);Sleep(5),Setpos(2,25);cout<<"| 10.顺子 【5x倍率】稀有牌型 五张以上点数相连的单牌,例如 910JQK 或 10JQKA";Sleep(5),Setpos(2,26);cout<<"| 11.三连对 【6x倍率】稀有牌型 三个对子,且点数相连,例如 667788";Sleep(5),Setpos(2,27);cout<<"| 12.飞机 【6x倍率】稀有牌型 两个三条,且点数相连,例如 777888"; Sleep(5),Setpos(2,28);cout<<"| |";Color(4); Sleep(2),Setpos(2,29);cout<<"| 13.炸弹 【7x倍率】 传奇牌型 四张相同牌 |"; Sleep(2),Setpos(2,30);cout<<"| 14.四带二 【7x倍率】 传奇牌型 四张相同牌,带一对牌"; Sleep(2),Setpos(2,31);cout<<"| 15.同花顺 【8x倍率】 传奇牌型 五张以上相同花色的顺子"; Sleep(2),Setpos(2,32);cout<<"| |";Color(0);Sleep(2),Setpos(2,33);cout<<"|越稀有的牌型可得到越多的分;当牌出完时,游戏结束!|"; Sleep(2),Setpos(2,34);cout<<"| |"; Sleep(2),Setpos(2,35);cout<<"+--------*# 【全屏】后 按 y 开始游戏! #*--------+"; A:char a=_getch();if(a!='y'&&a!='Y') {goto A;} system("cls"); }
void Read(){ifstream in("小胎牌存档.in");long long Xx,Yy;int a,b,c,d,e,f,g;in>>a>>b>>c>>d>>e>>f>>g>>Yy;Xx=a*2+b*3+c*5+d*7+e*11+f*13+g*17;if(Yy==Xx) MaxMaxSumScore=a,MaxMaxAllScore=b,MaxMaxOnceScore=c,PlayTurnNum=d,MaxMaxLevel=e,MaxMaxTime=f,WinTurnNum=g;in.close();}
void Save(){ofstream out("小胎牌存档.in");long long Xx,Yy;int a,b,c,d,e,f,g;a=MaxMaxSumScore,b=MaxMaxAllScore,c=MaxMaxOnceScore,d=PlayTurnNum,e=MaxMaxLevel,f=MaxMaxTime,g=WinTurnNum;Xx=a*2+b*3+c*5+d*7+e*11+f*13+g*17;out<<' '<<a<<' '<<b<<' '<<c<<' '<<d<<' '<<e<<' '<<f<<' '<<g<<' '<<Xx;out.close();}
void CountEnd()
{
Setpos(23,12);Slow("本轮时长: ");int timeL=(clock()-StartTime)/1000;printf("%d分%d秒",timeL/60,timeL%60);Sleep(50);MaxTime=timeL;
Setpos(23,13);Slow("通关局数: ");printf("%d 关",level-1);Sleep(50);MaxLevel=level-1;
Setpos(23,15);Slow("总分: ");printf("%.0lf",MaxSumScore);Sleep(50);
Setpos(23,16);Slow("单局最高分数:");printf("%.0lf",MaxAllScore);Sleep(50);
Setpos(23,17);Slow("最高单次出牌得分:");printf("%d",MaxOnceScore);Sleep(50);
Setpos(28,18);Slow("(该次使用牌型:");if(MaxOnceScore!=0) printf("%s)",MaxOnceType);else Slow("无)");Sleep(50);
Setpos(25,19);Slow("出牌次数: ");printf("%d",PopNum);Sleep(50);
Setpos(25,20);Slow("弃牌张数: ");printf("%d 张",DiscardNum);Sleep(50);
Setpos(25,21);Slow("[稀有] 牌型出牌次数: ");printf("%d",PopNice);Sleep(50);
Setpos(24,22);Slow(" 【传奇】牌型出牌次数: ");printf("%d",PopLegend);Sleep(50);
Setpos(25,23);Slow("[万能花色] 获得张数: ");printf("%d 张",Wildnum);Sleep(50);
Setpos(23,25);Slow("最常用牌型: ");Sleep(50);
int maxtt=0,maxtti=0;
for(int i=20;i>=1;i--) if(MaxType[i]>maxtt) maxtt=MaxType[i],maxtti=i;
if(maxtti==15)Slow("同花顺");
else if(maxtti==14)Slow("顺子");
else if(maxtti==13)Slow("同花");
else if(maxtti==18)Slow("五条");
else if(maxtti==12)Slow("四带二");
else if(maxtti==11)Slow("炸弹");
else if(maxtti==10)Slow("飞机");
else if(maxtti==9)Slow("三带二");
else if(maxtti==8)Slow("三条");
else if(maxtti==7)Slow("三带一");
else if(maxtti==6)Slow("三连对");
else if(maxtti==5)Slow("三对");
else if(maxtti==4)Slow("连对");
else if(maxtti==3)Slow("两对");
else if(maxtti==2)Slow("对子");
else if(maxtti==1)Slow("单牌");
else Slow("无");
MaxMaxSumScore=max(MaxSumScore,MaxMaxSumScore); MaxMaxAllScore=max(MaxAllScore,MaxMaxAllScore); MaxMaxOnceScore=max(MaxOnceScore,MaxMaxOnceScore); MaxMaxLevel=max(MaxLevel,MaxMaxLevel);MaxMaxTime=max(MaxTime,MaxMaxTime);
Save();
}
void CountEnd2()
{
Setpos(23,27);Slow("游玩总轮数: ");printf("%d 轮",PlayTurnNum);if(WinTurnNum!=0) Slow(" (胜利轮次:"),printf("%d 次)",WinTurnNum);Sleep(50);
Setpos(23,28);Slow("最高通关局数: ");printf("%d 关",MaxMaxLevel);if(MaxMaxLevel==MaxLevel&&PlayTurnNum>1) Slow(" (破纪录!)");Sleep(50);
Setpos(23,29);Slow("最高单局时长: ");printf("%d分%d秒",MaxMaxTime/60,MaxMaxTime%60);if(MaxMaxTime==MaxTime&&PlayTurnNum>1) Slow(" (破纪录!)");Sleep(50);
Setpos(23,30);Slow("历史最高总分: ");printf("%.0lf",MaxMaxSumScore);if(MaxMaxSumScore==MaxSumScore&&PlayTurnNum>1) Slow(" (破纪录!)");Sleep(50);
Setpos(23,31);Slow("历史单局最高分数: ");printf("%.0lf",MaxMaxAllScore);if(MaxMaxAllScore==MaxAllScore&&PlayTurnNum>1) Slow(" (破纪录!)");Sleep(50);
Setpos(23,32);Slow("历史最高单次出牌得分:");printf("%d",MaxMaxOnceScore);if(MaxMaxOnceScore==MaxOnceScore&&PlayTurnNum>1) Slow(" (破纪录!)");
Sleep(70);Setpos(23,34);system("pause");
Sleep(1000);
}
int main()
{
CONSOLE_CURSOR_INFO cursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);srand((unsigned)time(NULL));Read();
S: system("cls");
Menu();strcpy(Status,"POP"),strcpy(Status2,"RIGHT");
printAllFrame();
printFrame(-5,27,23,42,24);Setpos(33,24);Color(5);cout<<"【 出牌!】";
InitializationCard();
GiveHandCard();
StartLevel();
printAll();
if(Dienum==0) printTips(1);
while(1)
{
while(Score<AimScore&&HANDCARDnum+NotUsedCardnum>0&&ToMenu==0)
{
Move();
Choose();
}
if(ToMenu==1)
{
if(level>1) Color(-9),CountEnd(),Sleep(1000),PlayTurnNum++,Color(7);break;
}
if(Score>=AimScore)
{
system("color 6E");Sleep(1000);
level++;
if(level%8==1)
{WinTurnNum++;
Setpos(23,8);Color(5);Slow2(" 你 已 赢 得 游 戏 !!! (连胜8回合!牛逼!!)");Setpos(25,12);Slow("还想继续挑战更高分吗?(y/n)");
A:char a=_getch();if(a!='y'&&a!='Y'&&a!='n'&&a!='N') {goto A;}
if(a=='n'||a=='N') {PlayTurnNum++;Color(5);Setpos(25,12);Slow(" ");Color(5);CountEnd();CountEnd2();Color(7);break;}
}
ReturnCard();
}
else
{PlayTurnNum++;
system("color 7C");Sleep(1000);Setpos(0,0);
Setpos(23,10);Color(9);
int r=rand()%22;if(r==0) Slow2("也 许 重 力 消 消 乐 更 适 合 你 的 节 奏 … … ");else if(r==1) Slow2("你 失 败 了 , 哦 我 可 怜 的 孩 子 … … ");else if(r==2) Slow2("你 失 败 了 , 你 又 回 到 了 熟 悉 的 快~ 乐~ 老~ 家~ … … ");else if(r==3) Slow2("是 的 是 的 , 我 要 奖 励 你 , 神 级 胎 神 之 光 … … ");else if(r==4) Slow2("哎 呀 呀 你 在 收 集 胎 神 语 录 呢 , 多 么 伟 大 … … ");else if(r==5) Slow2("此 句 纪 念 伟 大 的 打 表 神 教 , 它 不 惧 艰 难 … … ");else if(r==6) Slow2("差 一 点 点 , 哦 我 可 怜 的 孩 子 … … ");else if(r==7) Slow2("噔 噔 咚 * 你 又 失 败 了 * 但 是 你 充 满 了 决 心 … … ");else if(r==8) Slow2("你 失 败 了 … … 而 且 等 待 胎 神 更 新 的 日 子 是 如 此 的 漫 长 … … ");else if(r==9) Slow2("也 许 弹 弹 乐 更 适 合 你 的 节 奏 … … ");else if(r==10) Slow2("也 许 愤 怒 的 小 胎 更 适 合 你 的 节 奏 … … ");else if(r==11) Slow2("为 何 不 去 跑 步 你 知 道 锻 炼 身 体 总 是 好 的 … … ");else if(r==12) Slow2("哦 … … 也 许 这 对 你 来 说 太 难 了 孩 子 … … ");else if(r==13) Slow2("比 起 听 我 说 话 为 何 不 重 开 一 次 呢 … … ");else if(r==14) Slow2("你 已 经 很 努 力 了 但 大 家 都 知 道 菜 就 多 练 … … ");else if(r==15) Slow2("哦 你 打 了 我 的 游 戏 这 感 觉 真 棒 … … ");else if(r==16) Slow2("是 的 是 的 你 得 到 了 伟 大 的 精 神 奖 励 也 就 是 这 句 话 … … ");else if(r==17) Slow2("别 再 凑 同 花 大 牌 了 小 兄 弟 你 是 非 酋 … … ");else if(r==18) Slow2("多 么 简 单 就 像 砍 虎 先 锋 一 样 … … ");else if(r==19) Slow2("也 许 愤 怒 的 小 胎 更 适 合 你 的 节 奏 … … ");else if(r==20) Slow2("也 许 去 当 忍 者 跑 跑 步 更 适 合 你 的 节 奏 … … ");else Slow2("也 许 快 刀 切 水 果 更 适 合 你 的 节 奏 … … ");
CountEnd();CountEnd2();
InitializationCard();Dienum++;
}
if(ToMenu==1) break;
system("color 0F");
system("cls");
printAllFrame();
printAll();
printFrame(-5,27,23,42,24);Setpos(33,24);Color(5);cout<<"【 出牌!】";
GiveHandCard();
StartLevel();
}
ToMenu=0;
goto S;
return 0;
}
void Color(int a){
if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
if(a==9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
if(a==-9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
if(a==10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN);//木
if(a==11) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
if(a==-5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE);
}
附压行专用代码
(使用方法:回车加感叹号加回车结束输入,然后原地找TXT,自动消注释)
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[10000];
ofstream out("压行结果.txt");
while(a[0]!='!')
{
gets(a);
if(a[0]=='!') break;
for(int i=0;i<strlen(a);i++)
{
if(a[i]=='/'&&i!=strlen(a)-1&&a[i+1]=='/') break;
if(a[i]!=' ') out<<a[i];
}
}
out.close();
}