如何重置并简化多行圆形绘制的循环逻辑
优化多行椭圆绘制与循环重置的实现方案
嘿,我仔细看了你的代码逻辑,咱们可以把它变得更简洁易维护,同时完美实现你要的“填满最后一行就重置循环”的效果!
现有逻辑的问题
你现在用了4个独立计数器和4个重复的for循环,不仅代码冗余,以后要加行或者改规则的话,得改好多地方,维护起来麻烦。咱们用数组来重构一下,把重复逻辑统一起来。
优化后的实现代码
1. 变量定义(用数组替代单独变量)
// 存储每行的计数器,对应四行的初始偏移值 int[] counters = {0, -6, -12, -18}; // 每行椭圆的Y坐标,和计数器数组一一对应 int[] yPositions = {40, 120, 200, 280}; // 每行最多绘制的椭圆数量(你原来的重置条件是counter4==7,所以这里设为7) final int MAX_BALLS_PER_ROW = 7;
2. 计数器递增逻辑(统一处理)
原来的4个counter++可以改成一个循环搞定,保持你原来的“每次触发条件所有计数器同时递增”的逻辑:
if (such and such) { // 你的触发条件 for (int i = 0; i < counters.length; i++) { counters[i]++; } }
3. 绘制椭圆逻辑(单循环遍历所有行)
不用写4个重复的for循环了,一个嵌套循环就能处理所有行的绘制,还能自动跳过计数器为负数的行(不会绘制):
for (int row = 0; row < counters.length; row++) { int currentCount = counters[row]; // 只在计数器大于0时绘制,且不超过每行最大数量 for (int i = 0; i < currentCount && i < MAX_BALLS_PER_ROW; i++) { ellipse(ScoreX + i * 80, yPositions[row], BallSize, BallSize); } }
4. 重置逻辑(更灵活的写法)
原来的重置可以改成检查最后一行的计数器,而且利用初始值的规律(0, -6, -12, -18 = 0 - 6*行号),用循环重置比手动赋值更灵活(以后加行不用改这段代码):
// 检查最后一行是否填满 if (counters[counters.length - 1] == MAX_BALLS_PER_ROW) { // 批量重置计数器到初始值 for (int row = 0; row < counters.length; row++) { counters[row] = 0 - 6 * row; } }
优化的好处
- 减少冗余代码:不用重复写4遍几乎一样的变量和循环,代码更干净。
- 扩展性更强:以后要加第五行?只需要在
counters和yPositions数组里加对应值就行,其他逻辑不用改。 - 可读性更高:用数组和循环统一逻辑,别人看代码一眼就能明白是处理多行绘制的逻辑。
内容的提问来源于stack exchange,提问作者Aaryan




