討論:希頂模組
符文水晶製造物品
符文水晶由符文石和紫水晶合成。
我們可以投入一個符文水晶序列,暫定序列長度為3,每個序列對應一個可由製造器生產的物品。在已定義序列外的所有序列對應一個廢熔塊。
我們投入完一個序列(也可以可選打開gui,把當前可合成的方塊顯示在左側,類似於工作檯,單擊後填充到序列框中,如果按shift自動填充完一組)後會顯示當前對應的物品,同時顯示這個物品當前的價值,價值就是我們需要投入多少組符文水晶序列。這時我們可以按shift自動填充完成一組。
按下確認鍵後,我們得到產物,同時更新價值和污染。
序列安排規則:第一位代表分類,第二位代表語義傾向,第三位代表比較任意的修正(參考聯覺)。
- 孢子花是 {x|yfd} 植物 - 掛在上面 - 產生像土一樣的碎屑
- 海綿是 {x|aEx} 軟狀物 - 和水有關 - 可以把水乾燥
技術地
數據結構
1.污染表: 實際上需要計算污染值的是遊戲裡已經加載的區塊,單獨記錄在一張表里(保存在世界文件,而不是區塊文件),未加載區塊就作為邊界條件(不需要存儲,執行擴散的時候考慮到就可以了)。
可以考慮保存到一個字典。
2.製造器: 製造器是方塊,其方塊實體裡保存其製造過的物品的能量值(字典,映射物品ID和能量值)。
能量值實際上和製造器方塊綁定,每個製造器里儲存這個製造器里歷史上製造過的物品(不需要記錄全部物品,這樣可以節省空間)。當能量值落回本底值後可以清除這個物品對應的能量值字典元素,以節省空間。
3.遊戲參數: 下面的數據保存在模組配置文件json里
- 本底污染值(bP):確保污染值不會降到更低的水平。
- 本底能量值(bE):製造器能量的上限。
- 淨化速度(pP)和(pE):定義每個遊戲刻(tick)減去的污染和增加的能量。
- 擴散速度(pD):定義污染進一步擴散到相鄰區塊的速度。
- 物品價格表: 存儲各類物品的基礎價值,以便根據物品類型等屬性查找價格。
- 物品序列對應表。
遊戲機制
1.製造物品過程 通過物品ID從物品價格表中查找該物品的基礎價值, 計算當前需要消耗的價值。
- 價值 = floor(P/E)*基礎價值
根據所在區塊的污染值及當前能量值更新該區塊的污染,並更新製造器該物品的能量值。
- P += 消耗的符文水晶數(實際上是價值*3)
- E = P_old*E/P
如果物品製造成功,則記錄該物品及其能量在製造器的歷史中。
2.污染擴散過程 每隔n刻執行一遍下面的操作:
- 遍歷污染表,求當前區塊和四個鄰域區塊(權=擴散速度(pD))的加權平均值,更新為新值,注意考慮未加載區塊的邊界條件。
3.淨化過程 每隔n刻執行一遍下面的操作:
- 遍歷污染表,利用淨化速度(pP)逐漸降低每個區塊的污染,實現對本底污染值(bP)的約束。
4.能量補充 每隔n刻執行一遍下面的操作:
- 遍歷當前強加載區塊下的製造器方塊實體,利用淨化速度(pE)來增加能量值,確保每個製造器的能量值不超過本底能量值(bE)。
python demo
import math import tkinter as tk bP, bE = 16, 16 # 本底污染和能量 P = [[bP for _ in range(10)] for _ in range(10)] # 污染地图 E = [[1, 1, bE], [5, 5, bE], [3, 3, bE]] # 制造器的坐标和能量 pP, pE = 0.1, 0.06 # 净化速度 pD = 0.5 # 扩散速度 current_iteration = 0 # 当前迭代计数 def make(index): # 一次制造过程 global P, E price = getPrice(index) xy = (E[index][0], E[index][1]) cP = P[xy[0]][xy[1]] cE = E[index][2] make_info = f"迭代: {current_iteration}, 点({xy[0]}, {xy[1]}) 污染: {cP:.2f}, 能量: {cE:.2f}, 价值: {price}" if(price<=256): _P = P[xy[0]][xy[1]] P[xy[0]][xy[1]] += price if P[xy[0]][xy[1]] > 0: E[index][2] = _P * E[index][2] / P[xy[0]][xy[1]] return make_info def getPrice(index): xy = (E[index][0], E[index][1]) return max(math.floor(P[xy[0]][xy[1]] / E[index][2]), 0) * 3 def purify(dtime=1): # 净化污染和能量 global P, E for x in range(len(P)): for y in range(len(P[x])): P[x][y] = max(P[x][y] - dtime * pP, bP) # 确保不低于bP for e in E: e[2] = min(e[2] + dtime * pE, bE) def diff(dtime=1): # 污染扩散 global P new_P = [row[:] for row in P] for x in range(10): for y in range(10): x1, x2 = max(x-1, 0), min(x+1, 9) y1, y2 = max(y-1, 0), min(y+1, 9) new_P[x][y] = (P[x][y] + P[x1][y] * pD + P[x2][y] * pD + P[x][y1] * pD + P[x][y2] * pD) / (1 + 4 * pD) P[:] = new_P def update_display(window, make_info): # 在tk窗口中显示污染和能量 for widget in window.winfo_children(): widget.destroy() # 清空窗口内容 pollution_label = tk.Label(window, text="污染:") pollution_label.pack() # 绘制灰度图 canvas = tk.Canvas(window, width=200, height=200) canvas.pack() # 渲染灰度值,min 固定为 0,max 固定为 255 for x in range(10): for y in range(10): # 计算灰度值 # 这里将污染值归一化到 [0, 255] gray_value = int(255-min(255, max(0, P[x][y]))) # 污染值范围限制在0到255之间 color = f'#{gray_value:02x}{gray_value:02x}{gray_value:02x}' # 转换为颜色格式 canvas.create_rectangle(y * 20, x * 20, (y + 1) * 20, (x + 1) * 20, fill=color, outline='') # 绘制方块 energy_text = "能量:\n" + "\n".join([f"点({e[0]}, {e[1]}): {e[2]:.2f}" for e in E]) energy_label = tk.Label(window, text=energy_text) energy_label.pack() # 添加当前迭代数的标签 iteration_label = tk.Label(window, text=f"当前迭代数: {current_iteration}") iteration_label.pack() make_label = tk.Label(window, text=make_info) make_label.pack() def run_simulation_step(window): global current_iteration if current_iteration >= 1000: return diff() # 先扩散 purify() # 后净化 make_info = "" if current_iteration in range(30, 1000): make_info += make(1) + "\n" if current_iteration in range(0, 1000): make_info += make(0) + "\n" update_display(window, make_info) # 更新窗口内容 current_iteration += 1 def on_key_press(event): # 处理按键事件 run_simulation_step(root) # 用户按键时执行下一步 root = tk.Tk() root.title("污染和能量模拟") root.bind("<Key>", on_key_press) # 绑定按键事件 # 启动主事件循环 root.mainloop()