soft-summer-2021 / summer2021

程序设计实践 (2021夏季学期)
34 stars 6 forks source link

Python中在set_question.py中定义的函数在main.py中引用时会使主程序无法运行 #10

Closed unique021203 closed 3 years ago

unique021203 commented 3 years ago

助教好~想问下我在set_question.py中定义的函数 set_question_air1() set_question_air2() set_question_air3() 在test.py中引用之后会让test.py不能运行是什么原因呀 把引用set_question_air1()注掉之后就可以正常运行了 但加上之后连背景都显示不出来):

代码在这里: https://bhpan.buaa.edu.cn:443/link/D07593C632388B2B23361C3FD52527BE 有效期限:2021-09-03 23:59

辛苦助教啦

dyn1721 commented 3 years ago

不知道你解决了没 我帮你debug了一下 这个程序有时候会卡死有时候正常运行 主要就是因为你使用randrange生成随机数 有时候生成的随机数就会死循环卡死 具体位置是在set_question_air3()函数63行 flag3值永远为1导致这个函数无法跳出卡死

hzy1721 commented 3 years ago

我看了下代码,大概意思是:

创建一个 20x20 的矩阵 poker,在中间 10x10 的区域内放置三架不重叠的飞机,分别是 4x5、5x5、5x5。

是这样吗?

dyn1721 commented 3 years ago

这种代码问题建议学习断点调试 自行debug

unique021203 commented 3 years ago

我看了下代码,大概意思是:

创建一个 20x20 的矩阵 poker,在中间 10x10 的区域内放置三架不重叠的飞机,分别是 4x5、5x5、5x5。

是这样吗?

嗯嗯是这样的

hzy1721 commented 3 years ago

初始化部分 (也就是 set_question_air 函数) 有很多问题要考虑,你目前是在 [5, 15) 范围内随机一个点作为左上角坐标,

(1) 第一个问题是不能保证一定能放下三架飞机,如果第一架正好放在正中间,其他两架就放不下了,需要扩大范围来保证一定能随机放下三架飞机;

(2) 左上角坐标的随机选取也可以优化,比如 5x5 的飞机,左上角坐标肯定不能 >= 11;

(3) 判断飞机能不能放下,目前是只要矩形区域内有一个点不为 0,就判断这个区域放不下,其实不一定,比如下面的 air1air2air2 的机头占用了 air1 矩形区域的一个位置,也是可行的;

0, 0, 1, 0, 0, 0, 0
2, 2, 2, 2, 2, 0, 0
0, 0, 2, 0, 0, 0, 0
0, 2, 2, 2, 1, 0, 0
0, 0, 0, 2, 2, 2, 0
0, 0, 2, 0, 2, 0, 2
0, 0, 0, 0, 2, 0, 0
0, 0, 0, 2, 2, 2, 0

(4) 目前飞机都是朝上的,后续需要引入旋转机制,机头朝四个方向都有可能。

偶尔卡死的原因是放飞机过程中,始终随机不到满足要求的左上角坐标,所以死循环。