C语言开发水排序谜题:如何从数组随机取元素填充另一数组
解决水排序谜题游戏的随机颜色填充问题
先梳理你代码里的核心问题,再给出可直接运行的完整方案:
- 变量名不统一:你定义了
colrs和bottles数组,但打印逻辑用的是glasses,这会导致编译错误,需要先统一变量名。 - 颜色数组定义冗余:单个颜色用
char类型即可,不需要三维数组,改用一维数组存储所有待分配颜色更简洁。 - 缺失随机填充逻辑:需要用洗牌算法打乱颜色序列,再填充到瓶子数组中,同时预留空位置。
完整实现代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 定义所有待分配的颜色:4组r、y、b,共12个 char colors[12] = {'r', 'y', 'b', 'r', 'y', 'b', 'r', 'y', 'b', 'r', 'y', 'b'}; // 5个瓶子,每个4层,共20个位置,空位置用空格填充 char glasses[20]; int i, j; // 初始化随机种子,保证每次运行生成不同的随机布局 srand(time(NULL)); // Fisher-Yates洗牌算法:公平打乱颜色数组 for (i = 11; i > 0; i--) { j = rand() % (i + 1); // 交换两个元素位置 char temp = colors[i]; colors[i] = colors[j]; colors[j] = temp; } // 填充瓶子数组:前12个位置放打乱后的颜色,剩余8个位置放空(空格) for (i = 0; i < 12; i++) { glasses[i] = colors[i]; } for (; i < 20; i++) { glasses[i] = ' '; } // 按你期望的格式打印瓶子布局 printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[0], glasses[4], glasses[8], glasses[12], glasses[16]); printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[1], glasses[5], glasses[9], glasses[13], glasses[17]); printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[2], glasses[6], glasses[10], glasses[14], glasses[18]); printf("|%c| |%c| |%c| |%c| |%c|\n", glasses[3], glasses[7], glasses[11], glasses[15], glasses[19]); printf("+-+ +-+ +-+ +-+ +-+"); return 0; }
关键逻辑说明
- 随机种子初始化:
srand(time(NULL))用当前时间作为随机种子,避免每次运行生成完全相同的瓶子布局。 - Fisher-Yates洗牌:这是一种高效且公平的数组打乱算法,能确保每个颜色被分配到任意位置的概率均等。
- 数组填充:根据你给出的期望输出,设置12个有颜色的位置、8个空位置,符合水排序游戏的常见初始布局。
- 打印逻辑:保持你原本的打印格式,每个瓶子的4层对应数组中连续的4个元素,空位置用空格填充,输出效果与你期望一致。
内容的提问来源于stack exchange,提问作者mehmet enes çetin
相关产品推荐
相关产品推荐

