最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

【深圳 IO 攻略】阿瓦隆城第 4 關(guān):電子射擊練習(xí)靶

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

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

關(guān)卡展示

現(xiàn)在有兩名學(xué)員要練習(xí)射擊。你現(xiàn)在要設(shè)計(jì)這么一個(gè)用來(lái)練習(xí)打靶的機(jī)器:

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

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

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

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

但是本題里,存在一個(gè)“下級(jí)向上級(jí)反饋”的過(guò)程。我們的核心芯片在收到打靶信號(hào)后,需要委托下級(jí) A 根據(jù)本次命中的位置計(jì)算得分。然后收到 A 的反饋后,將分差告知另外兩個(gè)用于顯示學(xué)員分?jǐn)?shù)的下級(jí),由它們來(lái)更新顯示器上的數(shù)字。本題里,我們的核心芯片擔(dān)任了“兩頭跑”的任務(wù)。因?yàn)樗獌深^跑,所以位置上放在中間是最合適的。我們先將本題的電路圖搭出來(lái)。每塊芯片我都用注釋的方式解釋了要完成什么任務(wù)。

我們先從兩頭跑的中央芯片開(kāi)始寫(xiě)起。

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

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

現(xiàn)在我們來(lái)寫(xiě)左邊芯片的“計(jì)算得分”的代碼。

兩點(diǎn)間的直線距離涉及到根號(hào)運(yùn)算,可假如我們真的去做根號(hào)運(yùn)算的話,那就過(guò)于復(fù)雜了,而且也沒(méi)有必要。因?yàn)槲覀冴P(guān)心的只是得分,而不關(guān)心得分是由【距離】還是【距離的平方】得來(lái)的。這里我們可以去掉開(kāi)方的過(guò)程,改為將【距離的平方】和得分建立如下的映射關(guān)系:

  • 當(dāng) d2 < 100 時(shí),得分 +4;

  • 當(dāng) 100 ≤ d2 < 400 時(shí),得分 +2;

  • 當(dāng) 400?≤ d2 < 900 時(shí),得分 +1;

  • 當(dāng) d2 ≥ 900 時(shí),得分 -2。

由于 MC 系列芯片在計(jì)算的過(guò)程中,出現(xiàn)上溢時(shí)會(huì)自動(dòng)取 999,所以 d2 和得分的映射關(guān)系只和 d2 的百位相關(guān)。我們可以在計(jì)算完 d2 后取百位,然后通過(guò) ROM 查表的方式來(lái)獲得得分。我們的 ROM 里,0 ~ 9 的地址對(duì)應(yīng)著不同的 d2 的百位,而每個(gè)格子表示【當(dāng)前的 d2 百位所對(duì)應(yīng)的得分】。當(dāng)我們得到 d2 的百位,并將 ROM 的地址置為該數(shù)字后,讀一次數(shù)據(jù)口,即得到了當(dāng)前距離下的得分。

那么我們現(xiàn)在來(lái)看代碼。根據(jù)題目提示,靶心的位置在 (50, 50)。那么我們只要計(jì)算 (y - 50)2 + (x - 50)2,即可得到 d2 的值。首先我們等待中央芯片的喚醒信號(hào)(slx x0)。喚醒后,我們首先計(jì)算?(y - 50)2 這部分的值(mov p0 acc, sub x0, mul acc),將該部分的值存入 dat 備用(mov acc dat)。注意以上的 -50 的部分(sub x0),必須使用 sub x0,不能使用 sub 50。因?yàn)槲覀儽仨殞⒅醒胄酒l(fā)來(lái)的常數(shù) 50 給吸收掉,否則會(huì)導(dǎo)致運(yùn)行時(shí)阻塞。接下來(lái)我們繼續(xù)計(jì)算?(x - 50)2 這部分的值(mov p1?acc, sub 50, mul acc)。計(jì)算完畢后,加上原先存在 dat 里的?(y - 50)2,即得到了 d2 的值(add dat)。此時(shí)我們?nèi)〕鲈撝档陌傥粩?shù)(dgt 2),將 ROM 地址置為該數(shù)字(mov acc x3),讀取對(duì)應(yīng)地址處的得分?jǐn)?shù)字,并回傳給中央芯片,即完成本次任務(wù)(mov x2?x0)。

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

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

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

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

點(diǎn)擊左下角的【模擬】,稍等片刻,便會(huì)彈出結(jié)算界面:


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

分享到微博請(qǐng)遵守國(guó)家法律
故城县| 贵港市| 娱乐| 于田县| 宁强县| 平江县| 枣阳市| 蚌埠市| 平顶山市| 利辛县| 惠东县| 突泉县| 玉屏| 东方市| 基隆市| 南江县| 平邑县| 阿勒泰市| 丹东市| 喀喇沁旗| 光泽县| 突泉县| 寻甸| 宜川县| 永丰县| 琼结县| 北川| 渭南市| 乌兰察布市| 察雅县| 阳原县| 葫芦岛市| 铜陵市| 顺平县| 外汇| 陈巴尔虎旗| 固镇县| 尖扎县| 泽库县| 舞阳县| 南京市|