Jes*_*rie 2 matlab conditional for-loop if-statement conditional-statements
好吧,这是一周的时间,我正在用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
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我让大多数这个坏孩子都跑了.我现在的问题是,当我运行测试用例'[winner1] = rockPaperScissors('Rock,Scissors,Scissors','Paper,Rock,Scissors')时,它以垂直'ans'输出我的答案,而不是赢家.此外,它给了我'玩家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 = T{player1(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
Run Code Online (Sandbox Code Playgroud)
现在让我们玩:
player1 = {'Rock','Scissors','Scissors'}
player2 = {'Paper','Rock','Scissors'}
RockPaperScissorsLizardSpock(player1, player2, 3)
Run Code Online (Sandbox Code Playgroud)
收益:
Player 1 wins round 1!
Player 1 wins round 2!
Tie in round 3!
Player 1 Wins!
Run Code Online (Sandbox Code Playgroud)
您还可以实现一些高级功能,例如为玩家提供名称:
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
Run Code Online (Sandbox Code Playgroud)
和
Sheldon = {'Spock','Spock','Spock'}
Penny = {'Paper','Rock','Scissors'}
RockPaperScissorsLizardSpock(sheldon, penny, 3)
Run Code Online (Sandbox Code Playgroud)
产量
Sheldon wins round 1!
Penny wins round 2!
Penny wins round 3!
Penny Wins!
Run Code Online (Sandbox Code Playgroud)
如果你坚持使用逗号输入字符串:
Sheldon = 'Spock,Spock,Spock'
Penny = 'Paper,Rock,Scissors'
Run Code Online (Sandbox Code Playgroud)
你需要添加strsplit到功能:
player1= strsplit(player1,',')
player2= strsplit(player2,',')
Run Code Online (Sandbox Code Playgroud)
您需要使用函数strcmp而不是==运算符。输入是字符数组,这就是==抱怨尺寸的原因。
这是您的第一个语句的示例if:
if strcmp(move1, 'Rock') && strcmp(go1, 'Paper')
winner1 = 'Player 2 Wins!';
Run Code Online (Sandbox Code Playgroud)
这里我做了两个更改,第一个是使用 strcmp,第二个是使用标量 AND ie&&
请参阅help strcmp并帮助&&了解更多详细信息。