C++实现骗子酒馆

目前实现的功能:

功能:
1.每牌库中一共有4种卡牌 
2.每一回合随机发牌,每人五张
3.按照人数轮流出牌
4.每一次出牌,下家可以质疑,如果质疑成功本家惩罚,否则,下家惩罚。
5.直到剩下最后一个人的时候游戏结束 

我还没有写每一局随机指定的卡牌。
代码如下:

#include<bits/stdc++.h>
#include <windows.h>

using namespace std;

bool IsTrue, GameOver = false;
int WitchCard = 3;

typedef struct P{
	int LasterNumber = 3;
	int Card[6];
	int LastCard;
}Player; 

int Play(vector<Player> &P, int x)
{
	IsTrue = true;
	system("cls");
	printf("玩家%d\n", x + 1); 
	int n = 0;
	for( int i = 1; i <= 5; i++ )
	{
		cout << i << ".  " << P[x].Card[i] << endl;
	}
	printf("输出要打出的手牌序号(0结束):\n");
	int t;
	//getchar();
	while(true)
	{
		cin >> t;
		if(!t) break;
		if(P[x].Card[t])
		{
			n += 1;
			if(P[x].Card[t] != WitchCard) IsTrue = false;
			P[x].Card[t] = 0;
			P[x].LastCard -= 1;
		}
	}
	return n;
} 

bool Punishment(vector<Player> &P, int x)
{
	int t = rand() % P[x].LasterNumber;
	if(!t)
	{
		printf("玩家%d死了", (x + 1));
		getchar();
		return true;
	}else
	{
		printf("玩家%d没有死", (x + 1));
		getchar(); 
		P[x].LasterNumber -= 1;
	}
	return false;
}

int main()
{
	while(true)
	{
		vector<Player> Players;
		int IsFirst = true; 
		bool set[10];
		memset(set, false, sizeof(set));
		system("cls");
		printf("酒馆游戏\n");
		printf("请选择是否开始游戏:\n");
		printf("1.开始\n");
		printf("2.退出\n");
		int tem;
		scanf("%d", &tem);
		if(tem == 2) break;
		system("cls");
		GameOver = false;
		printf("酒馆游戏\n");
		printf("请输入游戏人数(2--4):\n");
		int number;
		cin >> number;
		system("cls");
		printf("酒馆游戏--%d人场\n", number);
		printf("本局牌号为%d", WitchCard);
		getchar();
		getchar();
		for( int i = 0; i < number; i ++ )
		{
			Player player;
			player.	LastCard = 5;
			for( int j = 1; j <= 5; j ++ )
			{
				srand(static_cast<unsigned int>(time(0)));
				player.	Card[j] = rand() % 6 + 1;
			}
			Players.push_back(player);
		}
		int last, last_number;
		while(true)
		{
			for( int i = 0; i < Players.size(); i ++ )
			{
				system("cls");
				if(!set[i])
				{
					printf("玩家%d\n", i + 1);
					if(!IsFirst)
					{
						printf("%d号玩家打出%d张\n", last, last_number);
						printf("是否质疑\n");
						printf("1.质疑\n");
						printf("2.不质疑\n");
						int z;
						cin >> z;
						if(z == 2)
						{
							if(Players[last - 1].LastCard == 0)
							{
								printf("%d玩家胜利\n", last);
								GameOver = true;
								getchar();
								getchar();
								break;
							}
							last_number = Play(Players, i);
							last = i + 1;
							continue;
						}else
						{
							if(!IsTrue) {
								printf("质疑成功!!\n");
								getchar();
								set[last - 1] = Punishment(Players, last - 1);
								if(set[last - 1]) number -= 1;
							}
							else {
								printf("质疑失败!!\n");
								getchar();
								set[i] = Punishment(Players, i);
								if(set[i]) number -= 1;
							}
							if(number == 1) break;
							if(!set[i])
							{
								last_number = Play(Players, i);
								last = i + 1;
							}else
							{
								IsFirst = true;
							}
						}
					}else
					{
						last_number = Play(Players, i);
						last = i + 1;
						IsFirst = false;
					}
				}
			}
			if(number == 1)
			{
				for( int i = 0; i < Players.size(); i ++ )
				{
					if(!set[i])
					{
						printf("玩家%d胜利\n", i + 1);
						getchar();
						GameOver = true; 
					}
				}
			}
			if(GameOver) break;
		}
	}
	
	return 0;
}

仅供参考~~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐