zoukankan      html  css  js  c++  java
  • book.luaer.cn

    实习结束了,在这里总结下实习的相关事宜。

    我去年十一月份入职的,刚入公司技术部人很少,我选择的是服务端开发,服务端就三四个人,客户端倒是有五六个人。第一天上班就是打开电脑,安装一些需要的工具。公司的做的产品是手游,主要使用的是脚本语言lua(不出名?魔兽就是用lua写的)。对于lua语言,我是很陌生的,所以安装完必备的工具后就开始学习lua了。我选择的教程是http://book.luaer.cn/(现在查api使用的是http://www.codingnow.com/2000/download/lua_manual.html)。大概花了1天时间把lua的语法了解了下。然后老大就安排了一个小东西给我实现,控制台版的小游戏(仅仅是模拟而已),实现主城,商店,战斗(很简易的,后面会给出源代码,不要喷哈)。

    这款游戏是重0开始的,没有现成的engine。都是从底层架构开始的,使用c实现网络模块和内存数据库模块。前期我负责写网络协议的压包和解包,遇到的最大的困难是c和lua的数据交互,经过老大的指导和自己的钻研,把交互栈搞明白了(写过如何交互的技术博文,需要的给我发邮件)。加包就是序列化,解包就是反序列化,将序列化的数据用于网络传输,网络收发模块是一个同事写的(这两个模块最后都没有采纳,老大自己重写了,看了他写的代码后确实佩服,清晰易懂)。

    在这每天晚上9点是有个例会的(21点?是的,游戏公司都会加班)。例会上主要是总结下今天做了什么,遇到了什么问题,完成了什么任务,什么任务没有完成,后续的计划等等。而且每个月经理都会和我们谈一次话,聊聊这个月做的事情啊,生活上的和工作上的都会聊聊。这方式不错,经理能够及时掌握员工的工作状态是很好的。

    底层模块基本实现之后,接下来的就是实现一些逻辑模块,分给我的是背包系统,包括道具,装备和铁匠铺。由于我大学期间不玩网游,对游戏的不认识太多了,公司都会叫我们玩玩网游,了解下模块和功能,然后就试着去实现。我个人感觉游戏都不好玩,但是为了了解是怎么实现的,我还是会玩玩的,游戏的剧情我就不看了,专门挑系统的功能。

    公司规定每天加班,单休。加班确实累了点,但是学到的东西还是挺多的,关于游戏逻辑,我实现了背包,铁匠铺,道具,装备,聊天系统,我是从一开始就跟着底层模块开始建立的,对底层模块还是比较了解的,所以实现逻辑模块比较简单。到现在快有4个月了,公司也给我提前转正了,在服务端我也算元老级人物了,陆陆续续换了好多人了。希望游戏能够取得成功。

    HelloLua
    1 function clear()
      2 --linux下为
      3 --    os.execute("clear")
      4 --windows下为
      5     os.execute("cls")
      6 end;
      7 
      8 --输入选项
      9 function inputSelect(s,n)
     10     io.write(s)
     11     if n == nil then
     12         n = 1
     13     end;
     14     return io.read(n)
     15 end;
     16 
     17 --buy somthing
     18 function buySomething(p,s,n)
     19     if p.wallet > n then
     20         if s == "ATK" then
     21             p.ATK = p.ATK + n
     22         elseif s == "DEF" then
     23             p.DEF = p.DEF + n
     24         elseif s == "HP" then
     25             p.HP = p.HP + n
     26         end;
     27         p.wallet = p.wallet - n
     28     else
     29         print("your haven't more money to buy it")
     30     end;
     31 end;
     32 
     33 --show stat
     34 function show_stat(p)
     35     io.write("ATK:\t"..p.ATK.."\n")
     36     io.write("DEF:\t"..p.DEF.."\n")
     37     io.write("HP:\t"..p.HP.."\n")
     38     io.write("wallet:\t"..p.wallet.."\n")
     39     sleep(3)
     40 end;
     41 
     42 --进入商店
     43 function goto_shop()
     44     clear()
     45     print("you are in shop now.")
     46     print("1. buy ATK")
     47     print("2. buy DEF")
     48     print("3. buy HP")
     49     print("0. back")
     50     input = inputSelect("please input number:")
     51     if input == "1" then
     52         buySomething(P,"ATK",1)
     53         print("you buy ATK OK!")
     54         show_stat(P)
     55     elseif input == "2" then
     56         buySomething(P,"DEF",1)
     57         print("you buy ATK OK!")
     58         show_stat(P)
     59     elseif input == "3" then
     60         buySomething(P,"HP",1)
     61         print("you buy ATK OK!")
     62         show_stat(P)
     63     elseif input == "0" then
     64         show_welcome()
     65     else
     66         goto_shop()
     67     end;
     68     goto_shop()
     69 end;
     70 
     71 --显示战场
     72 function show_battlefield()
     73     clear()
     74     print("PKing")
     75     io.write("Person:\tyou\tmonster\n")
     76 end;
     77 
     78 --A hit B
     79 function AhitB(A, B)
     80     B.HP = B.HP -  A.ATK / B.DEF
     81 --    B.HP = B.HP - 30
     82 end;
     83 
     84 function show_result(p,e)
     85     io.write("ATK:\t"..p.ATK.."\t"..e.ATK.."\n")
     86     io.write("DEF:\t"..p.DEF.."\t"..e.DEF.."\n")
     87     io.write("HP:\t"..p.HP.."\t"..e.HP.."\n")
     88 end;
     89 
     90 --时间暂停n秒
     91 function sleep(n)
     92     t = os.time()
     93     while os.time() - t < n do
     94     end;
     95 end;
     96 
     97 --战场,返回false则战败,返回true则胜利
     98 function battlefield(p,e)
     99     while true do
    100         --p hit e
    101         if p.HP <= 0 then
    102             return false
    103         end;
    104         AhitB(p,e)
    105         show_battlefield()
    106         io.write("\tyou hit moster\n")
    107         show_result(p,e)
    108         sleep(1)
    109 
    110         --e hit p
    111         if e.HP <= 0 then
    112             return true
    113         end;
    114         AhitB(e,p)
    115         show_battlefield()
    116         io.write("\tmoster hit you\n")
    117         show_result(p,e)
    118         sleep(1)
    119     end;
    120 end;
    121 
    122 
    123 --进入战场选择菜单
    124 function goto_battlefield()
    125     clear()
    126 
    127     print("you are in battlefield now.")
    128     print("1. low level battlefield")
    129     print("2. intermediate battlefield")
    130     print("3. advanced battlefield")
    131     print("0. back")
    132     input = inputSelect("please choose battlefield:")
    133     if input == "1" then
    134         print("in here")
    135         E = {
    136             ATK    = E1.ATK,
    137             DEF    = E1.DEF,
    138             HP     = E1.HP}
    139         if battlefield(P,E) then
    140             goto_battlefield()
    141             print("you win")
    142             P.HP = P.HP + 10
    143             sleep(2)
    144         else
    145             print("you die")
    146             print("GAME OVER")
    147         end;
    148     elseif input == "2" then
    149         E = {
    150             ATK    = E2.ATK,
    151             DEF    = E2.DEF,
    152             HP     = E2.HP}
    153         if battlefield(P,E) then
    154             goto_battlefield()
    155             print("you win")
    156             P.HP = P.HP + 10
    157             P.wallet = P.wallet + 10
    158             sleep(2)
    159         else
    160             print("you die")
    161             print("GAME OVER")
    162         end;
    163     elseif input == "3" then
    164             E = {
    165             ATK    = E3.ATK,
    166             DEF    = E3.DEF,
    167             HP     = E3.HP}
    168         if battlefield(P,E) then
    169             goto_battlefield()
    170             print("you win")
    171             P.HP = P.HP + 20
    172             P.wallet = P.wallet + 10
    173             P.ATK = P.ATK + 5
    174             P.DEF = P.DEF + 5
    175             sleep(2)
    176         else
    177             print("you die")
    178             print("GAME OVER")
    179         end;
    180     elseif input == "0" then
    181         show_welcome()
    182     else
    183         goto_battlefield()
    184     end;
    185 end;
    186 
    187 function show_welcome()
    188     clear()
    189     print("======welcome to battle game======")
    190     io.write("\tplease choose entrance\n")
    191     print("1. shop")
    192     print("2. battlefield entrance")
    193     print("0. exit")
    194     input = inputSelect("please input number of the entrance:")
    195     if input == "1" then
    196         goto_shop()
    197     elseif input == "2" then
    198         goto_battlefield()
    199     elseif input == "0" then
    200         os.exit()
    201     else
    202         show_welcome()
    203     end;
    204 end;
    205 
    206 P = {
    207     wallet = 100,
    208     ATK    = 100,
    209     DEF    = 100,
    210     HP     = 100}
    211 E1 = {
    212     ATK    = 10,
    213     DEF    = 10,
    214     HP     = 100}
    215 
    216 E2 = {
    217     ATK    = 20,
    218     DEF    = 20,
    219     HP     = 100}
    220 E3 = {
    221     ATK    = 30,
    222     DEF    = 30,
    223     HP     = 100}
    224 
    225 show_welcome()
    226 
    227 
    228 
    229 --字符串相似度算法 lua 实现
    230 function EditDistance( s, t, lim )  
    231     local s_len, t_len = #s, #t -- Calculate the sizes of the strings or arrays  
    232     if lim and math.abs( s_len - t_len ) >= lim then -- If sizes differ by lim, we can stop here  
    233         return lim  
    234     end  
    235       
    236     -- Convert string arguments to arrays of ints (ASCII values)  
    237     if type( s ) == "string" then  
    238         s = { string.byte( s, 1, s_len ) }  
    239     end  
    240       
    241     if type( t ) == "string" then  
    242         t = { string.byte( t, 1, t_len ) }  
    243     end  
    244       
    245     local min = math.min -- Localize for performance  
    246     local num_columns = t_len + 1 -- We use this a lot  
    247       
    248     local d = {} -- (s_len+1) * (t_len+1) is going to be the size of this array  
    249     -- This is technically a 2D array, but we're treating it as 1D. Remember that 2D access in the  
    250     -- form my_2d_array[ i, j ] can be converted to my_1d_array[ i * num_columns + j ], where  
    251     -- num_columns is the number of columns you had in the 2D array assuming row-major order and  
    252     -- that row and column indices start at 0 (we're starting at 0).  
    253       
    254     for i=0, s_len do  
    255         d[ i * num_columns ] = i -- Initialize cost of deletion  
    256     end  
    257     for j=0, t_len do  
    258         d[ j ] = j -- Initialize cost of insertion  
    259     end  
    260       
    261     for i=1, s_len do  
    262         local i_pos = i * num_columns  
    263         local best = lim -- Check to make sure something in this row will be below the limit  
    264         for j=1, t_len do  
    265             local add_cost = (s[ i ] ~= t[ j ] and 1 or 0)  
    266             local val = min(  
    267                 d[ i_pos - num_columns + j ] + 1,                               -- Cost of deletion  
    268                 d[ i_pos + j - 1 ] + 1,                                         -- Cost of insertion  
    269                 d[ i_pos - num_columns + j - 1 ] + add_cost                     -- Cost of substitution, it might not cost anything if it's the same  
    270             )  
    271             d[ i_pos + j ] = val  
    272               
    273             -- Is this eligible for tranposition?  
    274             if i > 1 and j > 1 and s[ i ] == t[ j - 1 ] and s[ i - 1 ] == t[ j ] then  
    275                 d[ i_pos + j ] = min(  
    276                     val,                                                        -- Current cost  
    277                     d[ i_pos - num_columns - num_columns + j - 2 ] + add_cost   -- Cost of transposition  
    278                 )  
    279             end  
    280               
    281             if lim and val < best then  
    282                 best = val  
    283             end  
    284         end  
    285           
    286         if lim and best >= lim then  
    287             return lim  
    288         end  
    289     end  
    290       
    291     return d[ #d ]  
    292 end
    293 -- 判断字符串是否相似
    294 function isStringLike(str1, str2)
    295     local similarity =  EditDistance(str1,str2,1)
    296     -- 相似:相似度大于字符串长度的一半
    297     if similarity > #str1/2 and similarity > #str2/2 then
    298         return true
    299     else
    300         return false
    301     end
    302 end
    复制代码
      1 function clear()
      2 --linux下为
      3 --    os.execute("clear")
      4 --windows下为
      5     os.execute("cls")
      6 end;
      7 
      8 --输入选项
      9 function inputSelect(s,n)
     10     io.write(s)
     11     if n == nil then
     12         n = 1
     13     end;
     14     return io.read(n)
     15 end;
     16 
     17 --buy somthing
     18 function buySomething(p,s,n)
     19     if p.wallet > n then
     20         if s == "ATK" then
     21             p.ATK = p.ATK + n
     22         elseif s == "DEF" then
     23             p.DEF = p.DEF + n
     24         elseif s == "HP" then
     25             p.HP = p.HP + n
     26         end;
     27         p.wallet = p.wallet - n
     28     else
     29         print("your haven't more money to buy it")
     30     end;
     31 end;
     32 
     33 --show stat
     34 function show_stat(p)
     35     io.write("ATK:\t"..p.ATK.."\n")
     36     io.write("DEF:\t"..p.DEF.."\n")
     37     io.write("HP:\t"..p.HP.."\n")
     38     io.write("wallet:\t"..p.wallet.."\n")
     39     sleep(3)
     40 end;
     41 
     42 --进入商店
     43 function goto_shop()
     44     clear()
     45     print("you are in shop now.")
     46     print("1. buy ATK")
     47     print("2. buy DEF")
     48     print("3. buy HP")
     49     print("0. back")
     50     input = inputSelect("please input number:")
     51     if input == "1" then
     52         buySomething(P,"ATK",1)
     53         print("you buy ATK OK!")
     54         show_stat(P)
     55     elseif input == "2" then
     56         buySomething(P,"DEF",1)
     57         print("you buy ATK OK!")
     58         show_stat(P)
     59     elseif input == "3" then
     60         buySomething(P,"HP",1)
     61         print("you buy ATK OK!")
     62         show_stat(P)
     63     elseif input == "0" then
     64         show_welcome()
     65     else
     66         goto_shop()
     67     end;
     68     goto_shop()
     69 end;
     70 
     71 --显示战场
     72 function show_battlefield()
     73     clear()
     74     print("PKing")
     75     io.write("Person:\tyou\tmonster\n")
     76 end;
     77 
     78 --A hit B
     79 function AhitB(A, B)
     80     B.HP = B.HP -  A.ATK / B.DEF
     81 --    B.HP = B.HP - 30
     82 end;
     83 
     84 function show_result(p,e)
     85     io.write("ATK:\t"..p.ATK.."\t"..e.ATK.."\n")
     86     io.write("DEF:\t"..p.DEF.."\t"..e.DEF.."\n")
     87     io.write("HP:\t"..p.HP.."\t"..e.HP.."\n")
     88 end;
     89 
     90 --时间暂停n秒
     91 function sleep(n)
     92     t = os.time()
     93     while os.time() - t < n do
     94     end;
     95 end;
     96 
     97 --战场,返回false则战败,返回true则胜利
     98 function battlefield(p,e)
     99     while true do
    100         --p hit e
    101         if p.HP <= 0 then
    102             return false
    103         end;
    104         AhitB(p,e)
    105         show_battlefield()
    106         io.write("\tyou hit moster\n")
    107         show_result(p,e)
    108         sleep(1)
    109 
    110         --e hit p
    111         if e.HP <= 0 then
    112             return true
    113         end;
    114         AhitB(e,p)
    115         show_battlefield()
    116         io.write("\tmoster hit you\n")
    117         show_result(p,e)
    118         sleep(1)
    119     end;
    120 end;
    121 
    122 
    123 --进入战场选择菜单
    124 function goto_battlefield()
    125     clear()
    126 
    127     print("you are in battlefield now.")
    128     print("1. low level battlefield")
    129     print("2. intermediate battlefield")
    130     print("3. advanced battlefield")
    131     print("0. back")
    132     input = inputSelect("please choose battlefield:")
    133     if input == "1" then
    134         print("in here")
    135         E = {
    136             ATK    = E1.ATK,
    137             DEF    = E1.DEF,
    138             HP     = E1.HP}
    139         if battlefield(P,E) then
    140             goto_battlefield()
    141             print("you win")
    142             P.HP = P.HP + 10
    143             sleep(2)
    144         else
    145             print("you die")
    146             print("GAME OVER")
    147         end;
    148     elseif input == "2" then
    149         E = {
    150             ATK    = E2.ATK,
    151             DEF    = E2.DEF,
    152             HP     = E2.HP}
    153         if battlefield(P,E) then
    154             goto_battlefield()
    155             print("you win")
    156             P.HP = P.HP + 10
    157             P.wallet = P.wallet + 10
    158             sleep(2)
    159         else
    160             print("you die")
    161             print("GAME OVER")
    162         end;
    163     elseif input == "3" then
    164             E = {
    165             ATK    = E3.ATK,
    166             DEF    = E3.DEF,
    167             HP     = E3.HP}
    168         if battlefield(P,E) then
    169             goto_battlefield()
    170             print("you win")
    171             P.HP = P.HP + 20
    172             P.wallet = P.wallet + 10
    173             P.ATK = P.ATK + 5
    174             P.DEF = P.DEF + 5
    175             sleep(2)
    176         else
    177             print("you die")
    178             print("GAME OVER")
    179         end;
    180     elseif input == "0" then
    181         show_welcome()
    182     else
    183         goto_battlefield()
    184     end;
    185 end;
    186 
    187 function show_welcome()
    188     clear()
    189     print("======welcome to battle game======")
    190     io.write("\tplease choose entrance\n")
    191     print("1. shop")
    192     print("2. battlefield entrance")
    193     print("0. exit")
    194     input = inputSelect("please input number of the entrance:")
    195     if input == "1" then
    196         goto_shop()
    197     elseif input == "2" then
    198         goto_battlefield()
    199     elseif input == "0" then
    200         os.exit()
    201     else
    202         show_welcome()
    203     end;
    204 end;
    205 
    206 P = {
    207     wallet = 100,
    208     ATK    = 100,
    209     DEF    = 100,
    210     HP     = 100}
    211 E1 = {
    212     ATK    = 10,
    213     DEF    = 10,
    214     HP     = 100}
    215 
    216 E2 = {
    217     ATK    = 20,
    218     DEF    = 20,
    219     HP     = 100}
    220 E3 = {
    221     ATK    = 30,
    222     DEF    = 30,
    223     HP     = 100}
    224 
    225 show_welcome()
    226 
    227 
    228 
    229 --字符串相似度算法 lua 实现
    230 function EditDistance( s, t, lim )  
    231     local s_len, t_len = #s, #t -- Calculate the sizes of the strings or arrays  
    232     if lim and math.abs( s_len - t_len ) >= lim then -- If sizes differ by lim, we can stop here  
    233         return lim  
    234     end  
    235       
    236     -- Convert string arguments to arrays of ints (ASCII values)  
    237     if type( s ) == "string" then  
    238         s = { string.byte( s, 1, s_len ) }  
    239     end  
    240       
    241     if type( t ) == "string" then  
    242         t = { string.byte( t, 1, t_len ) }  
    243     end  
    244       
    245     local min = math.min -- Localize for performance  
    246     local num_columns = t_len + 1 -- We use this a lot  
    247       
    248     local d = {} -- (s_len+1) * (t_len+1) is going to be the size of this array  
    249     -- This is technically a 2D array, but we're treating it as 1D. Remember that 2D access in the  
    250     -- form my_2d_array[ i, j ] can be converted to my_1d_array[ i * num_columns + j ], where  
    251     -- num_columns is the number of columns you had in the 2D array assuming row-major order and  
    252     -- that row and column indices start at 0 (we're starting at 0).  
    253       
    254     for i=0, s_len do  
    255         d[ i * num_columns ] = i -- Initialize cost of deletion  
    256     end  
    257     for j=0, t_len do  
    258         d[ j ] = j -- Initialize cost of insertion  
    259     end  
    260       
    261     for i=1, s_len do  
    262         local i_pos = i * num_columns  
    263         local best = lim -- Check to make sure something in this row will be below the limit  
    264         for j=1, t_len do  
    265             local add_cost = (s[ i ] ~= t[ j ] and 1 or 0)  
    266             local val = min(  
    267                 d[ i_pos - num_columns + j ] + 1,                               -- Cost of deletion  
    268                 d[ i_pos + j - 1 ] + 1,                                         -- Cost of insertion  
    269                 d[ i_pos - num_columns + j - 1 ] + add_cost                     -- Cost of substitution, it might not cost anything if it's the same  
    270             )  
    271             d[ i_pos + j ] = val  
    272               
    273             -- Is this eligible for tranposition?  
    274             if i > 1 and j > 1 and s[ i ] == t[ j - 1 ] and s[ i - 1 ] == t[ j ] then  
    275                 d[ i_pos + j ] = min(  
    276                     val,                                                        -- Current cost  
    277                     d[ i_pos - num_columns - num_columns + j - 2 ] + add_cost   -- Cost of transposition  
    278                 )  
    279             end  
    280               
    281             if lim and val < best then  
    282                 best = val  
    283             end  
    284         end  
    285           
    286         if lim and best >= lim then  
    287             return lim  
    288         end  
    289     end  
    290       
    291     return d[ #d ]  
    292 end
    293 -- 判断字符串是否相似
    294 function isStringLike(str1, str2)
    295     local similarity =  EditDistance(str1,str2,1)
    296     -- 相似:相似度大于字符串长度的一半
    297     if similarity > #str1/2 and similarity > #str2/2 then
    298         return true
    299     else
    300         return false
    301     end
    302 end
    复制代码

    作者:涵曦涵曦的技术博客 - 博客园
    微博:t.qq.com/hanxi1203 
    出处:hanxi.cnblogs.com 
    GitHub:github.com/hanxi
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     
    分类: 随感
  • 相关阅读:
    python-TCP传输模型
    python-锁机制
    python-生产者消费者模式
    python-Lock锁线程同步和互斥
    python-Event事件线程同步和互斥
    python-thread封装类创建线程
    python-fifo管道文件通信
    python-thread多线程
    Sublime一些设置
    gdb的user-define command
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2980671.html
Copyright © 2011-2022 走看看