我正在尝试编写一个模拟以下游戏的代码:
掷两个骰子,让x为它们的总和。如果x = 7或x = 11,那么你就赢了。 否则再次掷骰子直到你获得x (在这种情况下你获胜)或7或11(在这种情况下你松开)。
想象一下你有两个骰子,那么如果在第一次掷骰中你获得7或11的总和,你就赢了,如果没有,那么总和可能是其他数字,让我们说9,然后你必须继续罗林两个骰子,直到你再次获得9,如果在那个过程中你得到7或11个agiain你松散:)
然后我写了下面的代码:
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
while x~=7 & x~=11
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
if x==x
disp('You win')
elseif x==7 | x==11
disp('You loose')
end
end
但是它无限期地显示“你赢了”这句话并且无法阻止它,我知道这是因为条件“x == x”总是评估为真,但我怎么能解决这个问题呢? / p>
提前多多感谢
答案 0 :(得分:2)
你想在你赢了之前做重拍吗?在这种情况下,您希望在while循环中重新滚动。一遍又一遍地检查相同的数字不会有用。
x=0;
wins=[7 11];
while min(x~=wins)
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2
if max(x==wins)
disp('You win')
else
disp('You loose')
end
end
答案 1 :(得分:1)
<div id="container">
<div id="left">
<img style="width: 150px; height: 150px;" src="https://pbs.twimg.com/profile_images/378800000442759461/b483cdd049f470928e7b20051f95b8cc.jpeg">
</div>
<div id="middle">
Today is September 12, 2015. It's a saturday partly cloudy
</div>
<div id="right">
<img style="width: 150px; height: 150px;" src="https://pbs.twimg.com/profile_images/378800000442759461/b483cdd049f470928e7b20051f95b8cc.jpeg">
</div>
</div>
发生的事情是我引入了d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
kk=1;
while x~=7 && x~=11
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
if kk ==1
tmp = d1+d2;
end
x=d1+d2;
if x==7 || x==11 && kk == 1
disp('You win')
elseif x==7 || x==11 && kk > 1
disp('You loose')
elseif x==tmp && kk>1
disp('You win')
else
disp('You loose')
end
kk = kk+1;
end
,可以考虑和迭代计数器。在获胜条件下将其作为额外条件添加。 kk
语句随后包含您设置的所有条件,请注意,如果if
我将总和保存在kk==1
中,我将根据该值检查第二次获胜条件。
试运行:
tmp
答案 2 :(得分:1)
这应该有效:
x=0;
while x~=7 | x~=11
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
if x==7 | x==11
disp(x)
disp('You win')
break
else
disp(x)
disp('You loose')
a = input('You want roll again (y/n)? ','s')
if strcmpi(a,'y')
else
break
end
end
end
答案 3 :(得分:1)
因为您在第一轮之后更改了规则,所以您可以使用if
语句指定第一轮的规则,并在else
语句中指定游戏的其余部分。此外,您需要在代码中指定值X
。这里我以5为例。如果在第一轮之后没有结果,则使用代码d1=floor(6*rand)+1; d2=floor(6*rand)+1; x=d1+d2;
再次对骰子进行角色,然后确定您是赢还是输。如果仍然没有结果,你将使用while循环来保持这种状态,直到输赢为止。
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
first_sum = x % use another variable first_sum to hold the status of first roll
if x==7 || x==11
disp('You win')
else
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
if x== 7 || x==11
disp('You lose')
elseif x == first_sum
disp('You win')
else
while x ~= first_sum && x~=11 && x~=7
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
if x== 7 || x==11
disp('You lose')
elseif x == first_sum
disp('You win')
end
end
end
end
或者你可以用更简洁的方式写出来。由于else语句包含类似do while
循环的结构(意味着至少执行一次并在满足某个条件时继续执行),您也可以这样编码:
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
first_sum = x
if x==7 || x==11
disp('You win')
else
flag = true
while flag % The while loop will keep going until flag is set to false.
d1=floor(6*rand)+1;
d2=floor(6*rand)+1;
x=d1+d2;
if x== 7 || x==11
disp('You lose')
flag = false % If a result is reached, stop the while loop
elseif x == first_sum
disp('You win')
flag = false
end
end
end
答案 4 :(得分:1)
为它添加了更多的游戏氛围,还添加了评论,以便您了解我在做什么
win1 = 7; %these values give you a win
win2 = 11;
lose1 = 0; %can't lose on first roll. this will be set later
lose2 = 0;
streak = 0;
%while game is still going on..
while true
newgame = input('Would you like to start a new game? Type YES or NO --> ','s'); %user inputs string
if strcmpi(newgame,'YES') %did user type YES?
game = true; % set games state to true to begin the game loop
firstroll=true; %first roll coming up
elseif strcmpi(newgame,'NO')
break; % end program by exiting outer loop
else %user didn't enter correctly so re-ask
continue;
end
while game
input('Press enter to roll dice'); %roll the dice
d1 = floor(6*rand)+1;
d2 = floor(6*rand)+1;
disp('You rolled:'); %display the dice
disp(d1);
disp(d2);
x=d1+d2;
if x==win1 || x==win2 % check for a win
streak=streak+1; %%add a win to your total
disp('WINNER!')
elseif x==lose1 || x==lose2
disp('YOU LOST!')
disp('streak:') %show how many games you won
disp(streak)
game = false; % end game state because you lost
%reset winning and losing numbers
win1=7;
win2=11;
lose1=0;
lose2=0;
streak = 0; %reset streak
elseif firstroll %ok, didn't win on the FIRST ROLL so lets set the NEW winning value and reroll
win1 = x; % we win if we roll the same value again
win2 = x;
lose1 = 7; % we lose if we roll a 7 or 11
lose2 = 11;
firstroll = false; % set firstroll false so it doesn't keep resetting the winning and losing values
continue;
end
end
end
disp('Thanks for playing!')