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
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 
分类:  随感

你可能感兴趣的:(lua)