我正在制作一个玩家与计算机Mastermind(棋盘游戏)程序,作为学习Ruby的一部分。
如果你不认识Mastermind,那么基本上它是一个双人游戏,其中一个玩家创建四种颜色的代码(即“红色红色蓝色黄色”),并且对手试图猜测该代码。
游戏使用一组可用颜色和空代码初始化:
try
{
AuthenticationContext ac = new AuthenticationContext(authority);
ac.TokenCache.Clear();
AuthenticationResult ar = await ac.AcquireTokenAsync(resource, clientId, new Uri(returnUri), new PlatformParameters(this));
JObject payload = new JObject();
payload["access_token"] = ar.AccessToken;
// DataRepository.DefaultManager.CurrentClient.Logout();
user = await DataRepository.DefaultManager.CurrentClient.LoginAsync(MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory,payload);
}
catch (Exception ex)
{
CreateAndShowDialog(ex.Message, "Authentication failed");
}
我可以要求用户设置如下代码:
@@colours = ["RED", "BLUE", "YELLOW", "GREEN", "ORANGE", "WHITE"]
@code = []
用户输入代码如下:puts "Please set your code:"
code = gets.chomp.downcase.split("")
@code << code
=&gt; rgby
。
(会有一个方法发生变化,即“r”变为“RED”,请假设在我的程序中某处发生。)
我想确保播放器只能使用code = ["RED", "GREEN", "BLUE", "YELLOW"]
中包含的颜色,即@@colours
无效。
伪代码将遵循:
如果在
pxgb
中找到所有输入颜色,请更新@@colours
。
或相反
如果在
@code
中找不到任何输入颜色,请不要更新@@colours
(并可能执行其他操作)。
我该怎么写?我对错误处理不是很熟悉,所以我试图不做,但我愿意学习这是不是最好的方法。
答案 0 :(得分:2)
您可以执行以下操作来检查code
是否只包含@@colours
(code - @@colours).empty?
如果true
仅包含来自code
的元素,则上面的表达式为@@colours
,否则它将为false
。
PS:在相关代码示例中,code
一次显示为包含gets
的输入,另一次显示为已处理输入的数组。在上面的解决方案中,我假设code = ["RED", "GREEN", "BLUE", "YELLOW"]
答案 1 :(得分:0)
您应该查看Set
对象和subset?
函数。
http://ruby-doc.org/stdlib-2.3.1/libdoc/set/rdoc/Set.html
您可以使用阵列上的to_set
函数将数组转换为集合
答案 2 :(得分:0)
您可以从输入中减去允许的元素。如果结果不为空,则输入中有一个元素不在允许值列表中:
allowed = [1,2,3]
input = [1,2]
input - allowed #=> []
input = [1,5]
input - allow #=> [5]
作为奖励,这会返回不允许的元素,并且可以在错误消息中使用。