如何排序数组使相同数字前置?Yahtzee游戏开发技术求助
Yahtzee游戏排序问题修复与得分判定思路
一、排序代码的核心Bug修复
你的选择排序代码存在三个关键问题,导致无法正确排序含重复数字的数组:
min变量未初始化
selection函数中,min没有在每次外层循环时设为当前起始索引i,初始值是随机垃圾值,直接导致排序逻辑完全混乱。需要在for (i = 0; i < size - 1; i++)循环内第一行添加min = i;。交换函数类型不匹配
switches函数参数定义为float *,但实际传入的是int类型的数组元素值,不仅类型不兼容,还会导致内存操作错误。需将参数改为int *,调用时传递元素的地址。数组越界访问
main函数中打印数组的循环条件是i < 6,但数组大小为n=5,索引只能到4,越界会读取未知内存数据。需改为i < n。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #define n 5 void switches(int *v, int *m) { int temp = *v; *v = *m; *m = temp; } void selection(int size, int *v) { int min, i, j; for (i = 0; i < size - 1; i++) { min = i; // 每次外层循环初始化min为当前起始位置 for (j = i + 1; j < size; j++) { if (v[j] < v[min]) min = j; } if (min != i) switches(&v[i], &v[min]); // 传递元素地址 } } int main(void) { int v[n] = { 2, 1, 3, 3, 3 }; int m[n] = { 1, 3, 4, 3, 3 }; selection(n, v); for (int i = 0; i < n; i++) // 修正循环条件,避免越界 printf("The values for the array are:%d\n", v[i]); return 0; }
二、排序后的得分判定思路
数组排序完成后,可利用升序(或降序)的特性,通过简单的条件判断实现各类得分项的判定:
三条:检查是否存在至少三个连续相同的数字,满足以下任意一种即可:
(v[0] == v[1] && v[1] == v[2]) || (v[1] == v[2] && v[2] == v[3]) || (v[2] == v[3] && v[3] == v[4])四条:检查是否存在至少四个连续相同的数字,满足以下任意一种即可:
(v[0] == v[1] && v[1] == v[2] && v[2] == v[3]) || (v[1] == v[2] && v[2] == v[3] && v[3] == v[4])满堂红(Full House):需满足“三个相同+两个相同”的结构,同时排除五个数字全相同的情况:
((v[0] == v[1] && v[1] == v[2] && v[3] == v[4]) || (v[0] == v[1] && v[2] == v[3] && v[3] == v[4])) && v[0] != v[4]Yahtzee(五个相同):直接判断首尾元素是否相等即可(排序后所有元素必相同):
v[0] == v[4]
另外,也可以不用排序,直接通过统计每个骰子数值的出现次数来判定:用一个大小为6的数组(对应骰子1-6点)计数,遍历骰子数组后检查计数数组中是否有值≥3(三条)、≥4(四条)、同时存在3和2(满堂红)、存在5(Yahtzee),这种方法效率更高,适合复杂场景。
内容的提问来源于stack exchange,提问作者G0ld
相关产品推荐
相关产品推荐

