红黑夜法官 c++(缺陷版)

using namespace std;
#include <iostream>
#include <time.h>
#include <string.h>
#include <stdio.h>
 int n,j;//总人数 ,cunzhang
 int red,black;//红黑人数 
 int e=0,e0;//环境,红黑夜 
 int cunzhang=1,count=0;//村长 ,计数器 
///
struct Player{
 	char name[20];
 	int  ID;//0,1==red,black
 	bool cunzhang;//1==yes
 	double ticket_001;//被投的 
 	double ticket_002;//拥有的
	double ticket_003;//被投的 
 	bool life;//0,1==die ,alive
 	int number;//i
 	char words[50];
 	int eye;//1==open ,0==closed
 	void (*chushihua)(void);
    //char (*setname)(char *name);
	//int (*get_ID)(int ID);
	void (*vote_cunzhang)(void);
	void (*vote_cunzhang2)(void);
	void (*vote)(void);
	//bool (*live_die)(*Player a)
	void (*set_environment1)(void);
	void (*set_environment2)(void);
	void (*saysomething)(void);
	void (*saysomethingelse)(void);
	void (*show1)(void);
	void(*show2)(void);
	void (*openyoureyes)(void);
}player[100];

void chushihua(void)
{
	for(int i=0;i<n;i++)
	{
		cout<<"请输入"<<i<<"玩家的游戏昵称:"<<endl;
		cin>>player[i].name;
		player[i].life=1;
		player[i].number=i;
		player[i].cunzhang=0;
		player[i].ticket_001=0;
		player[i].ticket_002=1;
		player[i].ticket_003=0;
        if(red==0) player[i].ID=1;
	      else if(black==0) player[i].ID=0;
	      else {
	    	    player[i].ID=rand()%2;
	    	    if(player[i].ID==0) red--;
	    	    else black--;
		       }//ID
	
    }
}
/*char setname(char *name)
{
	cin>>name;
}*/	
//name
/*int get_ID(int ID)
{
	if(::red==0) ID=1;
	if(::black==0) ID=0;
	ID=rand()%2;
}*///ID
void vote_cunzhang(void)
{
	for(int i=0;i<n;i++)
	{
		if(player[i].life==0) continue;//die
		int t;
		cout<<"请玩家"<<player[i].name<<"选择心仪的村长:"<<endl;
		cin>>t;
		player[t].ticket_001+=1;
	}
	int temp;
	for(int i=0;i<n;i++)
	{
		if(i==0) {
		   temp=player[0].ticket_001;
		   j=0;
		}
		else if(player[i].ticket_001>temp) {
			temp=player[i].ticket_001;
			j=i;
		}
	}//找cunzhang 
	cout<<player[j].name<<"玩家为村长!"<<endl;
	player[j].cunzhang=1;
	if(n%2==0) player[j].ticket_002=1.5;
	else player[j].ticket_002=0.5;//cunzhang的初始化 
	for(int  i=0;i<n;i++) player[i].ticket_001=0;//置零 
}
void saysomething(void)
{
	for(int i=0;i<n;i++)
	{
		if(player[i].life==0) continue;//die , alive 
		cout<<"请玩家"<<player[i].name<<"说一说自己的想法";
		cin>>player[i].words; 
	}//say you want
}
void show1(void)
{
	cout<<"========================="<<endl; 
	for(int i=0;i<n;i++)
	{
		if(player[i].life==0)  break;//die, alive
		cout<<player[i].name<<":  "<<player[i].words<<endl; 
	}
	cout<<"========================="<<endl;
}//show it
void vote(void)
{                     
    for(int i=0;i<n;i++)
	{
		if(player[i].life==0) continue;
		else  {
			cout<<"请"<<player[i].name<<"vote:"<<endl;
			int t;
			cin>>t;
			player[t].ticket_003+=player[i].ticket_002;
		}
	 } 
    int temp=0,k;
	for(int i=0;i<n;i++)
	{
		if(player[i].life==0) continue;
		
	    if(player[i].ticket_003>=temp) {
			temp=player[i].ticket_003;
			k=i;
		}
	}
	player[k].life=0;
	cout<<"======================================"<<endl;
	cout<<player[k].name<<"玩家已死亡!"<<endl;
	if(player[k].ID==0) {
	   red--;
	   cout<<"身份是red"<<endl;
	} 
	else {
		cout<<"身份是black"<<endl;
		black--;
	}
	cout<<"======================================"<<endl;
	if(player[k].cunzhang) 
	{
		cout<<"村长死亡,请重新选举!"<<endl;
		cunzhang=0;
	}
}
void saysomethingelse(void)
{
	
	cout<<"请村长决定发言顺序:(请输入 right 或  left)"<<endl;
	char a[6];
	cin>>a;
	if(strcmp(a,"left")==0)
	{
		int temp1=n,temp2=j;
		while(player[temp2--].life==0)
		{
			if(temp2==-1) temp2=n-1;
		}
		while(temp1--)
		{
			temp2++;
			if(player[temp2].life)	
			{
				cout<<"请玩家"<<player[temp2].name<<"陈述自己的观点:"<<endl;
				cin>>player[temp2].words; 
			}
			if(temp2==n-1) temp2=-1;
		}
		/*if(j==0)
		{
			   cout<<"请"<<player[n-1].name<<"投一票你怀疑的对象:"<<endl;
		       int t;
		       cin>>t;
		       player[t].ticket_003+=1;
			  for(int i=0;i<n-1;i++)
	       {  
		       cout<<"请"<<player[i].name<<"投一票你怀疑的对象:"<<endl;
		       int t;
		       cin>>t;
		       player[t].ticket_003+=1;
	       } 
		}
		for(int i=j-1;i<::n;i++)
	   {  
		  cout<<"请"<<player[i].name<<"投一票你怀疑的对象:"<<endl;
		  int t;
		  cin>>t;
		  player[t].ticket_003+=1;
	   } 
	   for(int i=0;i<j-1;i++)
	   {  
		  cout<<"请"<<player[i].name<<"投一票你怀疑的对象:"<<endl;
		  int t;
		  cin>>t;
		  player[t].ticket_003+=1;
	   }   
	}
	else
	{
		if(j==n-1)
		{
			cout<<"请"<<player[0].name<<"投一票你怀疑的对象:"<<endl;
		    int t;
		    cin>>t;
		    player[t].ticket_003+=1;
		for(int i=n-2;i>=0;i--)
	    {  
		    cout<<"请"<<player[i].name<<"投一票你怀疑的对象:"<<endl;
		    int t;
		    cin>>t;
		    player[t].ticket_003+=1;
	    }  
		}
		else {
			   for(int i=j+1;i>=0;i--)
	          {  
		         cout<<"请"<<player[i].name<<"投一票你怀疑的对象:"<<endl;
		         int t;
		         cin>>t;
		         player[t].ticket_003+=1;
	          }  
	          for(int i=n-1;i>j+1;i--)
	          {  
		         cout<<"请"<<player[i].name<<"投一票你怀疑的对象:"<<endl;
		         int t;
		         cin>>t;
		         player[t].ticket_003+=1;
	          }  
		}*/
	}
	else{
		int temp1=n,temp2=j;
		while(player[temp2++].life==0)
		{
			if(temp2==n) temp2=0;
		}
		while(temp1--)
		{
			temp2--;
			if(player[temp2].life)	
			{
				cout<<"请玩家"<<player[temp2].name<<"陈述自己的观点:"<<endl;
				cin>>player[temp2].words;
			}
			if(temp2==0) temp2=n;
	}
}
/*	for(int i=0;i<::n;i++)
	{
		cout<<"请"<<player[i].name<<"投一票你怀疑的对象:"<<endl;
		int t;
		cin>>t;
		player[t].ticket_003+=1;
	}*/

	
}
void openyoureyes(void)
{
	count=0;
	for(int i=0;i<n;i++)
	{
		if(player[i].life==0) continue;
		cout<<player[i].name<<"是否选择睁眼?(1 or 0)"<<endl;
		int t;
		cin>>t;
		if(t==0) continue;
		else{
			if(e0==0&&player[i].ID==0)
			count++;
			else if(e0==1&&player[i].ID==1)
			count++;
		}
	}
	if(count%2==0) player[j].ticket_002=1;
	else if(n%2==0) player[j].ticket_002=1.5;
	else player[j].ticket_002=0.5;
}
void vote_cunzhang2(void)
{
	for(int i=0;i<n;i++)
	{
		if(player[i].life==0) continue;//die
		int t;
		cout<<"请玩家"<<player[i].name<<"选择心仪的村长:"<<endl;
		cin>>t;
		player[t].ticket_001+=1;
	}
	int temp;
	for(int i=0;i<n;i++)
	{
		if(i==0) {
		   temp=player[0].ticket_001;
		   j=0;
		}
		else if(player[i].ticket_001>temp) {
			temp=player[i].ticket_001;
			j=i;
		}
	}//找cunzhang 
	cout<<player[j].name<<"玩家为村长!"<<endl;
	player[j].cunzhang=1;
	if(count%2==0) player[j].ticket_002=1;
	else if(n%2==0) player[j].ticket_002=1.5;
	else player[j].ticket_002=0.5;//cunzhang的初始化 
	for(int  i=0;i<n;i++) player[i].ticket_001=0;//置零 
}
 
void set_environment1(void)
{
	cout<<"========================================"<<endl;
	if(e0=rand()%2==0) cout<<"进入红夜"<<endl;
	else cout<<"进入黑夜"<<endl;
	cout<<"========================================"<<endl;
}
void set_environment2(void)
{
	cout<<"========================================"<<endl;
	cout<<"进入 白天!"<<endl;
	cout<<"========================================"<<endl;
}
void set_red_black(int n)
{
	
	if(n%2==0)
	{
		red=n/2;
		black=n/2;
	}
	else{
		red=n/2+1;
		black=n/2;
	}
}

/
int main(void)
{   
    int t=0;
	srand((unsigned)time(NULL));
	cout<<"请输入参加游戏的玩家人数:"<<endl;
	cin>>::n;
	set_red_black(n);
	chushihua();
	set_red_black(n);
	vote_cunzhang();
	while((red+black)!=1)
	{
		set_environment1();
	    if(t++==0){
	    	saysomething();
		} 
		else{
			saysomethingelse();
		}
		openyoureyes();
	    vote();
	    if(red&&black==0)
	    {
	    	cout<<"red  win!"<<endl;
	    	break;
		}
		else if(red==0&&black)
		{
			cout<<"balck win!"<<endl;
			break;
		}
	    if(cunzhang==0)
	    {
	    	vote_cunzhang2();
	    	cunzhang=1;
		}
		set_environment2();
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
黑树是一种自平衡的二叉搜索树,它具有以下特性: 1. 每个节点要么是色,要么是黑色。 2. 根节点是黑色。 3. 每个叶子节点(NIL节点,空节点)是黑色。 4. 如果一个节点是色的,则它的两个子节点都是黑色的。 5. 对于每个节点,从该节点到其所有后代叶子节点的简单上,均包含相同数目的黑节点。 下面是一个简单的黑树的C++代码示例: ```cpp #include <iostream> enum Color { RED, BLACK }; struct Node { int data; Color color; Node* left; Node* right; Node* parent; Node(int val) : data(val), color(RED), left(nullptr), right(nullptr), parent(nullptr) {} }; class RedBlackTree { private: Node* root; void rotateLeft(Node* node) { Node* rightChild = node->right; node->right = rightChild->left; if (rightChild->left != nullptr) { rightChild->left->parent = node; } rightChild->parent = node->parent; if (node->parent == nullptr) { root = rightChild; } else if (node == node->parent->left) { node->parent->left = rightChild; } else { node->parent->right = rightChild; } rightChild->left = node; node->parent = rightChild; } void rotateRight(Node* node) { Node* leftChild = node->left; node->left = leftChild->right; if (leftChild->right != nullptr) { leftChild->right->parent = node; } leftChild->parent = node->parent; if (node->parent == nullptr) { root = leftChild; } else if (node == node->parent->left) { node->parent->left = leftChild; } else { node->parent->right = leftChild; } leftChild->right = node; node->parent = leftChild; } void fixInsert(Node* node) { while (node != root && node->parent->color == RED) { if (node->parent == node->parent->parent->left) { Node* uncle = node->parent->parent->right; if (uncle != nullptr && uncle->color == RED) { node->parent->color = BLACK; uncle->color = BLACK; node->parent->parent->color = RED; node = node->parent->parent; } else { if (node == node->parent->right) { node = node->parent; rotateLeft(node); } node->parent->color = BLACK; node->parent->parent->color = RED; rotateRight(node->parent->parent); } } else { Node* uncle = node->parent->parent->left; if (uncle != nullptr && uncle->color == RED) { node->parent->color = BLACK; uncle->color = BLACK; node->parent->parent->color = RED; node = node->parent->parent; } else { if (node == node->parent->left) { node = node->parent; rotateRight(node); } node->parent->color = BLACK; node->parent->parent->color = RED; rotateLeft(node->parent->parent); } } } root->color = BLACK; } public: RedBlackTree() : root(nullptr) {} void insert(int val) { Node* newNode = new Node(val); Node* current = root; Node* parent = nullptr; while (current != nullptr) { parent = current; if (val < current->data) { current = current->left; } else { current = current->right; } } newNode->parent = parent; if (parent == nullptr) { root = newNode; } else if (val < parent->data) { parent->left = newNode; } else { parent->right = newNode; } fixInsert(newNode); } void printInorder(Node* node) { if (node == nullptr) { return; } printInorder(node->left); std::cout << node->data << " "; printInorder(node->right); } void printTree() { printInorder(root); } }; int main() { RedBlackTree tree; tree.insert(7); tree.insert(3); tree.insert(18); tree.insert(10); tree.insert(22); tree.insert(8); tree.insert(11); tree.insert(26); tree.insert(2); tree.insert(6); tree.insert(13); std::cout << "黑树的中序遍历结果为:"; tree.printTree(); std::cout << std::endl; return 0; } ``` 这段代码实现了黑树的插入操作,并输出了中序遍历的结果。你可以根据需要修改代码来实现其他操作,比如删除节点等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值