<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    數(shù)字溝通

     

    游戲中最近可達(dá)點(diǎn)(用erlang寫一個(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寫一下。


    障礙物通常都不規(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è)試,這里就寫死一個(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

    所以這里我們要寫的一個(gè)輔助函數(shù),最后就是我們的重點(diǎn),取最近點(diǎn),用一個(gè)列表解析就夠了,剩下的就看具體實(shí)現(xiàn)吧,還可以寫個(gè)測(cè)試函數(shù),這次就不寫成單元測(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)寫代碼的人太懶,疑惑也會(huì)增多啊。在nearst_point中用到了一個(gè)小技巧,就是用throw來(lái)跳出循環(huán)(這個(gè)在erlang中還是挺有意思),這次到這,應(yīng)該說(shuō)寫的很基礎(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 閱讀(2884) 評(píng)論(0)  編輯  收藏


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


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

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲AV综合色区无码一区爱AV | 亚洲国产精品无码第一区二区三区| gogo免费在线观看| 亚洲乱码中文字幕综合| 成人黄色免费网址| 亚洲精品第五页中文字幕| 国产美女做a免费视频软件| 国产成人亚洲综合网站不卡| 精品女同一区二区三区免费站| 丰满亚洲大尺度无码无码专线| 亚洲AV无码一区二区二三区软件| 大学生美女毛片免费视频| 亚洲avav天堂av在线网爱情| 巨波霸乳在线永久免费视频| 美女免费视频一区二区| 内射无码专区久久亚洲 | 亚洲毛片网址在线观看中文字幕| 国产亚洲高清在线精品不卡| 亚洲国产人成在线观看69网站| 久久国产精品免费看| 国产亚洲精品精品精品| 亚洲黄色在线观看网站| 很黄很色很刺激的视频免费| 国产在线观看无码免费视频| 亚洲av日韩专区在线观看| 亚洲视频在线观看地址| 在线视频精品免费| 亚洲人成色在线观看| www.亚洲色图| 97在线线免费观看视频在线观看| 亚洲偷自拍另类图片二区| 日本午夜免费福利视频| 99在线热视频只有精品免费| 亚洲精品视频免费观看| 亚洲avav天堂av在线网毛片| 亚洲国产中文在线视频| 麻豆亚洲AV永久无码精品久久| 久草在视频免费福利| 免费A级毛片av无码| 99久久婷婷免费国产综合精品| 国产成人亚洲精品蜜芽影院|