change()方法变换图像判断有漏洞,以及对传参的疑问
change()方法变换内部实现碰撞判断的时候不应当只考虑边界判断,还需要考虑画布内已经存储的色块,两个if判断应当改成 move_down()方法中的碰撞判断逻辑才对。
大白老师的change()方法:
int change_shape()
{
int m = (dynamic_mode + 1) % 4;
//右侧越界判断
if(dynamic_x + 2 * (4 - shape[dynamic_num][m][16]) - 1 > 39)
return 1;
//右侧越界判断
if(dynamic_y + 2 * (4 - shape[dynamic_num][m][17]) - 1 > 29)
return 1;
erase_last_shape(dynamic_num,dynamic_mode,dynamic_x,dynamic_y);
dynamic_mode = m;
print_mode_shape(dynamic_num,dynamic_mode,dynamic_x,dynamic_y,dynamic_color);
}
修改后的change()方法:
change()
//右边界判断
if((dynamic_x + 2*(4 - shape[dynamic_num][m][16]) - 1 > 39) ||judge_shape(dynamic_num, m,dynamic_x,dynamic_y))
return 1;
//下边界判断
if((dynamic_y + (4 - shape[dynamic_num][m][17]) - 1 > 29) ||judge_shape(dynamic_num, m,dynamic_x,dynamic_y))
return 1;
老师在设计俄罗斯方块项目的函数中,为什么是通过形参的将全局变量传入函数体中,而不是直接引用全局变量?
示例:
int move_down(int n ,int m)
{
//写俄罗斯方块项目的时候经常忘记形参n和m
if((dynamic_y + (4 - shape[n][m][17]) - 1 >= 29) ||jude_shape(dynamic_num, dynamic_mode,dynamic_x,dynamic_y+1))
{
store_current_shape();
init_new_shape();
next_shape();
return 1;
}
//写俄罗斯方块项目的时候经常忘记形参n和m
clear_shape(dynamic_num,dynamic_mode,dynamic_x,dynamic_y);
dynamic_y++;
//写俄罗斯方块项目的时候经常忘记形参n和m
print_mode_shape(dynamic_num,dynamic_mode,dynamic_x,dynamic_y,dynamic_color);
return 0;
}
3.游戏结束处理有问题,以下是老师上传在慕课代码仓库中的效果:
推测是main.c中的sig_handler()有问题,但是,直接按q退出游戏是正常的
目前想到的方案是把光标重新定个位。
30
收起
正在回答
2回答
整体不错,对之前的代码有很多的优化点。
回答1:我这个函数的前两个if语句主要是判断图形变化的时候的可行性。取的是最极端的边界值坐标。只需要考虑边界值是否触碰即可。你这个还需要考虑画布内已经存储的色块 的触发场景是什么样的?
回答2:可以直接引用全局变量,设计参数是为了函数更好的扩展,要是有特殊需求,使用其他的坐标值,可以通过参数改变,基于此之前设计的时候使用了参数,直接使用全局变量也行。
回答3:
这个是之前的一个隐藏的bug,游戏结束后teorims回显的属性没有写回去。后面好像修复了,晚点我看看git仓库的代码,更新上去。
相似问题
登录后可查看更多问答,登录/注册
物联网/嵌入式工程师
- 参与学习 394 人
- 提交作业 23339 份
- 解答问题 1188 个
行业热门,政策风口,人才缺口极大,现在入场时机正好! 上千人检验,数轮迭代的硬核知识体系,软硬件通吃 保姆式教学+简历指导+1V1模拟面试+3次内推,助力轻松就业!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星