【问题标题】:How to compute word scores in Scrabble using MATLAB如何使用 MATLAB 计算拼字游戏中的单词分数
【发布时间】:2014-11-13 12:12:10
【问题描述】:

我的家庭作业程序遇到了问题。我们基本上必须取一个单词(例如 MATLAB)并让函数使用 Scrabble 规则为我们提供正确的得分值。还有其他一些事情,例如双字和双点值,但我正在努力转换为 ASCII。我需要将我的字符串转换为 ASCII 格式,然后总结这些值。我们只知道字符串的基本知识,我们的老师很没用。我尝试将字符串转换为数字,但这并不完全有效。有什么建议吗?

function[score] = scrabble(word, letterPoints)

doubleword = '#';
doubleletter = '!';
doublew = [findstr(word, doubleword)]
trouble = [findstr(word, doubleletter)] 
word = char(word)
gameplay = word;
ASCII = double(gameplay)


score = lower(sum(ASCII));

【问题讨论】:

  • 通常在 Scrabble 中会有一些传说告诉你每个字母有多少点相关联。我在你的代码中没有看到。这个是你给的,还是你自己也要编码?
  • @rayryeng 我们得到了它。我们必须上传它,然后运行我们的代码来测试它。
  • 好的,那么您到底需要什么帮助?您需要帮助计算单词的分数吗?
  • @rayryeng 是的,请。我想一旦我转换它,值应该是正确的。然后我可以继续处理双字母之类的,但情况并非如此。我尝试使用上而不是下(因为那些是较低的 ASCII 值,但这也不是它想要的)
  • 我会尽快写一个答案。这需要我重建积分表。

标签: string matlab indexing ascii


【解决方案1】:

从字符串转换为ASCII:

>> myString = 'hello, world';
>> ASCII = double(myString)

ASCII =

   104   101   108   108   111    44    32   119   111   114   108   100

总结价值:

>> total = sum(ASCII)

total =

        1160

char() 的 MATLAB 帮助说(强调):

S = char(X) 将非负整数代码数组 X 转换为字符数组。有效代码范围为 0 到 65535,其中代码 0 到 127 对应 7 位 ASCII 字符。 MATLAB® 可以处理的字符(7 位 ASCII 字符除外)取决于您当前的语言环境设置。 要将字符转换为数值数组,请使用 double 函数。

ASCII 图表here.

【讨论】:

  • 类似的,但如果我像 MATLAB 和 matlab 一样输入,它们必须给我相同的值。那以及当我尝试执行 ASCII = double(myString) 时,它会抱怨矩阵尺寸。
  • @JessicaMarie - 大写字母和小写字母具有不同的 ASCII 值。如果你这样做 double('MATLAB')double('matlab'); 你会得到不同的结果。因此,您需要弄清楚您是否只需要大写或小写字母,或者您是否想同时接受这两个字母,这实际上是您程序的一部分。
  • @JessicaMarie 您可以使用lower() 函数将字符串从大写转换为小写。另见upper()。如果 double() 函数给您一个矩阵维度错误,您可能需要检查您是否传递给它一个 2D 矩阵或 1D 矩阵。愿意发布您的代码吗?
  • @JessicaMarie 不判断我希望看到一些代码来提供帮助,仅此而已。
  • @JessicaMarie - 您的代码不起作用,因为您正在创建一个名为 double 的变量。因此,您正在使用变量遮蔽函数。你需要给你的变量起个别的名字。
【解决方案2】:

基于 Francis 的帖子,我建议您创建一个查找数组。您当然可以将每个字符转换为其 ASCII 等价物,但是我要做的是有一个数组,其中输入是您想要的字符的 ASCII 代码(稍作修改),输出将是点值性格。一旦你找到这个,你可以将分数相加得到你的最终分数。

我将暂时忽略 Scrabble 中的双点、双字母、空白图块和所有有趣的东西,以便获得您想要的工作。通过咨询Wikipedia,这是Scrabble中遇到的每个字母的点分布。

  • 1 点:A、E、I、O、N、R、T、L、S、U
  • 2 分:D、G
  • 3 分:B、C、M、P
  • 4 点:F、H、V、W、Y
  • 5分:K
  • 8 分:J、X
  • 10 分:Q、Z

我们要做的是将您的单词转换为小写以确保一致性。现在,如果你看一下a这个字母,它对应于ASCII码97。你可以使用我们之前谈到的double函数来验证:

>> double('a')

97

由于字母表中有 26 个字母,这意味着从 az 应该从 97 到 122。因为 MATLAB 从 1 开始索引数组,我们可以做的是将每个字符减去96 这样我们就可以计算出这些字符从 1 到 26 的数字位置。

让我们从构建查找表开始。首先,我要定义一大堆字符串。每个字符串表示与拼字游戏中每个点相关联的字母:

string1point = 'aeionrtlsu';
string2point = 'dg';
string3point = 'bcmp';
string4point = 'fhvwy';
string5point = 'k';
string8point = 'jx';
string10point = 'qz';

现在,我们可以使用每个字符串,转换为double,减去 96,然后将每个对应的位置分配给每个字母的点。让我们像这样创建我们的查找表:

lookup = zeros(1,26);
lookup(double(string1point) - 96) = 1;
lookup(double(string2point) - 96) = 2;
lookup(double(string3point) - 96) = 3;
lookup(double(string4point) - 96) = 4;
lookup(double(string5point) - 96) = 5;
lookup(double(string8point) - 96) = 8;
lookup(double(string10point) - 96) = 10;

我首先通过zeros 函数创建一个长度为26 的数组。然后我找出每个字母的去向,并为每个字母分配它们的点值。

现在,您需要做的最后一件事是获取一个字符串,确定小写字母,然后将每个字符转换为其等效的ASCII,减去 96,然后将这些值相加。如果给我们...说... MATLAB:

stringToConvert = 'MATLAB';
stringToConvert = lower(stringToConvert);
ASCII = double(stringToConvert) - 96;
value = sum(lookup(ASCII));

瞧……我们得到:

value =

 10

上述代码的最后一行至关重要。基本上,ASCII 将包含一堆索引位置,其中每个数字对应于字母在字母表中出现的数字位置。我们使用这些位置来查找每个字母给我们的分数/分数,并将所有这些值相加。

第 2 部分

双点值和双字的下一部分可以在我的另一个 StackOverflow 帖子中找到:

Calculate Scrabble word scores for double letters and double words MATLAB

【讨论】:

  • 所以我可以照着做。您组成了您的数组,然后允许 MATLAB 对其进行索引以遵循它的需要。我的问题是,我已经在我必须加载的文件中获得了 letterPoints。所以我不能完全做整个索引的考验。有没有办法让我打开给定的文件?它只让我加载它。我看不到点值:/
  • @JessicaMarie - 你能把加载所需的代码放在这个点系统中吗?这些点究竟是如何加载的?
  • 解释得很好:)
  • @JessicaMarie - 谢谢!该技能来自我以前的工作:) 开始学习编程绝非易事。相信我……我知道。你能做的最好的事情就是继续练习。它很快就会点击!
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多