我正在尝试做骰子游戏,但由于某种原因会发生此错误。
无法将类型为“骰子”的对象转换为类型为“ System.IConvertible”的
这是我的代码:
class Dice
{
int result;
public void DiceRoll()
{
Random rnd = new Random();
result = rnd.Next(1, 7);
}
}
Console.WriteLine("Player 1 Turn" + roll);
int enterscore1 = Convert.ToInt32(roll);
Console.WriteLine("Player 2 Turn" + roll);
int enterscore2 = Convert.ToInt32(roll);
答案 0 :(得分:1)
一些注意事项:
在从用户获取输入 (即作为文本)时,您通常会使用Convert.ToInt32
,int.TryParse
或int.TryParse
中的一种,并且想要获取其数值(作为int
值)。
这里您拥有Dice
类的骨骼,该类已经可以与int
一起使用,因此无需转换。
我会强烈建议您不要尝试像消息所暗示的那样实现IConvertible
,这并不是它的真正目的。
请注意,对于像您这样的情况,强烈建议您使用Random
的单个实例,因为constructor是
使用时间相关的默认种子值。
因此快速连续创建多个Random
实例可能会使用同一种子。如果这样做,由于Random
类上的方法不是线程安全的,则应在某个对象上lock
,以防止多个线程同时调用其方法(如下所述)。
有几种方法可以做您想要的。这里有一些:
具有一个Dice
的单个实例并将其滚动多次:
public class Dice
{
private static readonly Random random = new Random();
public int Result
{
get;
private set;
}
public void Roll()
{
lock ( random )
Result = random.Next(1, 7);
}
}
public static void Main()
{
var dice = new Dice();
dice.Roll();
var player1Result = dice.Result;
Console.WriteLine("Player 1 rolls: " + player1Result);
dice.Roll();
var player2Result = dice.Result;
Console.WriteLine("Player 2 rolls: " + player2Result);
}
(尝试here)
请注意,我已经为每个掷骰分配了一个变量-这使您可以使用compare
和>
<
来找出谁赢了。
每个玩家都有一个单独的Dice
实例:
public class Dice
{
private static readonly Random random = new Random();
private readonly int _minValue;
private readonly int _maxValue;
public Dice(int minValue, int maxValue)
{
_minValue = minValue;
_maxValue = maxValue;
}
public int Result
{
get;
private set;
}
public void Roll()
{
lock ( random )
Result = random.Next(_minValue, _maxValue + 1);
}
}
public static void Main()
{
var player1Dice = new Dice(1, 6);
player1Dice.Roll();
var player1Result = player1Dice.Result;
Console.WriteLine("Player 1 rolls: " + player1Result);
var player2Dice = new Dice(1, 5);
player2Dice.Roll();
var player2Result = player2Dice.Result;
Console.WriteLine("Player 2 rolls: " + player2Result);
}
(尝试here)
您仍然可以进行比较,但是由于您有不同的Dice
实例,因此您可以将自己的构造函数添加到Dice
中,例如,堆叠赔率以支持一名玩家(我在这里已使第二个玩家的骰子只掷出1-5)。
只有一个静态Dice
类
public static class Dice
{
private static readonly Random random = new Random();
public static int Roll()
{
lock ( random )
return random.Next(1, 7);
}
}
public static void Main()
{
var player1Result = Dice.Roll();
Console.WriteLine("Player 1 rolls: " + player1Result);
var player2Result = Dice.Roll();
Console.WriteLine("Player 2 rolls: " + player2Result);
}
(尝试here)
如果您永远不会对Dice
做任何事情,并且不希望它有任何状态(例如,滚动不同的值或了解以前的滚动),则您需要有一个单独的类,这就是我要做的。您不需要构造函数,因为Dice
是static
。同样,您可以将这两个结果进行比较。
答案 1 :(得分:0)
如果您将roll作为Dice类的变量声明,则您的代码应为
int enterscore1 = Convert.ToInt32(roll.result);
Console.WriteLine("Player 2 Turn" + roll);
int enterscore2 = Convert.ToInt32(roll.result);
无法将类型为“骰子”的对象转换为类型为“ System.IConvertible”的
此错误意味着您要放置的参数没有IConvertible接口,这对于Convert类方法是必不可少的。
答案 2 :(得分:-1)
您需要包含int enterscore1 = DiceRoll();
,这将有助于在骰子掷骰方法中将随机变量定义为整数