我在c#中有一个基于回合的玩家游戏代码,需要由玩家1掷骰子3次后切换玩家。玩家2掷骰3次,然后传递给另一位玩家。
我在下面有一个代码,但想理解,可以说转1、2、3适用于玩家1,4、5、6是适用于玩家2,下一个升序的三个数字又返回至玩家1。单击按钮滚动时执行。
现在,在第六次单击滚动之后,它将保留在播放器2上。希望程序在第六次滚动之后切换回播放器一个,以便他可以再次滚动3次。
正在寻找像玩家2之后一样循环回到玩家1的东西。例如while循环。
谢谢。
private void btnRoll_Click(object sender, EventArgs e)
{
if (turn <= 2 && turn % 3 == 0)
{
tbxOutput.AppendText("Player 1 Turn" + Environment.NewLine);
playerOne = seqOfFive() + seqOfFour() + seqOfThree() + fiveOfKind() + fourOfKind() + threeOfKind();
}
if (turn >= 3 && turn % 3 == 0)
{
tbxOutput.AppendText("Player 2 Turn" + Environment.NewLine);
playerTwo = seqOfFive() + seqOfFour() + seqOfThree() + fiveOfKind() + fourOfKind() + threeOfKind();
}
答案 0 :(得分:2)
对于两个玩家,您可以简单地拥有一个布尔值。每3圈,您就会反转其值
var turn = 0;
var player1Turns = true;
while (true)
{
turn++;
if (player1Turns)
{
//player One play
}
else
{
//player Two play
}
if (turn % 3 == 0)
{
player1Turns = !player1Turns;
}
}
让我们更进一步,尝试将其应用于N位玩家。
我将为游戏添加规则:
-N名选手
-连续3次掷骰子6次。并将其添加到他的分数中。
-直到其中之一达到21岁。
-超出目标值的得分将重置为0
范例:20 + 6 = 0;
添加这些简单规则,因此我们必须存储玩家得分和游戏机制:
// Rulez
var consecutiveTrun = 3;
var targetValue = 21;
int numberOfPlayers = 5;
int Random6Dice() => rnd.Next(1, 7);
//initilise the array that store players score
var playerScores = new int[numberOfPlayers];
var turn = 0;
var currentPlayer = 0;
while (!playerScores.Contains(targetValue))
{
turn++;
Console.Write($"\n> Trun n°{turn,4}\t");
var playerRoll = Random6Dice(); // Player roll the dice.
Console.Write($"Player #{currentPlayer + 1,2}\t " +
$"has {playerScores[currentPlayer],2} " +
$"and roll: {playerRoll}\t");
var rawScore = playerScores[currentPlayer] + playerRoll;
playerScores[currentPlayer] = ( rawScore > targetValue) ? 0 : rawScore;
Console.Write($"Total Score = { playerScores[currentPlayer],2}");
if (turn % consecutiveTrun == 0)
{
currentPlayer = (currentPlayer + 1) % numberOfPlayers;
Console.WriteLine();
}
}
勺子喂食:修复了过去5次复制中的代码
// Get Turn outside of the function the form has to know the number of turn and not restart it at each click
var turn = 0;
private void btnRoll_Click(object sender, EventArgs e)
{
turn++;
if (player1Turns)
{
tbxOutput.AppendText("Player 1 Turn" + Environment.NewLine);
playerOne = seqOfFive() + seqOfFour() + seqOfThree() + fiveOfKind() + fourOfKind() + threeOfKind();
}
else
{
tbxOutput.AppendText("Player 2 Turn" + Environment.NewLine);
playerTwo = seqOfFive() + seqOfFour() + seqOfThree() + fiveOfKind() + fourOfKind() + threeOfKind();
}
if (turn % 3 == 0)
{
player1Turns = !player1Turns;
}
}
答案 1 :(得分:0)
我认为您正在寻找类似的内容,尽管您没有说循环何时结束:
var turn = 0;
while (!endCondition)
{
if (turn <= 2)
{
tbxOutput.AppendText("Player 1 Turn" + Environment.NewLine);
playerOne = seqOfFive() + seqOfFour() + seqOfThree() + fiveOfKind() + fourOfKind() + threeOfKind();
}
else if (turn > 2)
{
tbxOutput.AppendText("Player 2 Turn" + Environment.NewLine);
playerTwo = seqOfFive() + seqOfFour() + seqOfThree() + fiveOfKind() + fourOfKind() + threeOfKind();
}
turn++;
if (turn >= 6) turn = 0;
}
还有其他几种方法可以做到,但这与您所拥有的最接近。
答案 2 :(得分:0)
我会以不同的方式做事。这样想:假设您的匝数不受限制。您需要知道的只是该轮到谁了,并对其进行跟踪。
我在开发的游戏中有类似的东西,所以我可以从那里显示一些代码:
public int TurnCount { get; private set; } //this keeps track of turns
主游戏循环:
while (combatContinues)
{
combatContinues = this.Act();
}
在 Act 方法内我需要做的事
这将调用另一个名为 ContinueCombat
的方法此方法增加了转数,切换了侧边并完成了其他需要做的事情:
private void ContinueCombat()
{
this.TurnCount++;
this.SwitchSides();
this.ActivateFirstAliveActor();
}
在您的情况下,它将掷骰子并执行您需要的任何操作。
可以在此处看到完整的示例和正在运行的项目:
https://github.com/guardinfo-spam/rpg-engine
我从那里取样的班级在这里:
https://github.com/guardinfo-spam/rpg-engine/blob/master/RpgGamePcl/Combat/CombatScene.cs
答案 3 :(得分:0)
尝试N个玩家并回合
int numOfPlayers = 3, numOfTurns = 3, currentTurn = 0, currentPlayer, currentPlayerTurn;
while(true)
{
currentPlayerTurn = currentTurn % numOfTurns;
currentPlayer = (currentTurn / numOfTurns) % numOfPlayers;
//toDo
Console.Write($"Player {currentPlayer + 1}: Turn {currentPlayerTurn + 1} of {numOfTurns}");
currentTurn ++;
}