C++小游戏:手指加数游戏

代码其实还可以精简一下……

(话说这个游戏的名字是我自己起的,请问它有什么更好的名字吗?)

#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;
		}
	}
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值