描述 石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。 一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多? 输入 输入包含三行。 第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。 第二行包含NA个整数,表示小A出拳的规律。 第三行包含NB个整数,表示小B出拳的规律。 其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。 输出 输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。 用python
时间: 2023-06-19 20:05:14 浏览: 257
```
N, NA, NB = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
win_rules = [[0, 2], [2, 5], [5, 0]] # 胜利的规则
score_A, score_B = 0, 0 # 记录分数
for i in range(N):
a = A[i % NA] # 取小A出拳的规律
b = B[i % NB] # 取小B出拳的规律
if [a, b] in win_rules: # 判断小A胜利的情况
score_A += 1
elif [b, a] in win_rules: # 判断小B胜利的情况
score_B += 1
if score_A > score_B:
print("A")
elif score_A < score_B:
print("B")
else:
print("draw")
```
相关问题
用python实现:学生挑选倒垃圾人选的策略为:黑白配和石头剪刀布猜拳选出。遵循以下规则: 工、在人数多于4个人的时候,使用黑白配猜拳方式,即每人每次猜拳时出手心(白) 和手背(黑,两种方式,每次猜拳后,人数少的一方不参与下一轮猜拳。人数多的一方继续进行。 二、在猜拳人数为4人的时候,随机两两进行石头剪刀布的猜拳,如果有2个垃圾桶需要清理,则输的两个人一人一个去倒垃圾,如果只有1个垃圾桶需要清理,则第一轮输的两个人继续进行石头剪刀布的猜拳,最后输的那一个人去清理垃圾桶。 3、在猜拳人数为了人的时候,继续进行黑白配的猜拳,剩下2 人后,如果有2个垃圾桶需要清理,则两个人一人一个去倒垃圾,如果只有1个垃圾桶需要清理,则剩下两个人继续进行石头剪刀布的猜拳,最后输的那一个人去清理垃圾桶。
以下是实现代码:
```python
import random
def black_white_fist(players):
"""
黑白配猜拳
"""
white = '手心'
black = '手背'
while len(players) > 1:
fists = []
for player in players:
if len(player) > 1:
# 工
choice = input(f"{player}请出拳('手心'或'手背'):")
while choice not in [white, black]:
choice = input(f"无效的选择,请重新出拳('手心'或'手背'):")
fists.append(choice)
else:
# 剩下的人不再猜拳
fists.append(None)
if len(fists) != len(set(fists)):
# 出现相同的拳,继续猜拳
print("平局,继续出拳!")
else:
# 比较结果,淘汰一方
win_fist = white if fists.count(black) > fists.count(white) else black
lose_player = [player for index, player in enumerate(players) if fists[index] != win_fist][0]
print(f"{win_fist}胜利,{lose_player}被淘汰!")
players.remove(lose_player)
print(f"{players[0]}胜利!")
def rock_scissors_paper(players, trash_cans):
"""
石头剪刀布猜拳
"""
while len(players) > 1:
pairs = random.sample(players, 2)
print(f"{pairs[0]}和{pairs[1]}进行石头剪刀布猜拳:")
choice1 = input(f"{pairs[0]}请出拳('石头'、'剪刀'或'布'):")
while choice1 not in ['石头', '剪刀', '布']:
choice1 = input(f"无效的选择,请重新出拳('石头'、'剪刀'或'布'):")
choice2 = input(f"{pairs[1]}请出拳('石头'、'剪刀'或'布'):")
while choice2 not in ['石头', '剪刀', '布']:
choice2 = input(f"无效的选择,请重新出拳('石头'、'剪刀'或'布'):")
if (choice1 == '石头' and choice2 == '剪刀') or (choice1 == '剪刀' and choice2 == '布') or (choice1 == '布' and choice2 == '石头'):
# pairs[0] 胜利
print(f"{pairs[0]}胜利!")
players.remove(pairs[1])
elif choice1 == choice2:
# 平局,继续猜拳
print("平局,继续猜拳!")
else:
# pairs[1] 胜利
print(f"{pairs[1]}胜利!")
players.remove(pairs[0])
# 挑选倒垃圾的人
if len(trash_cans) == 2:
print(f"{players[0]}和{players[1]}各负责一个垃圾桶!")
else:
while True:
choice1 = input(f"{players[0]}请出拳('石头'、'剪刀'或'布'):")
while choice1 not in ['石头', '剪刀', '布']:
choice1 = input(f"无效的选择,请重新出拳('石头'、'剪刀'或'布'):")
choice2 = input(f"{players[1]}请出拳('石头'、'剪刀'或'布'):")
while choice2 not in ['石头', '剪刀', '布']:
choice2 = input(f"无效的选择,请重新出拳('石头'、'剪刀'或'布'):")
if (choice1 == '石头' and choice2 == '剪刀') or (choice1 == '剪刀' and choice2 == '布') or (choice1 == '布' and choice2 == '石头'):
print(f"{players[1]}胜利,负责倒垃圾!")
break
elif choice1 == choice2:
# 平局,继续猜拳
print("平局,继续猜拳!")
else:
print(f"{players[0]}胜利,负责倒垃圾!")
break
```
调用示例:
```python
players = ['小明', '小红', '小刚', '小李']
trash_cans = ['垃圾桶1', '垃圾桶2']
if len(players) > 4:
black_white_fist(players)
elif len(players) == 4:
rock_scissors_paper(players, trash_cans)
elif len(players) == 3:
players.append("随机选手")
rock_scissors_paper(players, trash_cans)
elif len(players) == 2:
print(f"{players[0]}和{players[1]}各负责一个垃圾桶!")
else:
print("人数不足,无法进行猜拳!")
```
在VS中用C#创建一个简单的窗体应用程序,实现一个用户与计算机的猜拳游戏,石头 剪刀 布,实现三局两胜,用户通过Button组来选择他们的出拳
在Visual Studio (VS) 中用C#创建一个简单的窗体应用程序实现猜拳游戏,步骤如下:
1. **打开Visual Studio**:
打开Visual Studio,选择新建项目,然后在"Windows Forms App (.NET Framework)"类别下,点击"空白项目"。
2. **设计窗体**:
在设计器上添加三个Button控件,分别为“石头”、“剪刀”和“布”,以及一个Label用于显示结果和计分。将Button控件的名称设置为对应的手势,例如"RockBtn"、"ScissorsBtn" 和 "PaperBtn"。
3. **编写事件处理程序**:
双击每个按钮,为它们添加Click事件处理函数。例如,对于"RockBtn_Click",可以编写如下代码:
```csharp
private void RockBtn_Click(object sender, EventArgs e)
{
// 用户出拳为石头
CurrentPlayerChoice = PlayerChoice.Rock;
}
```
同样的,为其他两个按钮编写类似逻辑。`CurrentPlayerChoice`变量用于记录用户的选择。
4. **随机生成计算机选择**:
创建一个随机数生成器,根据一定规则(如0代表石头,1代表剪刀,2代表布)来模拟电脑出拳。
5. **比较并判断胜负**:
游戏循环中,对比用户和计算机的选择,根据规则(石头砸剪刀,剪刀剪布,布包石头)更新分数,并更新结果Label显示。
6. **实现三局两胜**:
设定一个计数器,在每轮结束后检查是否达到两胜标准,如果是,则结束游戏并显示赢家。
7. **增加用户界面反馈**:
当一轮游戏结束时,给胜利方Button加上视觉反馈,比如改变背景颜色。
8. **完成游戏循环**:
在主循环中不断运行游戏,直到达到获胜条件。
```csharp
private int gameCount;
private void StartGame()
{
while (gameCount < 2)
{
// 计算机出拳...
if (UserWins())
{
LabelResult.Text = "恭喜您赢得了比赛!";
break;
}
else if (ComputerWins())
{
LabelResult.Text = "很遗憾,您输了这局。";
}
gameCount++;
}
}
// 检查玩家或电脑是否赢得当前回合
private bool UserWins() { ... }
private bool ComputerWins() { ... }
// 调用StartGame开始游戏
private void Form1_Load(object sender, EventArgs e)
{
StartGame();
}
```
阅读全文