MATLAB 中的石头、纸、剪刀

Posted

技术标签:

【中文标题】MATLAB 中的石头、纸、剪刀【英文标题】:Rock, Paper, Scissors in MATLAB 【发布时间】:2014-11-21 13:52:41 【问题描述】:

好的,又到了一周中的那个时候,我正式用 MATLAB 举起双手寻求帮助。我本周的目标是尝试创建一个函数,该函数接受两个输入,即“Rock, Paper, Scissors”(或任何选择)的字符串,然后输出三个字符串之一“Player 1 Wins!” , '玩家 2 获胜!或“继续玩!”。要获胜,玩家必须在三分之二的时间内击败其他两个(打平算输)

function[winner] = RockPaperScissors(player1, player2)
[move1, others] = strtok(player1, ',');
[move2, rest] = strtok(others, ',');
[move3, ~] = strtok(rest, ',');

[go1, others] = strtok(player2, ',');
[go2, rest] = strtok(others, ',');
[go3, ~] = strtok(rest, ',');

Counter1 = 0;
Counter2 = 0;

for i = 1:3
if strcmp(move1, 'Rock') && strcmp(go1, 'Paper')
    Counter2 = Counter2 + 1;
elseif strcmp(move1, 'Rock') && strcmp(go1, 'Scissors')
    Counter2 = Counter2 + 1;
elseif strcmp(move1, 'Rock') && strcmp(go1, 'Rock')
    Counter1 = 0;
elseif strcmp(move1, 'Paper') && strcmp(go1, 'Paper')
    Counter1 = 0;   
elseif strcmp(move1, 'Paper') && strcmp(go1, 'Rock')
    Counter1 = Counter1 + 1;
elseif strcmp(move1, 'Paper') && strcmp(go1, 'Scissors')
    Counter2 = Counter2 + 1;
elseif strcmp(move1, 'Scissors') && strcmp(go1, 'Scissors')
    Counter1 = 0;
elseif strcmp(move1, 'Scissors') && strcmp(go1, 'Paper')
    Counter1 = Counter1 + 1;
elseif strcmp(move1, 'Scissors') && strcmp(go1, 'Rock')
    Counter2 = Counter2 + 1;
end
if strcmp(move2, 'Rock') && strcmp(go2, 'Paper')
    Counter2 = Counter2 + 1;
elseif strcmp(move2, 'Rock') && strcmp(go2, 'Scissors')
    Counter2 = Counter2 + 1;
elseif strcmp(move2, 'Rock') && strcmp(go2, 'Rock')
    Counter1 = 0;
elseif strcmp(move2, 'Paper') && strcmp(go2, 'Paper')
    Counter1 = 0;   
elseif strcmp(move2, 'Paper') && strcmp(go2, 'Rock')
    Counter1 = Counter1 + 1;
elseif strcmp(move2, 'Paper') && strcmp(go2, 'Scissors')
    Counter2 = Counter2 + 1;
elseif strcmp(move2, 'Scissors') && strcmp(go2, 'Scissors')
    Counter1 = 0;
elseif strcmp(move2, 'Scissors') && strcmp(go2, 'Paper')
    Counter1 = Counter1 + 1;
elseif strcmp(move2, 'Scissors') && strcmp(go2, 'Rock')
    Counter2 = Counter2 + 1;
end
if strcmp(move3, 'Rock') && strcmp(go3, 'Paper')
    Counter2 = Counter2 + 1;
elseif strcmp(move3, 'Rock') && strcmp(go3, 'Scissors')
    Counter2 = Counter2 + 1;
elseif strcmp(move3, 'Rock') && strcmp(go3, 'Rock')
    Counter1 = 0;
elseif strcmp(move3, 'Paper') && strcmp(go3, 'Paper')
    Counter1 = 0;   
elseif strcmp(move3, 'Paper') && strcmp(go3, 'Rock')
    Counter1 = Counter1 + 1;
elseif strcmp(move3, 'Paper') && strcmp(go3, 'Scissors')
    Counter2 = Counter2 + 1;
elseif strcmp(move3, 'Scissors') && strcmp(go3, 'Scissors')
    Counter1 = 0;
elseif strcmp(move3, 'Scissors') && strcmp(go3, 'Paper')
    Counter1 = Counter1 + 1;
elseif strcmp(move3, 'Scissors') && strcmp(go3, 'Rock')
    Counter2 = Counter2 + 1;
end

if max(Counter1, Counter2) == Counter2
    winner = 'Player 2 Wins!';
elseif max(Counter1, Counter2) == Counter1
    winner = 'Player 1 Wins!';
elseif max(Counter1, Counter2) ~= (Counter1 || Counter2) % I tried making a Counter 3, did not work out
    winner = 'Keep Playing!';
end

end

如您所见,我让这个坏男孩大部分都在逃跑。我现在的问题是,当我运行测试用例时' [winner1] = rockPaperScissors('Rock,Scissors,Scissors','Paper,Rock,Scissors') 它以垂直的“ans”输出我的答案,而不是作为赢家。此外,它给了我“玩家 2 赢!”即使它应该是一个领带。我尝试全部调试,但无法弄清楚我的问题出在哪里。呸!

【问题讨论】:

我可以使用逗号,只是不确定它是否给了我想要的东西。我尝试使用 & 来做我想做的事,但这没有用。通过做我想做的事,我的意思是比较两个字符串(或至少记录结果)。 【参考方案1】:

您需要使用函数strcmp 而不是== 运算符。输入是 char 数组,这就是 == 抱怨维度的原因。

这是您的第一个 if 语句的示例:

if strcmp(move1, 'Rock') && strcmp(go1, 'Paper')
    winner1 = 'Player 2 Wins!';

这里我做了 2 处更改,第一个是使用 strcmp,第二个是使用标量 AND 即&&

请参阅help strcmp 和帮助&& 了解更多详情。

【讨论】:

我是否必须定义什么比它下面或上面的什么好?就像我需要像 move1 == 'Rock' 或 move2 == 'Paper' 等 strcmp 不会给我那个。我无法告诉他们会赢什么 我已经更新了我的答案,让您更详细地了解我的意思。 哦,这更有意义。谢谢:)【参考方案2】:

您是否真的考虑过使用table?它非常适合您的目的!

只是一个想法,如何做。请不要指摘我,我没有考虑到您的所有限制和条件,但是您应该很容易根据自己的喜好调整我的功能。

function RockPaperScissorsLizardSpock(player1, player2, rounds)

%// creating the table with all combinations
header = 'Rock';'Paper';'Scissors';'Lizard';'Spock';
Rock = [0;-1;1;1;-1];
Paper = [1;0;-1;-1;1];
Scissors = [-1;1;0;1;-1];
Lizard = [-1;1;-1;0;1];
Spock = [1;-1;1;-1;0];
T = table(Rock,Paper,Scissors,Lizard,Spock,'RowNames',header);


%// play and display winners of every round
points = 0;
for ii = 1:rounds

   pointsRound  =  Tplayer1(ii), player2(ii);   %// no need for if-conditions
                                                  %// one line is enough
   points = points + pointsRound;

   if     pointsRound > 0;  disp(['Player 1 wins round ' num2str(ii) '!'])
   elseif pointsRound < 0;  disp(['Player 2 wins round ' num2str(ii) '!'])
   else                     disp(['Draw in round ' num2str(ii) '!'])
   end

end

%// display overall winner
if     points >  rounds/2; disp('Player 1 Wins!')
elseif points == 0;        disp(['Draw!' num2str(ii) '!'])
else                       disp('Player 2 Wins!')

end

现在开始玩吧:

player1 = 'Rock','Scissors','Scissors'
player2 = 'Paper','Rock','Scissors'

RockPaperScissorsLizardSpock(player1, player2, 3)

返回:

Player 1 wins round 1!
Player 1 wins round 2!
Tie in round 3!
Player 1 Wins!

您还可以实现一些高级功能,例如为玩家命名:

function RockPaperScissorsLizardSpock(player1, player2, rounds)

plname = inputname(1);
p2name = inputname(2);

...

   if     pointsRound > 0;  disp([plname ' wins round ' num2str(ii) '!'])

...

else                disp([p2name ' Wins!'])

end

Sheldon = 'Spock','Spock','Spock'
Penny = 'Paper','Rock','Scissors'

RockPaperScissorsLizardSpock(sheldon, penny, 3)

产量

Sheldon wins round 1!
Penny wins round 2!
Penny wins round 3!
Penny Wins!

如果您坚持使用逗号输入字符串:

Sheldon = 'Spock,Spock,Spock'
Penny = 'Paper,Rock,Scissors'

你需要在函数中添加strsplit

player1= strsplit(player1,',')
player2= strsplit(player2,',')

【讨论】:

不确定是游戏主题还是女性 OP 吸引了如此高质量的答案。 从技术上讲,我必须使用他们给我的字符串,所以它是带有逗号的字符串。现在制作一张桌子确实有些意义,但这并不完全适合我需要做的事情。而且我不太确定如何让它发挥作用。 我还没有完全了解表格,所以我不太习惯使用这个想法 @Jigg 实际上既不是一个也不是另一个。但是我打算回答包括 Spock 在内的问题,并且需要查看 wikipedia 的关系,并且出现了正常表以及使用 if 条件解决它的事实是矫枉过正。 ;) 我不得不用条件句夸大它:P 但我想通了。我有大约 80 行代码,但它可以工作。无论如何,我相信您的代码可以完美运行 :) 感谢您的帮助!

以上是关于MATLAB 中的石头、纸、剪刀的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:telnet“石头、纸、剪刀”程序不工作

编写石头、纸、剪刀游戏

石头剪子布啥意思?

团队-游戏《石头,剪刀,布》-代码设计规范

团队-游戏《石头,剪刀,布》-代码设计规范

石头剪子布秘诀_剪刀石头布必胜技巧