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
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: 随感
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息