背景:制作一个约分的小程序,点击next后出一道题,点击answer后出示约分答案。
思路:分子、分母选择同一个数的倍数,比如,2的倍数中随机抽两个数,大的当分母,小的当分子。约分用辗转相除法。
感谢Godot Engine群里的NPC给予热心指导,否则不会有这个小程序。
新建一个项目,新建节点Panel
添加节点ColorRect作为背景,调整大小和颜色Color。
添加节点ColorRect作为分数线,调整大小和颜色。
添加3个label,一个做标题“约分小程序”,一个做分子“A”,一个做分母“B”.
注意调整顺序,ColorRect做背景这个置于最上面。(相当于置于底层)。
添加2个按钮,一个做“NEXT”,一个做“Answer”。
另,添加一个标签,监视当前显示的分子分母是谁的倍数。“zu”。
开始美化一下界面。
在C:\windows\Fonts里,自己复制一个字体出来,放到引擎文件夹里。
点击标签A,下面text里先写上A,(写什么都行)
下面,找到CustomFonts,新建一个DynamicFont,点击进去,选择加载,加载之前复制来的字体。
接下来往上一点,调整一下大小,size
同样的方法设置标签B,“约分小程序”。
完成后效果如下图:
上面我也把next这个按钮也添加字体了。
添加两个按钮的信号,(不添加也行,在程序里实现也行。)
然后就是写程序了。
extends Panel
var arr1 = [] #获取2,3,5哪一个数的倍数?2的概率大些
var arr2=[] #2的倍数
var arr3=[] #3的倍数
var arr4=[] #4的倍数
var arr5 = [] #5
var arr6=[] #6的倍数
var arr7=[] #7的倍数
var arr8=[]
var arr9=[]
var zu #组
var zu2 #随机组内数字
var fenzi #分子
var fenmu #分母
var temp1 #临时使分母大于分子
var temp2 #临时使分母大于分子
var temp3 #临时使分母大于分子
var temp4 #辗转相除法
var temp5#辗转相除法
var temp6#辗转相除法
var temp7#辗转相除法
func _ready():
arr1 = [2,2,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9] #让2多一些,多抽分子分母是2的倍数的
arr2 = [2, 4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60] #,22,24,26,28,30,32,34,36,38,40
arr3 = [3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48]
arr4 = [4,8,12,16,20,24,28,32,36,40,44,48,52,56,60]
arr5 = [5,10,15,20,25,30,35,40,45,50,55,60]
arr6 = [ 6,12,18,24,30,36,42,48,54,60,66]
arr7 = [7,14,21,28,35,42,49,56,63,70]
arr8 = [16,24,32,40,48,56,64,72,80]
arr9 = [9,18,27,36,45,54,63,72,81]
$Answer.visible=false# 隐藏答案按钮
func _on_Button_pressed():
zu2=randi() % 18 #所有组内数字的个数 #在0到17中随机一个数字,也就是arr1的组内数字数目
zu=arr1[zu2] #从arr1中挑一个数,可能是2,3,4,...
get_node("zu").text = String(zu) #在屏幕中现实当前是那个组
if zu == 2: #如果抽到2的倍数
fenzi=randi() % 29 #开始同样的方法挑分子分母,
#上面是2的倍数的个数,如果添加的多了就有更多的数
fenmu=randi() % 29
temp1=arr2[fenzi]
temp2=arr2[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
elif zu == 3:
fenzi=randi() % 15
fenmu=randi() % 15#3的倍数的个数
temp1=arr3[fenzi]
temp2=arr3[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
elif zu == 4:
fenzi=randi() % 14
fenmu=randi() % 14#上面数组中4的倍数的个数
temp1=arr4[fenzi]
temp2=arr4[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
elif zu == 5:
fenzi=randi() % 11
fenmu=randi() % 11#上面数组中4的倍数的个数
temp1=arr5[fenzi]
temp2=arr5[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
elif zu == 6:
fenzi=randi() % 10
fenmu=randi() % 10#上面数组中4的倍数的个数
temp1=arr6[fenzi]
temp2=arr6[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
elif zu == 7:
fenzi=randi() % 9
fenmu=randi() % 9#上面数组中4的倍数的个数
temp1=arr7[fenzi]
temp2=arr7[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
elif zu == 8:
fenzi=randi() % 9
fenmu=randi() % 9#上面数组中4的倍数的个数
temp1=arr8[fenzi]
temp2=arr8[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
elif zu == 9:
fenzi=randi() % 8
fenmu=randi() % 8#上面数组中4的倍数的个数
temp1=arr9[fenzi]
temp2=arr9[fenmu]
if temp1 > temp2:
temp3 =temp1
temp1=temp2
temp2=temp3
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
$Answer.visible=true# 显示答案按钮
func _on_Answer_pressed():
temp5=temp2
temp4=temp1
if temp5!=0:
while temp5%temp4!=0:
temp6=temp5%temp4
temp5=temp4
temp4=temp6 #辗转相除法 大数除以小数,如果不余0,用小数除以余数。
temp2=temp2/temp4
temp1=temp1/temp4
get_node("A").text = String(temp1)
get_node("B").text = String(temp2)
#temp1=0
有几个小地方需要做下笔记。
1,按钮的显示和隐藏
$Answer.visible=false # 隐藏答案按钮
$Answer.visible=true # 显示答案按钮
2,获取随机数
fenzi=randi() % 11 #获取0-10的随机数
3,获取数组中的某个数
temp1=arr9[fenzi] #获取数组9中的第fenzi号数。数组中第1个数是0号。
#如
arr=[1,2,3,4,5]
a=arr[1] #a=2
4,新建数组,数组内赋值
var arr1 = []
arr1 = [1,2,3]
5,给label标签赋值
get_node("A").text = String(temp1) #这里的temp1是一个数,所以要变成字符串。
#否则可以这样写
get_node("A").text = "hello,world"
运行测试正常。导出为exe文件。导出的文件是两个,一个是exe的,一个是pck格式。