五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網 會員登陸 & 注冊

【深圳 IO 攻略】阿瓦隆城第 4 關:電子射擊練習靶

2022-06-28 15:33 作者:ココアお姉ちゃん  | 我要投稿

本文首發(fā)于 B 站《深圳 IO》文集(https://www.bilibili.com/read/readlist/rl569860)。原創(chuàng)不易,轉載請注明出處。

關卡展示

現在有兩名學員要練習射擊。你現在要設計這么一個用來練習打靶的機器:

  • 每一發(fā)的得分是根據命中位置和靶心間的直線距離決定的,(x0, y0) 和 (x1, y1) 間的距離的計算方法是初中知識,在座的各位應該都知道:根號[(y1 - y0)2 + (x1 - x0)2]。設命中位置和靶心的距離為 d,當 d < 10 時,得分 +4;當 10 ≤ d < 20 時,得分 +2;當 20 ≤ d < 30 時,得分 + 1;當 d ≥ 30 時,得分 -2。

  • 初始狀態(tài)下,打靶機上不顯示任何數字。兩名學員各發(fā)射 4 發(fā)子彈。從學員 1?發(fā)射第 1 發(fā)子彈開始,到學員 2?發(fā)射完第 4 發(fā)子彈為止,打靶機上要保持顯示兩名學員的實時分數。等 8?發(fā)子彈全部發(fā)射完畢后,顯示器將最終得分閃爍?3 次后關閉。

  • 本次的顯示器和我們以往遇到的顯示器不一樣。以往的顯示器只要發(fā)送一次數字就可以保持顯示該數字,直到發(fā)送 -999 才關閉;這次的顯示器如果你需要維持顯示,那么必須不間斷地發(fā)送數字。只要某一秒內你沒有發(fā)送數字,顯示器就會關閉。

又是一道分工合作的題。當然這次的分工合作比起第 1 關的“流水線”還是要復雜一點的?;仡櫼幌碌?1?關:總監(jiān)把存/取的任務類型通過廣播通知一下,然后將要存/取的食品編號告訴數據庫管理員芯片,就去睡覺了;管理員修改了數據庫以后,通知完了后面的工人芯片后,也去睡覺了。直到最后工人忙完,一項任務就自然完成了。整個流程就是從上到下一層一層傳話,下級干完了自己的事情也不需要向上級匯報的那種。

但是本題里,存在一個“下級向上級反饋”的過程。我們的核心芯片在收到打靶信號后,需要委托下級 A 根據本次命中的位置計算得分。然后收到 A 的反饋后,將分差告知另外兩個用于顯示學員分數的下級,由它們來更新顯示器上的數字。本題里,我們的核心芯片擔任了“兩頭跑”的任務。因為它要兩頭跑,所以位置上放在中間是最合適的。我們先將本題的電路圖搭出來。每塊芯片我都用注釋的方式解釋了要完成什么任務。

我們先從兩頭跑的中央芯片開始寫起。

本芯片的 acc 寄存器用來記錄已經發(fā)出去的子彈數量。首先檢查【檢測】端口是不是激活狀態(tài)(tcp p0 50)。當該端口為 100 時,說明有學員發(fā)射了 1 發(fā)子彈,令已發(fā)子彈數量 +1(+ add 1),然后將新的已發(fā)子彈數量同步到廣播信號上去,供右側的芯片反復使用(+ mov acc p1)。每擊出?1 發(fā)子彈,我們都需要給左側芯片發(fā)一個常數 50 喚醒它,委托它計算本回合的得分(+ mov 50 x1)。等待左側芯片將本次射擊的得分計算完畢后,我們接收從左側芯片回傳的得分數字,并發(fā)往右邊的芯片,喚醒它們去更新顯示器上的數字(+ mov x1 x3)。而如果本秒里【檢測】端口的值為 0,說明沒有學員發(fā)射子彈,本秒的學員得分自然就是 0,我們需要往右側的芯片里發(fā)送 0。但我們要注意,題目要求打了第一槍以后顯示屏才亮,所以僅當已發(fā)子彈數量不為 0 時,我們才能喚醒它們,請它們點亮顯示屏(- teq acc 0, - mov 0 x3)。做完了兩頭跑的工作后,休眠一秒,進入下一個機器周期(slp 1)。此時,若前一秒鐘發(fā)射了子彈,且發(fā)射的是第 8 發(fā)子彈(+ teq acc 8),則同時清空 acc 寄存器和廣播信號,將已發(fā)彈藥數清零,準備開啟下一輪練習(+ mov p1 acc)。

為什么 teq acc 8 這條判斷要加上 + 號呢?因為,當前一秒鐘發(fā)射了第 8 發(fā)子彈時,這一秒鐘就會立刻將已發(fā)子彈數清零。所以可以反推出,值為 8 的 acc 只能存活 1 秒鐘,且存活的那 1 秒里,【檢測】信號一定是 100。因此,根據【原命題和逆否命題等價】的原則,如果前一秒的【檢測】信號是 0,那 acc 的值一定不是 8。所以我們將 teq acc 8 這條測試指令加上了 + 號,這樣可以確保前一秒的【檢測】信號為 0,+ 號指令未激活時,跳過這條必然不成立的判斷,節(jié)省電量。

現在我們來寫左邊芯片的“計算得分”的代碼。

兩點間的直線距離涉及到根號運算,可假如我們真的去做根號運算的話,那就過于復雜了,而且也沒有必要。因為我們關心的只是得分,而不關心得分是由【距離】還是【距離的平方】得來的。這里我們可以去掉開方的過程,改為將【距離的平方】和得分建立如下的映射關系:

  • 當 d2 < 100 時,得分 +4;

  • 當 100 ≤ d2 < 400 時,得分 +2;

  • 當 400?≤ d2 < 900 時,得分 +1;

  • 當 d2 ≥ 900 時,得分 -2。

由于 MC 系列芯片在計算的過程中,出現上溢時會自動取 999,所以 d2 和得分的映射關系只和 d2 的百位相關。我們可以在計算完 d2 后取百位,然后通過 ROM 查表的方式來獲得得分。我們的 ROM 里,0 ~ 9 的地址對應著不同的 d2 的百位,而每個格子表示【當前的 d2 百位所對應的得分】。當我們得到 d2 的百位,并將 ROM 的地址置為該數字后,讀一次數據口,即得到了當前距離下的得分。

那么我們現在來看代碼。根據題目提示,靶心的位置在 (50, 50)。那么我們只要計算 (y - 50)2 + (x - 50)2,即可得到 d2 的值。首先我們等待中央芯片的喚醒信號(slx x0)。喚醒后,我們首先計算?(y - 50)2 這部分的值(mov p0 acc, sub x0, mul acc),將該部分的值存入 dat 備用(mov acc dat)。注意以上的 -50 的部分(sub x0),必須使用 sub x0,不能使用 sub 50。因為我們必須將中央芯片發(fā)來的常數 50 給吸收掉,否則會導致運行時阻塞。接下來我們繼續(xù)計算?(x - 50)2 這部分的值(mov p1?acc, sub 50, mul acc)。計算完畢后,加上原先存在 dat 里的?(y - 50)2,即得到了 d2 的值(add dat)。此時我們取出該值的百位數(dgt 2),將 ROM 地址置為該數字(mov acc x3),讀取對應地址處的得分數字,并回傳給中央芯片,即完成本次任務(mov x2?x0)。

最后是右邊兩塊用于控制顯示器數碼管的芯片。代碼如下:

這兩塊芯片的代碼除了第 2~3?行的判斷不一樣以外,完全一致。首先都是等待中央芯片發(fā)來喚醒信號(slx x1)。中央芯片發(fā)送的是本秒內的射擊得分。由于這個得分數字只發(fā)一次,所以兩塊芯片中有且只有一塊芯片能接收這個得分數字。此時我們需要判斷已發(fā)子彈數量是?≤ 4 還是 > 4(tcp p0 5 / tcp p0 4)。當已發(fā)子彈數量?≤?4 時,正在行動的是 1 號學員,此時得分應該累加在 1 號學員身上,理應由管理 1 號學員的下方芯片接收這個分數值(- add x1);而當已發(fā)子彈數量 > 4 時,正在行動的是 2 號學員,此時得分應該累加在 2 號學員身上,理應由管理 2 號學員的上方芯片接收這個分數值(+ add x1)。

更新完了學員的得分后,兩塊芯片都將各自學員的實時得分發(fā)送到各自的輸出端口(mov acc x2)。此時我們需要判斷是否發(fā)完了所有 8 發(fā)子彈(+ teq p0?8)。如果沒有發(fā)完,那就跳回到第 1 行,重新等待喚醒;當發(fā)完了 8 發(fā)子彈后,我們需要令顯示器閃爍 3 次(共計 3 個 + slp 2 和?+ mov acc x2),并將各自的得分清零,準備開啟下一輪練習(+ sub acc)。

為什么這兩塊芯片里的 teq p0 8 這條判斷也都加上了 + 號呢?因為當 p0 = 8 時,一定同時滿足 p0 > 5(下方芯片 + 號)和 p0 > 4(上方芯片 + 號)的條件。根據【原命題和逆否命題等價】的原則,當?p0?滿足 p0 ≤ 5 和?p0 ≤ 4?中的至少一個條件時,p0 一定不等于 8。所以只有在 + 號指令激活的時候,執(zhí)行這條判斷才有意義。+ 號指令未激活時,我們完全可以跳過這條必然不成立的判斷,節(jié)省電量。

點擊左下角的【模擬】,稍等片刻,便會彈出結算界面:


【深圳 IO 攻略】阿瓦隆城第 4 關:電子射擊練習靶的評論 (共 條)

分享到微博請遵守國家法律
荃湾区| 南郑县| 沈丘县| 霍林郭勒市| 平阳县| 郸城县| 旬邑县| 石嘴山市| 云浮市| 汶上县| 南汇区| 北安市| 广东省| 康平县| 且末县| 钦州市| 伽师县| 吉水县| 木兰县| 庄浪县| 张家港市| 托克逊县| 宝兴县| 柳河县| 盐边县| 新民市| 贵溪市| 安阳县| 奎屯市| 卓尼县| 穆棱市| 吉首市| 拉孜县| 鄂托克前旗| 霍邱县| 中江县| 丹江口市| 镇远县| 观塘区| 南岸区| 石景山区|