在MATLAB中用骰子写一个有趣的游戏模拟

时间:2015-09-12 21:02:15

标签: matlab

我正在尝试编写一个模拟以下游戏的代码:

掷两个骰子,让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>

提前多多感谢

5 个答案:

答案 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!')