【问题标题】:How to compare strings in textboxs with Matlab如何用 Matlab 比较文本框中的字符串
【发布时间】:2017-03-04 15:27:00
【问题描述】:

我想比较石头剪刀布游戏文本框中的字符串。比较后,将结果显示在另一个文本框中。但它没有比较。有人可以帮帮我吗?谢谢你。

if strcmp('Rock'==get(handles.computer,'string'),'Rock'==get(handles.player,'string'))
    set(handles.result,'string','Draw');
elseif strcmp('Rock'==get(handles.computer,'string'),'Paper'==get(handles.player,'string'))
    set(handles.result,'string','Player wins');
elseif strcmp('Rock'==get(handles.computer,'string'),'Scissors'==get(handles.player,'string'))
    set(handles.result,'string','Computer wins');
elseif strcmp('Paper'==get(handles.computer,'string'),'Rock'==get(handles.player,'string'))
    set(handles.result,'string','Computer wins');
elseif strcmp('Paper'==get(handles.computer,'string'),'Paper'==get(handles.player,'string'))
    set(handles.result,'string','Draw');
elseif strcmp('Paper'==get(handles.computer,'string'),'Scissors'==get(handles.player,'string'))
    set(handles.result,'string','Player wins');
elseif strcmp('Scissors'==get(handles.computer,'string'),'Rock'==get(handles.player,'string'))
    set(handles.result,'string','Player wins');
elseif strcmp('Scissors'==get(handles.computer,'string'),'Paper'==get(handles.player,'string'))
    set(handles.result,'string','Computer wins');
elseif strcmp('Scissors'==get(handles.computer,'string'),'Scissors'==get(handles.player,'string'))
    set(handles.result,'string','Draw');
end

【问题讨论】:

    标签: matlab strcmp


    【解决方案1】:

    问题在于你比较两个文本框的字符串的方式:

    if strcmp('Rock'==get(handles.computer,'string'),'Rock'==get(handles.player,'string'))
    

    在此声明中:

    'Rock'==get(handles.computer,'string')
    

    您逐个元素地比较两个字符串的字符。

    这个比较返回一个logical类型的数组(1如果第一个字符串的第i个字符等于第二个字符串的第i个字符,0否则)

    注意如果两个字符串长度不同,会报Matrix dimensions must agree.之类的错误

    这同样适用于语句的第二部分:

    'Rock'==get(handles.player,'string')
    

    如果 computerplayer 都插入相同的字符串(例如 Rock),那么您将使用 strcmp 进行比较两个logical 数组,它失败了。

    cases因此,您必须直接比较字符串。

    一种可能的解决方案是使用switch 语句:

    • 首先你得到 computerplayer 字符串
    • 然后将字符串转换为lower caseRockrock ......相同)
    • 然后您可以连接两个字符串(例如 _rock_rock_)
    • switchcases 包含不同的组合

    一个可能的实现可能是:

    % Get the Computer string (in lower case)
    computer=lower(get(handles.computer,'string'))
    % Get the Player string (in lower case)
    player=lower(get(handles.player,'string'))
    % Concatenate the two string
    res=[computer player]
    % Check for the different combination
    switch(res)
       case 'rockrock'
          set(handles.result,'string','Draw');
       case 'rockpaper'
          set(handles.result,'string','Player wins');
       case 'rockscissor'
          set(handles.result,'string','Computer wins');
       case 'paperrock'
          set(handles.result,'string','Computer wins');
       case 'paperpaper'
          set(handles.result,'string','Draw');
       case 'paperscissor'
          set(handles.result,'string','Player wins');
       case 'scissorrock'
          set(handles.result,'string','Player wins');
       case 'scissorpaper'
          set(handles.result,'string','Computer wins');
       case 'scissorscissor'
          set(handles.result,'string','Draw');
       otherwise
          set(handles.result,'string','Invalid text');
    end
    

    希望这会有所帮助,

    卡普拉'

    【讨论】:

    • “SWITCH 表达式必须是标量或字符串常量”是什么意思?现在,当我输入 if isscalar(res) 时,它不会显示结果。我在另一个 matlab 文件中执行此操作,而不是我做错的另一个文件。
    • 我不明白你的问题:[switch](uk.mathworks.com/help/matlab/ref/switch.html) 函数计算表达式(在本例中为字符串 res ) 并执行与条件匹配的case 块中的语句,否则执行otherwise 部分中的default 语句。您在实施建议的代码时是否遇到任何错误?你为什么要查看isscalar(res)
    • 是的。错误提示“SWITCH 表达式必须是标量或字符串常量”。
    • 在上面的例子中,switch 表达式实际上是一个string constantres 字符串是从文本框中提取的computerplayer 字符串的串联产生的。您在代码中是否还使用了上述示例的前三行 od 代码?你在两个文本编辑框中放了哪个字符串?
    • 是的,我做到了。好的,我有 2 个文件。一个用于测试,另一个是真实的。真实的(游戏)有带有文本框的图像,告诉它们是什么。测试仅用于像您所做的那样测试比较字符串并且它有效。但在真实的情况下,它们是一个错误,它说“SWITCH 表达式必须是标量或字符串常量”。
    【解决方案2】:

    作为@il_raffa 的替代方案,我建议将rockscissorpaper 分别映射到[1,2,3]。然后从player 中减去computer 的值。

    那你就可以轻松搞定if, else if, else了。

    if ismember(player - computer, [-1 2]) %This mean player got a 
         'player wins'
    elseif ismember(player - computer, [1 -2])
         'computer wins'
    else
         'draw'
    end
    

    当只有 9 个条件时,switch, case 可能没什么大不了的,但如果条件数量更多,这样的技术会使工作更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2012-04-29
      相关资源
      最近更新 更多