代码其实还可以精简一下……
(话说这个游戏的名字是我自己起的,请问它有什么更好的名字吗?)
#include<iostream>
#include<stdlib.h>
using namespace std;
void doaddme(int me,int pc);
void doaddpc(int me,int pc);
int doaddpcm(int me,int pc);
int dochoice(int i);
void dofinal(int i,int me,int pc);
int num[5]={1,1,1,1,1};
int choice[5]={0,0,0,0,0};
int choicemap[10]={0,0,3,1,3,2,4,1,4,2};
int j;
int main(void){
int me,pc,i,player_nz=0,comp_nz=0;
int rdm_a,rdm_b;
for(;;){
player_nz=0,comp_nz=0;
for(i=1;i<=4;i++){
num[i]=1;
}
cout<<"手指加数游戏——by 0118"<<endl;
cout<<"说明:"<<endl;
cout<<"输入两个1或2,用空格分隔,按回车键确认。"<<endl;
cout<<"玩家先手。"<<endl;
cout<<endl;
cout<<"开始新的一局……"<<endl;
cout<<" 1 1 1 1 请输入: ";
for(;;){
rdm_a=0,rdm_b=0;
for(;;){
i=1;
cin>>me>>pc;
if(me!=1&&me!=2){
i=0;
}else if(pc!=1&&pc!=2){
i=0;
}else if(num[me]==0||num[pc+2]==0){
i=0;
}
if(i==0){
cout<<"无效,请重新输入: ";
continue;
}
break;
}
pc+=2;
doaddme(me,pc);
if(num[1]==0&&num[2]==0){
cout<<"你赢了!";
break;
}
for(i=1;i<=4;i++){
choice[i]=1;
}
if(num[3]+num[1]+num[1]==10||num[3]+num[1]+num[1]==20){
choice[1]=3;
}
if(num[3]+num[1]+num[2]==10||num[3]+num[1]+num[2]==20){
choice[1]=3;
choice[2]=3;
}
if(num[3]+num[2]+num[2]==10||num[3]+num[2]+num[2]==20){
choice[2]=3;
}
if(num[4]+num[1]+num[1]==10||num[4]+num[1]+num[1]==20){
choice[3]=3;
}
if(num[4]+num[1]+num[2]==10||num[4]+num[1]+num[2]==20){
choice[3]=3;
choice[4]=3;
}
if(num[4]+num[2]+num[2]==10||num[4]+num[2]+num[2]==20){
choice[4]=3;
}
if(num[1]==0){
choice[1]=0;
choice[3]=0;
player_nz=2;
}
if(num[2]==0){
choice[2]=0;
choice[4]=0;
player_nz=1;
}
if(num[3]==0){
choice[1]=0;
choice[2]=0;
comp_nz=4;
}
if(num[4]==0){
choice[3]=0;
choice[4]=0;
comp_nz=3;
}
if(player_nz!=0&&comp_nz!=0){
dofinal(0,player_nz,comp_nz);
break;
}
if(num[3]+num[1]==10){
choice[1]=2;
}
if(num[3]+num[2]==10){
choice[2]=2;
}
if(num[4]+num[1]==10){
choice[3]=2;
}
if(num[4]+num[2]==10){
choice[4]=2;
}
for(i=1;i<=4;i++){
if(choice[i]==2){
rdm_a=dochoice(i);
if(rdm_a==1){
rdm_b=2;
break;
}
rdm_b=1;
}
}
if(rdm_b==1){
continue;
}else if(rdm_b==2){
break;
}
rdm_b=0;
for(i=1;i<=4;i++){
if(choice[i]==1){
rdm_a++;
rdm_b=i;
}
}
if(rdm_a==1){
j=dochoice(rdm_b);
}else if(rdm_a==0){
for(;;){
rdm_b=(rand()%(4))+1; //为了简单直接用rand(),不是很理想,一开始是准备用随机数表的
if(choice[rdm_b]==3){
j=dochoice(rdm_b);
break;
}
}
}else{
for(;;){
rdm_b=(rand()%(4))+1;
if(choice[rdm_b]==1){
j=dochoice(rdm_b);
break;
}
}
}
if(j==1){
break;
}
}
cout<<endl;
for(;;){
cout<<"再来一局?(1Y/2N) ";
cin>>i;
if(i==2){
return 0;
}else if(i==1){
break;
}else{
cout<<"无效"<<endl;
}
cout<<endl;
}
}
}
void doaddme(int me,int pc){
int i;
for(i=1;i<me;i++){
cout<<" ";
}
cout<<"├─";
i++;
for(;i<pc;i++){
cout<<"──";
}
cout<<"┘"<<endl;
for(i=1;i<me;i++){
cout<<" ";
}
cout<<"↓"<<endl;
num[me]+=num[pc];
if(num[me]>=10){
num[me]-=10;
}
for(i=1;i<=4;i++){
cout<<" "<<num[i]<<" ";
}
return;
}
void doaddpc(int me,int pc){
cout<<endl;
int i;
for(i=1;i<me;i++){
cout<<" ";
}
cout<<"└─";
i++;
for(;i<pc;i++){
cout<<"──";
}
cout<<"┤"<<endl;
for(i=1;i<pc;i++){
cout<<" ";
}
cout<<"↓"<<endl;
num[pc]+=num[me];
if(num[pc]>=10){
num[pc]-=10;
}
for(i=1;i<=4;i++){
cout<<" "<<num[i]<<" ";
}
return;
}
int doaddpcm(int me,int pc){
doaddpc(me,pc);
if(num[3]==0&&num[4]==0){
cout<<endl;
cout<<"你输了!";
return 1;
}
me=0,pc=0;
if(num[1]==0){
me=2;
}
if(num[2]==0){
me=1;
}
if(num[3]==0){
pc=4;
}
if(num[4]==0){
pc=3;
}
if(me!=0&&pc!=0){
dofinal(1,me,pc);
return 1;
}
cout<<" 请输入: ";
return 0;
}
int dochoice(int i){
cout<<" C"<<i;
for(j=1;j<=4;j++){
cout<<" C"<<j<<":"<<choice[j];
}
i*=2;
j=doaddpcm(choicemap[i+1],choicemap[i]);
return j;
}
void dofinal(int i,int me,int pc){
cout<<"进入死斗模式……";
system("pause");
if(i==1){
cout<<endl;
doaddme(me,pc);
if(num[me]==0){
cout<<endl;
cout<<"你赢了!";
return;
}
}
for(;;){
for(i=0;i<20;i++){
doaddpc(me,pc);
if(num[pc]==0){
cout<<endl;
cout<<"你输了!";
return;
}
cout<<endl;
doaddme(me,pc);
if(num[me]==0){
cout<<endl;
cout<<"你赢了!";
return;
}
}
for(;;){
cout<<"已继续进行20回合,可能是平局。是否继续?(1Y/2N) ";
cin>>i;
if(i==2){
cout<<"本局游戏结束……";
return;
}else if(i==1){
break;
}else{
cout<<"无效"<<endl;
}
cout<<endl;
}
}
}