簡(jiǎn)易語(yǔ)言

          數(shù)字溝通

           

          游戲中最近可達(dá)點(diǎn)(用erlang寫(xiě)一個(gè)簡(jiǎn)單算法)

          游戲中有點(diǎn)擊障礙點(diǎn),人物走到離障礙物最近點(diǎn)的算法。我這給一個(gè)簡(jiǎn)單的算法,這個(gè)問(wèn)題可以復(fù)雜化,另外這個(gè)問(wèn)題應(yīng)該由客戶端來(lái)完成。

          如圖,玩家在b點(diǎn),點(diǎn)擊了a點(diǎn),a在一個(gè)障礙區(qū)(紅色,玩家只能在障礙區(qū)外移到)。這時(shí)候玩家應(yīng)該走到c點(diǎn),我們就需要計(jì)算出c點(diǎn),一個(gè)簡(jiǎn)單的數(shù)學(xué)題,用什么語(yǔ)言都沒(méi)幾行代碼,我就用erlang寫(xiě)一下。


          障礙物通常都不規(guī)則的,我們只能從a點(diǎn)開(kāi)始一個(gè)個(gè)點(diǎn)測(cè)試,直到不是障礙點(diǎn),也就是x自增,y=x*tan(A),然后測(cè)試這個(gè)點(diǎn),地圖數(shù)據(jù)都是靜態(tài)的數(shù)據(jù),方便測(cè)試,這里就寫(xiě)死一個(gè)x為障礙結(jié)束的地方作為障礙檢測(cè)函數(shù)。

          我們還需要一個(gè)記錄表示點(diǎn),tan函數(shù)在erlang中是有的,但其實(shí)可以不用,我們就直接要一個(gè)比值,但需要一個(gè)向上取整的函數(shù),據(jù)說(shuō)是round函數(shù),但測(cè)試一下,不行,難道是因?yàn)椴皇亲钚耾tp
          D:\NetBeanPj\mytest\src>erl
          Eshell V5.8.1.1  (abort with ^G)
          1> round(1.2).
          1

          所以這里我們要寫(xiě)的一個(gè)輔助函數(shù),最后就是我們的重點(diǎn),取最近點(diǎn),用一個(gè)列表解析就夠了,剩下的就看具體實(shí)現(xiàn)吧,還可以寫(xiě)個(gè)測(cè)試函數(shù),這次就不寫(xiě)成單元測(cè)試了。好的我們看代碼:
          -module(nearst_point).

          -export([ceil/1, is_barrier/1, nearst_point/2]).

          -export([p1/0, p2/0, test_1/0]).

          %% 一個(gè)點(diǎn)
          -record(point,{
              x,
              y
                        }).

          %% 向上取整
          ceil(Num) ->
              Num1 = round(Num),
              case Num1 >= Num of
                  true ->
                      Num1;
                  false ->
                      Num1+1
              end.

          %% 判斷是否是障礙物
          is_barrier(Point) ->
              Point#point.x =/= 5 .

          %% 查找最近點(diǎn)
          nearst_point(Pointa,Pointb) ->
              Tan = (Pointa#point.x - Pointb#point.x)/(Pointa#point.y - Pointb#point.y),
              case Pointa#point.x > Pointb#point.y of
                  true ->
                      MaxX = Pointa#point.x,
                      MinX = Pointb#point.x;
                  false ->
                      MaxX = Pointb#point.x,
                      MinX = Pointa#point.x
              end,
              try
                  [
                      begin
                          Point = #point{
                              x = X,
                              y = ceil(X*Tan)},
                          case is_barrier(Point) of
                              true ->
                                  ok;
                              false ->
                                  throw(Point)
                          end
                      end|| X <- lists:seq(MinX, MaxX)]
              catch
                  throw: Point ->
                      io:format("~p", [Point]),
                      Point
              end.

          %% 下面函數(shù)測(cè)試用,可以改成單元測(cè)試,這里就免了
          p1() ->
              #point{
                  x = 1,
                  y = 9}.

          p2() ->
              #point{
                  x = 15,
                  y = 25}.

          test_1() ->
              nearst_point(p1(),p2()).

          編譯和測(cè)試
          2> c(nearst_point).
          {ok,nearst_point}
          3> nearst_point:test_1().
          {point,5,5}{point,5,5}
          4>

          我們的測(cè)試如預(yù)期的在5那個(gè)點(diǎn)得到,好像有個(gè)小問(wèn)題,怎么這個(gè)點(diǎn)輸出了兩次?哦,這不是問(wèn)題,一個(gè)點(diǎn)是代碼里的io輸出的,一個(gè)點(diǎn)是返回給shell,shell的輸出,看來(lái)寫(xiě)代碼的人太懶,疑惑也會(huì)增多啊。在nearst_point中用到了一個(gè)小技巧,就是用throw來(lái)跳出循環(huán)(這個(gè)在erlang中還是挺有意思),這次到這,應(yīng)該說(shuō)寫(xiě)的很基礎(chǔ)很難看。下次會(huì)來(lái)點(diǎn)有意思的,歡迎大家學(xué)習(xí)erlang。


          一種更好的態(tài)度,更好的學(xué)習(xí)、思維方式。它會(huì)是網(wǎng)絡(luò)極佳的生存方式,你喜歡就對(duì)。

          posted on 2011-06-24 23:54 yangyusong 閱讀(2887) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          文章分類

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 江安县| 彩票| 西盟| 康定县| 奈曼旗| 辽源市| 临海市| 罗田县| 高平市| 台南县| 宜昌市| 龙海市| 定日县| 光山县| 永嘉县| 龙里县| 平湖市| 德阳市| 长春市| 阳西县| 武邑县| 盖州市| 义马市| 宜城市| 清远市| 哈密市| 长武县| 伽师县| 周至县| 陇南市| 定日县| 六盘水市| 安顺市| 手机| 昌宁县| 双流县| 庆元县| 论坛| 绵阳市| 福鼎市| 崇明县|