วิธีการปรับสมดุลค่าเงินแลกเปลี่ยนในเกมเมื่อมีการบั๊คหรือหลุดออกมาเกินความเป็นจริง by

28
Feb
0

ในการปรับสมดุลค่าเงินแลกเปลี่ยนในเกมเมื่อมีการบั๊คหรือหลุดออกมาเกินความเป็นจริง สมมติหน่วยเงิน Coin ของเราเกิดบั๊คที่ผู้เล่นใช้ออกมาสู่การแลกเปลี่ยน ซึ่งเราไม่สามารถไปริบคืนจากผู้เล่นที่รับเงินส่วนที่เกินมาจากที่บั๊คได้เพราะผู้เล่นดังกล่าวไม่รู้ ทางแก้จึงมาดังนี้ ขั้นแรกเราต้องหาจำนวนของค่านั้นที่ควรมีอยู่จริงๆ เช่นค่าเงินนี้จะมาจากการเติมเงินเท่านั้น เราก็นำหน่วยเงินนี้ที่ได้จากการเติมเงินทั้งหมดมาคำนวน เช่นจำนวนเงินทั้งหมดของผู้เล่นทุกคนรวมกันปัจจุบันมี 5 แสน แต่จำนวนหน่วยเงินดังกล่าวที่เกิดจากการเติมเงินมีเพียง 3 แสน แปลว่ามีเงินที่ผิดอยู่จากความเป็นจริงอยู่ 2 แสน ในเมื่อเงินมันเฟ้อไปแล้วค่าเงินมันถูกลง เราก็ต้องให้ผู้เล่นที่ทำการแลกเงินมาจริงๆเพิ่มตามจำนวนเท่าของ เงินปัจจุบันหารด้วยเงินที่ทั้งหมดเติมเข้ามาจริงๆ ตัวอย่างเช่น

นาย A เติมเข้ามา 1000
หลังจากการปรับ นาย A ควรได้เงินเพิ่ม 1000 * (500,000/200,000) ก็จะทำให้ค่าเงินของผู้ที่เติมมีค่าตามมาด้วย

ทำไมต้อง Node.JS? by

28
Feb
0

ภาษาฝั่ง server ยอดนิยมทุกวันนี้คงหนีไม่พ้น php, python, ruby แต่เหตุใด Node.JS ถึงมาแรงขึ้นเรื่อยๆ และเป็นภาษาที่น่าจับตามองในปีนี้? เหตุผลหลักอยู่ที่นี่แล้ว!

  • เป็นภาษาที่ออกแบบมาเป็น Event-Driven คือทำงานตามเหตุการที่เกิด ซึ่งเรียกอีกอย่างได้ว่ามันทำงานแบบ Asynchronous
  • จริงๆ ภาษาอื่นก็มี Framework ที่ช่วยให้เขียนแบบ Event-Driven เหมือนกันเช่น Photon(PHP), Tornado (Python) แต่สิ่งที่ Node.JS เด่นกว่าชาวบ้านคือมันเกิดมาเพื่อเป็น Asynchronous มาแต่แรก ทำให้ library ต่างๆ กว่า 90% ทำงานแบบ Asynchronous ทั้งหมด หากเป็นภาษาอื่นจะหา library ที่เป็นแบบ Asynchronous ยากกว่ามากเพราะโดยพื้นฐานออกแบบมาให้ทำงานแบบ Synchronous ซึ่งหากเผลอรัน code ที่ทำงานแบบ Synchronous ในระหว่างทำงาน Asynchronous code จะพังได้ ซึ่งคนที่ไม่คุ้นจะเผลอเรียกคำสั่งที่คุ้นเคยได้ง่ายมาก สรุปคือ library ที่เคยใช้เช่น mysql แบบเดิมๆ ก็จะใช้ไม่ได้ ต้องรื้อ code ใหม่หมด ปรับความเคยชินใหม่หมดอยู่ดี มีแค่ syntax ที่ยังเหมือนเดิม แต่การทำงานต่างจากเดิมโดยสิ้นเชิง
  • เนื่องจากการทำงานฝั่ง web server มีการ “รอ” กันมากมาย ดังนั้นเมื่อใช้ Node.JS จะช่วยลดการรอลงได้มาก ตัวอย่างการต่อเช่น รอ mysql ทำงานเสร็จ, รอการเขียนลงไฟล์, รอรับ request มาจากผู้ใช้หลายๆ คน ทุกอย่างสามารถทำไปพร้อมๆ กันได้ทั้งหมด
  • Node.JS เป็นทั้ง Web Server (แทน Apache) เป็นได้ทั้ง Load Balancer (แทน Nginx, Haproxy) และเป็นตัว Application เอง ทำให้สามารถทำงานเสร็จทั้งหมดในตัวมันเอง
  • Node.JS ทำงานแบบ Single thread (เพราะต้องทำหน้าที่ web server) และขณะทำงานจะไม่มีการปิด process ตัวเองทิ้ง process จะรันตลอดเวลาเพื่อรอรับ request จากผู้ใช้เข้ามาอยู่ตลอด หรือพูดง่ายๆ คือ “process เดียวทำทุกอย่าง” (ยกเว้นเขียน cluster ซึ่งถ้าโหลดไม่มากจริงๆ ก็ไม่ต้องใช้) ทำให้เหมาะแก่การทำเป็น background process คอยทำงานบางอย่างตลอดเวลามากกว่า php ที่ process เกิดแล้วตายเรื่อยๆ ตลอด
  • เนื่องจากมันมี process เดียว ทำให้เราสามารถตั้งตัวแปร global ขึ้นมาตัวนึงแล้วสามารถใช้ร่วมกันระหว่าง user ทุกคนได้โดยไม่ต้องสร้างใหม่ตลอดเวลา เช่นการทำ cache อะไรบางอย่างที่ปกติต้องเก็บใน memcache พอจะใช้งานก็ดึงออกมา unserialize ทุกๆ ครั้ง ทำให้เสีย cpu ไปไม่ใช่น้อย ถ้าใช้ node.js คุณอาจไม่ต้องใช้ memcache เลย เมื่อดึงข้อมูลจาก database มาครั้งแรกครั้งเดียวก็สามารถเก็บลงตัวแปรไว้ reuse ได้ตลอดเวลา ไม่ต้องไปพักค่าที่ memcache และดึงมา unserialize ทุกครั้งอีกต่อไป
  • จากข้อที่แล้ว เลยทำให้มีทรัพยากรที่ใช้ร่วมกัน ลด Memory ที่ต้องใช้ลงได้มาก

ตัวอย่าง pseudo code แบบ synchronous:


a = mysql_query("SELECT * FROM user WHERE id = 1");
b = mysql_query("SELECT * FROM item");
show_user(a);
show_item(b);

จาก code ด้านบน สมมติบรรทัดแรกใช้เวลาทำงาน 10 วิถึงจะได้ค่าลงตัวแปร a และอีก 3 วิจะได้ค่าลงตัวแปร b รวมเป็น 13 วิ จึงจะแสดงผล item ได้ทั้งๆ ที่ item ใช้เวลาดึง query มาน้อยกว่า

ตัวอย่าง pseudo code แบบ asynchronous:

mysql_query("SELECT * FROM user WHERE id = 1", function(error, result){
show_user(a);
});
mysql_query("SELECT * FROM item", function(error, result){
show_item(result);
});

จากตัวอย่างข้างบนแม้การดึงข้อมูล user จะกินไป 10 วิ แต่เนื่องจากไม่ต้องรอให้ดึง user เสร็จก่อนก็สามารถดึงข้อมูล item ต่อได้เลย ทำให้สามารถ show_item ได้โดยใช้เวลา 3 วิ และ user ก็จะแสดงผลทีหลัง ทำให้การทำงานโดยรวมเร็วขึ้น วันนี้เอาเท่านี้ก่อนละกันครับ :)

Algorithm ที่มีโอกาสนำมาใช้จริง by

28
Feb
0

เมื่อก่อนตอนเรียนอยู่มีวิชาหนึ่งชื่อว่าวิชา Algorithm ซึ่งเป็นวิชาที่ยาก และ งง มาก ซึ่งทำให้เกิดคำถามว่า ไอ้ที่เรียนๆเนี่ยสามารถนำไปใช้จริงได้ไหม? จนเวลาผ่านล่วงเลยมา ก็มาพบคำตอบว่าในบางครั้งบางโอกาส เราอาจจะต้องเจอกับสถานการณ์ที่จะต้องนำเอา Algorithm ที่เคยได้เรียนมา มาใช้เพื่อให้ Code ที่เราทำนั้นมันมี Performance ดีที่สุดครับ

ต่อไปก็มาดูคำจำกัดความหรือความหมายของ Algorithm อย่างง่ายๆกันก่อนนะครับ

Algorithm(อัลกอริทึม) หมายถึงกระบวนการแก้ปัญหาที่สามารถเข้าใจได้ มีลำดับหรือวิธีการในการแก้ไขปัญหาใดปัญหาหนึ่งอย่างเป็นขั้นเป็นตอนและชัดเจน เมื่อนำเข้าอะไร แล้วจะต้องได้ผลลัพธ์เช่นไร โดยทั่วไป Algorithm จะประกอบด้วย วิธีการเป็นขั้นๆ และมีส่วนที่ต้องทำแบบวนซ้ำ (iterate) หรือ เวียนเกิด (recursive) โดยใช้ตรรกะ (logic) และ/หรือ ในการเปรียบเทียบ (comparison) ในขั้นตอนต่างๆ จนกระทั่งเสร็จสิ้นการทำงาน
ในการทำงานอย่างเดียวกัน เราอาจจะเลือกขั้นตอนวิธีที่ต่างกันเพื่อแก้ปัญหาได้ โดยที่ผลลัพธ์ที่ได้ในขั้นสุดท้ายจะออกมาเหมือนกันหรือไม่ก็ได้ และจะมีความแตกต่าง ที่จำนวนและชุดคำสั่งที่ใช้ต่างกันซึ่งส่งผลให้ เวลา (time) , และขนาดหน่วยความจำ (space) ที่ต้องการต่างกัน หรือเรียกได้อีกอย่างว่ามีความซับซ้อน (complexity) ต่างกัน

ต่อไปจะยกตัวอย่าง Algorithm ที่มีโอกาสได้นำมาใช้จริงนะครับ เราจะไม่พูดถึงวิธีการเขียน Code ของ Algorithm พวกนี้นะครับ เราจะพูดถึงความสามารถของมันว่ามันสามารถทำอะไรได้บ้าง และเอาไปใช้ในโอกาสไหนครับ

1. Merge Sort เป็น Algorithm ในการเรียงลำดับข้อมูลที่มีความเร็วมากที่สุด แต่ซับซ้อนมาก(ฮ่า ฮ่า) หากว่าเรามีข้อมูลจำนวนมหาศาล(ขอย้ำว่า มหาศาล) หากเราใช้ Algorithm ในการ Sort แบบอื่นอาจเจอกับ Timeout ได้ หรือหากมี Code ในจุดที่ต้อง Sort แต่ถูกเรียก บ่อยๆๆๆๆ แล้วล่ะก็ Merge Sort อาจเป็นทางเลือกที่คุณควรมองอย่างยิ่ง

2. Shortest Path คือปัญหา การหาเส้นทางที่สั้นที่สุดจากจุดหนึ่งไปยังอีกจุดหนึ่ง อ่านมาถึงตรงนี้คงมีหลายคน กำลังคิดว่า แล้วมันจะเอาไปทำอะไรล่ะเนี่ยยยย งั้นขอยกตัวอย่างที่เคยประสบมากับตัวแล้วกันนั่นก็คือ ตอนเขียนเกมที่มีตัวละครแล้วให้ผู้เล่นกดคลิ๊กที่พึ่นแล้วตัวละครเราต้องเดินไปที่จุดนั้นๆไงล่ะ โดยที่ระหว่างทางบางทีมันมีสิ่งกีดขวางที่ไม่สามารถเดินผ่านได้ ทำให้ต้องใช้ Algorithm มาช่วยในการแก้ปัญหานี้ไงล่ะ ส่วนจะใช้ Algorithm ไหนนั้นก็มีหลาย Algorithm ให้เลือกสรร เช่น Dijkstra’s Algorithm, Bellman-Ford Algorithm, A* Algorithm, Floyd–Warshall Algorithm, Johnson’s Algorithm และ Viterbi Algorithm ซึ่งแต่ละวิธีจะมีข้อดีข้อเสียต่างกันไปนะคร้าฟฟฟ

วันนี้พอแค่นี้ก่อนดีกว่าไว้วันหลังจะมาเล่าให้ฟังเพิ่มนะคร้าฟฟฟ

ว่าด้วยเรื่องของ Office Syndrome by

28
Feb
0

จากการที่ Office เราเป็น Office ที่ต้องทำงานกันหน้าคอมตลอดเวลา เป็นเวลานานๆติดต่อกัน อาจจะทำให้เกิดอาการ Office Syndrome ได้ จึงอยากจะนำเสนอ อาการและวิธีแก้อย่างง่ายๆ ก่อนอื่นมาดูอาการกันก่อนนะครับ มีใครเคยเป็นข้อไหนบ้างเอ่ย

1. อาการปวดตึงที่คอ บ่า และไหล่

หนุ่มสาวออฟฟิศที่ต้องนั่งทำงานหน้าจอคอมพิวเตอร์นานๆ มักมีอาการปวด ตึง บริเวณคอ บ่า และไหล่ บางรายอาจมีอาการปวดเกร็งจนอาจหันคอ ก้ม หรือเงยไม่ได้ก็มี…ที่อาการเบาหน่อยก็อาจจะแค่ปวดคอ บ่า ไหล่ และบริเวณสะบักหลัง หากคุณมีอาการใดอาการหนึ่งเหล่านี้ ควรบำบัดด้วยการไปนวดคลายกล้ามเนื้อด่วนเลย อย่าปล่อยทิ้งไว้นานๆ เพราะหากอาการหนักขึ้นจะบำบัดรักษายากขึ้นตามไปด้วย ใครที่ลองไปนวดแล้วไม่หาย แนะนำให้ปรึกษาแพทย์เฉพาะทางจะดีที่สุด

2. อาการยกแขนไม่ขึ้น

อาการนี้เกี่ยวเนื่องมาจากข้อแรก ซึ่งจะมีอาการปวดตึงกล้ามเนื้อตั้งแต่คอ บ่า จนถึงไหล่ และร้าวลงไปที่แขน จนเป็นเหตุให้ยกแขนไม่ขึ้น เนื่องจากว่ามีพังผืดมาเกาะที่บริเวณสะบักและหัวไหล่นั่นเอง และบางรายอาจมีอาการชาไปที่มือหรือนิ้วมือด้วย…ใครที่มีอาการแบบนี้ควรบำบัดด้วยการไปให้แพทย์แผนไทยกดจุดเพื่อทำการสลายพังผืด หรือประคบร้อนเพื่อให้เลือดไหลเวียนไปเลี้ยงส่วนที่เป็นพังผืดแข็งตึงให้อ่อนตัวลงและคลายความปวดลง อาการก็จะดีขึ้น

3. อาการปวดหลัง

เป็นอีกหนึ่งอาการยอดฮิตของออฟฟิศซินโดรมเลยล่ะ เกิดจากการที่เรานั่งทำงานติดต่อกันนานๆ หรืองานที่ต้องยืนนานๆ โดยเฉพาะคุณสาวๆ ที่ต้องใส่รองเท้าส้นสูงตลอดทั้งวันด้วยแล้ว ยิ่งเกิดอาการปวดหลังได้ง่าย การยกของหนักเป็นประจำหรือการออกกำลังกายหักโหมเกินไปก็เป็นสาเหตุให้ปวดหลังได้เช่นกัน โดยอาจเกิดอาการเคล็ด ขัด ยอก หรือปวด ตึง กล้ามเนื้อบริเวณหลัง จนบางรายอาจไม่สามารถเอี้ยวหรือบิดตัวได้ แนะนำให้รีบปรึกษาแพทย์แผนไทยหรือแพทย์เฉพาะทางเพื่อบำบัดแก้ไขอาการเหล่านี้ให้หมดไป

4. อาการปวดและตึงที่ขา

เกิดจากการนั่ง เดิน หรือยืนนานๆ จนทำให้ปวดตึงกล้ามเนื้อและเส้นเอ็นทั่วทั้งขา บางรายปวดร้าวไปที่เข่าและข้อเท้าก็มี ซึ่งอาการเหล่านี้เกิดจากการใช้งานขาหนักทุกวันจนเกิดอาการล้าสะสม ซึ่งถ้าปล่อยไว้นานๆ โดยไม่ได้รับการบำบัดแก้ไข อาจทำให้เกิดอาการปวดร้าวและอาการชาลงไปที่บริเวณเท้าและปลายนิ้วเท้าได้ ทางที่ดีแม้มีอาการเพียงเล็กน้อยก็ควรรีบทำการบำบัดโดยด่วน!

5. อาการปวดศีรษะ

ในแต่ละวันคนทำงานออฟฟิศส่วนใหญ่จะเกิดความเครียดสะสมโดยไม่รู้ตัว จนทำให้เกิดอาการปวดศีรษะได้ บางรายอาจเกิดจากการทำงานหนักเกินไป หรือต้องเดินทางขึ้นเหนือล่องใต้ตลอดเวลา เมื่อเกิดอาการปวดศีรษะขึ้นมา คนส่วนใหญ่จะแก้ไขด้วยการกินยาแก้ปวด บางรายอาจกินติดต่อกันเป็นเวลานาน ซึ่งอาการปวดศีรษะก็จะหายไปชั่วคราว แต่อาจกลับมาทวีความรุนแรงขึ้นไปอีก ดังนั้น หากคุณมีอาการปวดศีรษะบ่อยๆ แนะนำให้ไปพบแพทย์เพื่อตรวจเช็คและหาสาเหตุที่แท้จริงว่าเกิดจากอะไร และรีบรักษาให้หายเสียแต่เนิ่นๆ แล้วคุณจะมีความสุขกับชีวิตมากยิ่งขึ้น

เหมือนจะเคยเป็นเกือบทุกข้อเลยแหะ – - ต่อไปเป็นวิธีแก้อย่างง่ายนะครับ

1. ก็ไม่ต้องทำงานสิครับ แค่นี้ก็ไม่เป็น Office Syndrome แล้วล่ะครับ

ไม่ใช่แล้ววววว อันนั้นไม่นับนะครับ ต่อไปเป็นวิธีแก้ของจริงๆแล้วนะครับ

1. ถ้าเป็นไปได้ ควรเลือกที่นั่งติดริมหน้าต่าง เพื่อให้ได้แสงจากธรรมชาติบ้าง ดีกว่าต้องนั่งอยู่ใต้แสงจากหลอดไฟตลอดทั้งวัน

2. ควรเปิดหน้าต่างออฟฟิศให้อากาศได้ระบาย อย่างน้อยในตอนเช้าที่อากาศยังไม่ร้อนมาก และตอนพักกลางวัน

3. ควรปิดเครื่องคอมพิวเตอร์หรือโน้ตบุ๊คทุกครั้งที่ไม่ได้ใช้งาน เพื่อลดระยะเวลาในการรับคลื่นแม่เหล็กไฟฟ้า ซึ่งเป็นสาเหตุหนึ่งที่ทำให้เป็นโรคความดัน
โลหิตสูง และความเครียด

4. หาต้นไม้ในร่มมาปลูก เพื่อช่วยดูดซับสารพิษและเป็นที่พักสายตาอันอ่อนหล้าจากการต้องจ้องหน้าจอคอมพิวเตอร์นานๆ

5. ถ้าออฟฟิศคุณมีขนาดเล็ก ลองลดการใช้งานเครื่องปรับอากาศลงบ้าง บางวันคุณอาจจะเลือกใส่เสื้อผ้าที่มีลักษณะบางเบา แล้วใช้พัดลมมาเปิดแทน ก็จะรู้สึกเย็นสบายได้ และประหยัดไฟได้ด้วย

6. ควรห้ามสูบบุหรี่ในที่ทำงานโดยเด็ดขาด

7.ควรติดตั้งเครื่องฟอกอากาศ และจะดียิ่งขึ้นถ้ามีตู้ปลาขนาดใหญ่ๆ สักตู้ เพื่อช่วยคืนสมดุลความชื้นที่เสียไปกับเครื่องปรับอากาศ

8.หมั่นทำความสะอาดโต๊ะทำงานของคุณเอง ด้วยแอลกอฮอล เพื่อฆ่าเชื้อโรค

9. ถ้าคุณเป็นคนติดคอมพิวเตอร์หรือมีงานด่วนที่จะต้องสะสางชนิดที่ไม่สามารถหยุดพัก
ได้ ก็พยายามเตือนตัวเองให้เงยหน้าขึ้นมองออกไปไกลๆ ทุกๆ 20 นาที เพื่อบรรเทาความเหนื่อยล้าของสายตา

แนะนำให้ทำให้ครบนะครับ

Limit จำนวน Resource คนเล่นเถิด จะเกิดผล by

27
Feb
0

การ Limit จำนวน Resource ที่ว่านี้ก็เช่น

  • จำนวน Monsters ที่ผู้เล่นทั้งหมดจะเก็บไว้ได้
  • จำนวนไอเทมใน inventory
  • เงินในเกม

ที่ผ่านมา ผมมักคิดว่าให้คนเล่นมีไอเทมหรือมอนเยอะๆไปก็ไม่เสียหายนี่่น่า ตัวไหนเค้าไม่ใช้ก็เก็บๆไว้ยังงั้นแหละ หรือ ไม่ก็คนเล่นจะมีปัญญาหาได้ซักแค่ไหนเชียว

แต่เมื่อเปิดให้บริการเกมไปเรื่อยๆแล้ว จึงได้เจอว่าเป็นสิ่งที่คิดผิดโดยแท้ การลิมิตทรัพยากรที่คนเล่นนั้นมีข้อดีเยอะกว่าที่คิด ดังนี้ครับ

1.มันขายได้

เช่น เมื่อเกมแจกของที่ดีพอสมควรเรื่อยๆ จนกระทั่งคนเล่นไม่มีที่จะเก็บ ถ้าคนเล่นเสียดายที่จะทิ้งหรือขาย(ซึ่งขายกับระบบจะไม่คุ้มอยู่แล้ว) ก็จำเป็นต้องซื้อช่องเพิ่ม

2.กระตุ้นการใช้ทรัพยากรของคนเล่น

ต่อเนื่องจากข้อที่แล้วครับ เมื่อคนเล่นไม่อยากจะซื้อ ก็ต้องใช้ของที่มีนั้นให้หมดไป ทั้งๆที่จริงๆแล้วคนเล่นอาจจะเสียดาย หรืออยากเก็บไว้เพื่อรอใช้ในเวลาที่เหมาะสมก็ได้ ซึ่งการที่กระตุ้นให้คนเล่นใช้ทรัพยากรเรื่อยๆ ก็เป็นผลดีต่อระบบเพราะ ทรัพยากรแต่ละอย่างมักจะเกี่ยวโยงกัน เืมื่อคนเล่นใช้ทรัพยากรอย่างนึง ก็ต้องมีทรัพยากรอีกอย่างด้วย เมื่อมันไม่พอดีกัน ก็ต้องหามาเพิ่มเหมือนกับ เราได้โซดามา 3 ลัง แต่เรามีเหล้าแค่ 1 ขวด ก็ต้องไปหาเหล้ามาเพิ่ม จริงไหมครับ?

3.ลดปัญหาด้าน Performance

เคยมีเหตุการณ์คนเล่นคนนึงไม่สามารถเข้าเกม Cybermon ได้ครับ ทีมงานหาสาเหตุแล้วก็พบว่าเป็นเพราะ จำนวนมอนสเตอร์ของคนๆนั้นเยอะเกินไป เมื่อพยายามโหลดข้อมูลมหาศาลนั้นแล้ว ก็เลยเจอ Timeout ไป คนเล่นจึงเข้าเกมไม่ได้

4.ลดความเสียหายจากบั๊กหรือการผิดสมดุลของเกม

ในการเปิดให้บริการเกมนั้น เราเลี่ยงไม่ได้ที่จะต้องเจอบั๊กหรือการที่ระบบให้ของไม่สมดุล ซึ่งก็มีสิทธิ์ที่ความผิดพลาดเหล่านั้นจะทำให้คนเล่นได้ทรัพยากรไปมากเกินกว่าที่ควรจะเป็น ถ้าเราไม่ลิมิตจำนวนสูงสุดไว้ความเสียหาย หรือ ทรัพยากรที่หลุดไปนั้น อาจจะเป็นเท่าไรก็ได้(สูงสุดก็ค่า max int)