บทความสอนกราฟิก

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 2322|ตอบกลับ: 0

[Renpy] 27. ทำร้านค้าแบบ Advanced

[คัดลอกลิงก์]

272

กระทู้

272

โพสต์

979

เครดิต

ผู้ดูแลระบบ

Rank: 9Rank: 9Rank: 9

เครดิต
979
แก้ไขครั้งสุดท้ายโดย nooknazha เมื่อ 2018-6-13 13:50

Shop_Advanced_02.jpg
[Renpy] 27. ทำร้านค้าแบบ Advanced

จากที่มีสมาชิกท่านนึงขอให้ช่วยแปลหน้า http://www.renpy.org/wiki/renpy/... ry_and_Money_System เป็นภาษาไทยนะคะ

เอาล่ะ มาดูโค๊ดแบบที่ 2 กันบ้างข้าพเจ้าแก้โค๊ดบางตัวนิดหน่อย เพราะรองเทสดูแล้วปรากฏว่าค่าเงินถูกหักไป 2รอบเวลาซื้อสินค้า เลยทำให้ยอดเงินคงเหลือแสดงค่าผิดออกมา

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

  1. <font size="4">

  2. define b = Character('คิมหันต์', color="#f8f092")

  3. init python:
  4.     class Item:
  5.         def __init__(self, name, cost):
  6.             self.name = name
  7.             self.cost = cost

  8.     class Inventory:
  9.         def __init__(self, money=100):
  10.             self.money = money
  11.             self.items = []

  12.         def buy(self, item):
  13.             if self.money >= item.cost:
  14.                 self.money -= item.cost
  15.                 self.items.append(item)
  16.                 return True
  17.             else:
  18.                 return False

  19.         def earn(self, amount):
  20.             self.money += amount

  21.         def has_item(self, item):
  22.                 if item in self.items:
  23.                     return True
  24.                 else:
  25.                     return False

  26. label start:

  27.     python:
  28.         inventory = Inventory()
  29.         somtum = Item("ส้มตำถาด", 80)
  30.         fried_rice = Item("ข้าวผัดกุ้ง", 40)
  31.         chocolate = Item("ช็อคกาแล๊ต", 110)

  32.     b "อุ้ย! เจอเงิน 100 บาท"

  33.     $ inventory.earn(100) #เพิ่มเงินเข้าไปอีก 100 บาท
  34. #บอกให้ผู้เล่นรับรู้ว่าได้รับเงินมาอีก 100 "เงิน" ในขณะเดียวกันโปรแกรมก็ได้ส่งค่า 100 ไปยังคราลของ "inventory" ที่ฟังก์ชั่นชื่อ "earn" เพื่อไปคำนวณและส่งค่าผลลัพธ์ให้กับฟังก์ชั่นชื่อ "money" อีกทอด
  35.     $ current_money = inventory.money #ตรงนี้จะมีเงินรวมอยู่เท่ากับ 200 บาท

  36.     b "ตอนนี้ฉันมีเงินอยู่ %(current_money)d บาท"
  37.     b "ท้องร้องแล้วซิ"
  38.     b "หิวจังเลย.... T T "
  39.    
  40.     if inventory.has_item(chocolate):
  41.         b "ดีนะที่ซื้อช๊อคกาแล๊ตเก็บไว้"
  42.     else:
  43.         b "แย่จังไม่ได้ซื้ออะไรไว้กินเลย"

  44.     jump preshop
  45.     jump shop2

  46. label preshop:
  47.     $ somtumcost = somtum.cost
  48.     $ fried_ricecost = fried_rice.cost
  49.     $ chocolatecost = chocolate.cost

  50. label shop2:
  51.     b "ฉันเดินตรงไปที่ร้านอาหารทันที"
  52.     menu shop:
  53.         b "ซื้ออะไรกินดีนะ"
  54.         "ซื้อส้มตำถาด ราคา %(somtumcost)d บาท.":
  55.             if inventory.buy(somtum):
  56.                 b "กินกับเส้นหมี่นุ่มๆ ไก่ย่างร้อนๆ โอ้ยอร่อยเหาะ!"
  57.                 jump game_continues

  58.         "ซื้อข้าวผัดกุ้ง ราคา %(fried_ricecost)d บาท.":
  59.             if inventory.buy(fried_rice):
  60.                 b "อันนี้แหล่ะอิ่มท้องดี"

  61.                 jump game_continues

  62.         "ซื้อช็อคกาแล๊ต ราคา %(chocolatecost)d บาท.":
  63.             if inventory.buy(chocolate):
  64.                 b "รองท้องไปก่อนละกัน!"
  65.                 jump game_continues

  66.         "ไม่ซื้ออะไรเลย":
  67.             jump game_continues

  68. label fallthrough:
  69.     b "แย่จัง เงินไม่พอซื้อ"
  70.     jump shop2

  71. label game_continues:
  72.     b "(และฉันก็เดินออกจากร้าน)"
  73.     $ current_money = inventory.money
  74.     b "ฉันเหลือเงิน %(current_money)d บาท"

  75. </font>
คัดลอกไปที่คลิปบอร์ด
อธิบาย:
  1. <font size="4">    class Item:</font>
คัดลอกไปที่คลิปบอร์ด
คลาส Items : บรรทัดนี้เราทำไว้เพื่อให้ren'py รู้ว่ากำลังจะทำการประกาศตัวแปรหลายตัวพร้อมกันโดยตั้งชื่อให้กับคลาสนี้ว่า "Items" แต่ละตัวแปรก็จะมีหน้าที่และคุณสมับัติเฉพาะแตกต่างกันโดยจะมีตัวแปรที่ทำหน้าเชื่อมกัน เช่น ตัวแปรที่ใช้รับค่า เก็บข้อมูล คำนวณและส่งข้อมูลคำตอบออกไปข้างนอก เป็นต้นค่ะ
  1. <font size="4">        def __init__(self, name, cost):</font>
คัดลอกไปที่คลิปบอร์ด
ภายในคลาส "Item" เราได้กำหนดคร่าวๆว่าโมดูลกลุ่มนี้มีตัวแปรชื่อ  "name" และ"cost"  เพื่อใช้แทนค่า"ชื่อของสินค้า"  และ"ราคาของสินค้า"

(สัญลักษณ์ __init__ เป็นรูปแบบการเขียนภาษาไพธอนที่มีลักษณะของ"ตัวแปร" เป็นชนิด  Internal Methon คือใช้ทำงานแค่เฉพาะภายในและไม่สามารถถูกเรียกใช้จากภายนอกได้)
  1. <font size="4">         
  2. self.name = name
  3. self.cost = cost
  4. </font>
คัดลอกไปที่คลิปบอร์ด
"self" ในที่นี้จะหมายถึง "ในตัวมันเอง"ทำหน้าที่เป็นเหมือน "ชื่อนำหน้า" ที่จะบอกกับตัวแปรอื่นให้รับรู้ว่า"ตัวแปรชื่อนี้อยู่คลาสเดียวกับมัน" นั่นเอง (คลาสชื่อ "Item")

"self.name" เป็นการประกาศตัวแปร"ชนิดตัวอักษร" ชื่อ "name" ภายในคลาสชื่อ"Item" เพื่อมาใช้แทนค่า"ชื่อของสินค้า" และกำหนดให้มีค่าเท่ากับ "name"

"self.cost" เป็นการประกาศตัวแปร "ชนิดตัวเลข"  ชื่อ "cost" ภายในคลาสชื่อ "Item"เพื่อมาใช้แทนค่า"ราคาของสินค้า" และกำหนดให้มีค่าเท่ากับ"cost"
  1. <font size="4">    class Inventory:</font>
คัดลอกไปที่คลิปบอร์ด
สร้างคลาส Inventoryขึ้นมา โดยตั้งชื่อให้กับคลาสนี้ว่า "Inventory"
  1.         def __init__(self, money=100):
คัดลอกไปที่คลิปบอร์ด
ภายในคลาส "Inventory" เราได้กำหนดคร่าวๆว่าโมดูลกลุ่มนี้มีตัวแปรชื่อ  "money" เป็นชนิด  InternalMethod และกำหนดค่าเริ่มต้นให้ = 100 เพื่อมาใช้แทนค่า"จำนวนเงินคงเหลือ" ในเกมส์

  1. <font size="4">            self.money = money</font>
คัดลอกไปที่คลิปบอร์ด
ก่อนหน้าเราได้ประกาศตัวแปรชื่อ "money" ภายในคลาสชื่อ "Inventory"ไปแล้ว โดยในบรรทัดนี้เราได้ระบุว่าตัวแปรชื่อ "self.money"ในคลาสชื่อ "Inventory" มีค่าเท่ากับ"money"
  1. <font size="4">            self.items = []</font>
คัดลอกไปที่คลิปบอร์ด
สร้างตัวแปรชื่อ "items" โดยให้ปัจจุบันกำหนดให้เป็นค่า"ว่าง" ไว้ก่อน ภายในคลาสชื่อ Inventory เพื่อให้มารองรับปริมาณของ"ชื่อสินค้า" และ "ราคาของสินค้า" ที่จะถูกเพิ่มเข้ามาเรื่อยๆในอนาคต
  1. <font size="4">        def buy(self, item):</font>
คัดลอกไปที่คลิปบอร์ด
สร้างฟังก์ชั่นสำหรับใช้คำนวณภายในคลาสชื่อ "buy" โดยมีตัวแปรชื่อ"item" ไว้แทนค่าที่รับค่าเข้ามาจากภายนอก
  1. <font size="4">            if self.money >= item.cost:</font>
คัดลอกไปที่คลิปบอร์ด
กำหนดให้ถ้า "money"(จำนวนเงินของผู้เล่น) มากกว่า หรือเท่ากับ "cost"(ราคาสินค้า) จริง
  1. <font size="4">                self.money -= item.cost</font>
คัดลอกไปที่คลิปบอร์ด
ให้นำ "money"(จำนวนเงินของผู้เล่น)หักกับ "cost" (ราคาสินค้า)(ก็คือถ้าผู้เล่นคลิกซื้อสินค้าไปแล้ว ให้หักเงินของผู้เล่นออกไปตามราคาของสินค้า)

  1. <font size="4">                self.items.append(item)</font>
คัดลอกไปที่คลิปบอร์ด
จากนั้นให้นำค่า "item" ที่ได้มา ไปเพิ่มให้กับตัวแปรชื่อ "items"  (ที่ตอนแรกเรากำหนดให้เป็นค่า "ว่าง" )
  1. <font size="4">                return True</font>
คัดลอกไปที่คลิปบอร์ด
หลังจากผู้เล่นซื้อสินค้าไปแล้วให้ส่งคำตอบว่า "True" กลับไปยังภายนอก
  1. <font size="4">
  2.             else:
  3.                 return False
  4. </font>
คัดลอกไปที่คลิปบอร์ด
แต่ถ้าเงินของผู้เล่นไม่พอซื้อสินค้า (ซื้อไม่ได้หรือไม่ยอมซื้อ)ไปแล้วให้ส่งคำตอบว่า "False" กลับไปยังภายนอกแทน
  1.         def earn(self, amount):
คัดลอกไปที่คลิปบอร์ด
สร้างฟังก์ชั่นชื่อ "earn" เพื่อประกาศตัวแปรคร่าวๆ ชื่อว่า "amount"สำหรับไว้เพิ่มค่า "จำนวนเงินของผู้เล่น"ซึ่งอาจจะได้รับมาด้วยวิธีต่างๆ กันเป็นตัวแปรที่สร้างขึ้นมาเพื่อไว้รับค่าของภายนอกเข้ามา

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

  1.             self.money += amount
คัดลอกไปที่คลิปบอร์ด
กำหนดให้ตัวแปรชื่อ"money" (ภายในคลาส Inventory เหมือนกัน ) มีค่าเท่ากับตัวมันเองบวกกับ "amount" (คือถ้ามีเงินเพิ่มเข้ามาด้วยสาเหตุต่างๆกันค่าเงินคงเหลือของผูู้เล่นก็จะอัพเดทเพิ่มขึ้นตาม)

***ตรงนี้เราอาจจะสร้างฟังก์ชั่นอีกตัวเอาไว้สำหรับลดค่าเงินคงเหลือของผู้เล่นเกมส์อีกตัวก็ได้เช่นไว้ในกรณีที่ผู้เล่นนำเงินไปจ่ายค่าบริการ ถูกขโมยที่ไม่เกี่ยวข้องกับการลดลงเพราะนำไปซื้อสินค้า
  1.         def has_item(self, item):
คัดลอกไปที่คลิปบอร์ด
สร้างฟังก์ชั่นชื่อ"has_item" ไว้สำหรับเช็คดูว่า มีรายชื่อสินค้าที่ซื้อไป ปรากฏอยู่ในตัวแปรชื่อ"items" แล้วหรือยัง

  1.                 if item in self.items:
  2.                     return True
  3.                 else:
  4.                     return False
คัดลอกไปที่คลิปบอร์ด
ให้เช็คดูว่าถ้ามีชื่อสินค้าอยู่ในตัวแปรชื่อ"items" อยู่ "จริง" ให้ส่งคำตอบกลับไปภายนอกว่า "True"แต่ถ้าไม่มีให้ส่งคำตอบกลับไปภายนอกว่า "False"
  1. <font size="4">label start:</font>
คัดลอกไปที่คลิปบอร์ด
เริ่นต้มเกมส์
  1. <font size="4">    python:</font>
คัดลอกไปที่คลิปบอร์ด
ประกาศตัวแปรรองรับที่จะถูกนำมาใช้นับจากนี้ไป
  1. <font size="4">        inventory = Inventory()
  2. </font>
คัดลอกไปที่คลิปบอร์ด
สร้างตัวแปร "inventory" เพื่อใช้อ้างอิงค่ากับคลาสชื่อ "Inventory" สัญลักษณ์ ()ต่อท้ายหมายถึงฟังก์โมดูลต่างๆที่อยู่ภายในคลาส
  1. <font size="4">
  2. somtum = Item("ส้มตำถาด", 80)</font>
คัดลอกไปที่คลิปบอร์ด
สร้างตัวแปร "inventory" เพื่อใช้อ้างอิงค่ากับคลาสชื่อ "Inventory" สัญลักษณ์ ()ต่อท้ายหมายถึงฟังก์โมดูลต่างๆที่อยู่ภายในคลาส
  1. <font size="4">
  2.         ried_rice = Item("ข้าวผัดกุ้ง", 40)
  3.         chocolate = Item("ช็อคกาแล๊ต", 110)
  4. </font>
คัดลอกไปที่คลิปบอร์ด
สร้างตัวแปรอื่นๆขึ้นมาอีกแบบเดียวกับตัวแปร somtumเพื่อให้เป็นทางเลือกให้กับผู้เล่น
  1. <font size="4">
  2.     b "อุ้ย! เจอเงิน 100 บาท"
  3.     $ inventory.earn(100)
  4. </font>
คัดลอกไปที่คลิปบอร์ด
เขียนประโยคเพื่อบอกให้ผู้เล่นรู้ว่าเกิดเหตุการณ์อะไรขึ้นพร้อมกับเพิ่มเงินคงเหลือของผู้เล่นเข้าไปอีก 100 บาท (ren'py จะดึงฟังก์ชั่นinventory.earn มาใช้และช่วยเพิ่มมูลค่าให้กับตัวแปร "money" )
  1. <font size="4">
  2.     $ current_money = inventory.money
  3. </font>
คัดลอกไปที่คลิปบอร์ด
สร้างตัวแปรชื่อ current_money เพื่อให้อ้างอิงค่าเงินคงเหลือล่าสุดที่ถูกเก็บไว้อยู่ในคลาส"Inventory" ชื่อตัวแปร "money"

  1. <font size="4">
  2.     b "ตอนนี้ฉันมีเงินอยู่ %(current_money)d บาท"
  3.     b "ท้องร้องแล้วซิ"
  4.     b "หิวจังเลย.... T T "

  5.     if inventory.has_item(chocolate):
  6.         b "ดีนะที่ซื้อช๊อคกาแล๊ตเก็บไว้"
  7.     else:
  8.         b "แย่จังไม่ได้ซื้ออะไรไว้กินเลย"
  9. </font>
คัดลอกไปที่คลิปบอร์ด
สร้างเงื่อนไขไว้ตรวจสอบว่าขณะนี้มี"ชื่อสินค้าที่(chocolate)" ซื้อมาเก็บไว้อยู่ก่อนแล้วหรือไม่
  1. <font size="4">
  2.     jump preshop
  3.     jump shop2
  4. </font>
คัดลอกไปที่คลิปบอร์ด
ให้ข้ามไปยัง label โดยไม่ต้อง  return.ดูข้างล่างสำหรับส่วนต่อไป
  1. <font size="4">
  2. label preshop:
  3.     $ somtumcost = somtum.cost
  4.     $ fried_ricecost = fried_rice.cost
  5.     $ chocolatecost = chocolate.cost
  6. </font>
คัดลอกไปที่คลิปบอร์ด
สร้างตัวแปรเสริมสำหรับไว้แสดงผลโดยค่าของตัวแปรนี้จะเชื่อมกับตัวแปรชื่อ "name" และ "cost" ในคลาสชื่อ "Item" โดยตรง(อย่างที่บอกไว้ข้างต้นว่าคลาสชื่อ "Item" ได้ประกาศตัวแปรชื่อ  "name"และ "cost" ไว้เป็นแบบ InternalMethod คือไม่สามารถดึงค่าออกมาแสดงภายนอกโดยตรงได้จำเป็นต้องสร้างตัวแปรภายนอก มาเชื่อมกับเพื่อให้สามารถดึงค่าภายในออกมาแสดงได้ )
  1. <font size="4">
  2. label shop2:
  3.     b "ฉันเดินตรงไปที่ร้านอาหารทันที"
  4.     menu shop:
  5.         b "ซื้ออะไรกินดีนะ"
  6.         "ซื้อส้มตำถาด ราคา %(somtumcost)d บาท.":
  7. </font>
คัดลอกไปที่คลิปบอร์ด
สร้าง label ทางเลือกสินค้าให้กับผู้เล่นโดยแต่ละช้อยทางเลือกจะมีการดึงค่าข้อมูลภายในคลาส Item ตัวแปรชื่อcost ผ่านตัวแปรนอกที่ประกาศไว้ข้างต้นขึ้นมาแสดง

  1.             if inventory.buy(somtum):
  2.                 b "กินกับเส้นหมี่นุ่มๆ ไก่ย่างร้อนๆ โอ้ยอร่อยเหาะ!"
  3.                 jump game_continues
คัดลอกไปที่คลิปบอร์ด
สร้างเงื่อนไขถ้าผู้เล่นคลิกซื้อ"somtum" หรือ Item("ส้มตำถาด", 80) "จริง" ให้ทำตามคำสั่งต่อไปดังนี้
แสดงคำว่า "กินกับเส้นหมี่นุ่มๆ ไก่ย่างร้อนๆโอ้ยอร่อยเหาะ!" และให้ข้ามไปยัง label game_continues
  1. <font size="4">
  2.         "ซื้อข้าวผัดกุ้ง ราคา %(fried_ricecost)d บาท.":
  3.             if inventory.buy(fried_rice):
  4.                 b "อันนี้แหล่ะอิ่มท้องดี"
  5.                 jump game_continues

  6.         "ซื้อช็อคกาแล๊ต ราคา %(chocolatecost)d บาท.":
  7.             if inventory.buy(chocolate):
  8.                 b "รองท้องไปก่อนละกัน!"
  9.                 jump game_continues

  10.         "ไม่ซื้ออะไรเลย":
  11.             jump game_continues
  12. </font>
คัดลอกไปที่คลิปบอร์ด
ทุกครั้งที่มีการซื้อสินค้าควรมีทางเลือกสำหรับยกเลิกการซื้อให้กับผู้เล่นด้วย
  1. <font size="4">
  2. label fallthrough:
  3.     b "แย่จัง เงินไม่พอซื้อ"
  4.     jump shop2
  5. </font>
คัดลอกไปที่คลิปบอร์ด
เมื่อผู้เล่นมีเงินไม่พอซื้อค่าที่ได้รับจากเงื่อนไขทางเลือกจะกลายเป็น False และวิ่งมาที่ label นี้เพื่อแสดงคำว่า"แย่จัง เงินไม่พอซื้อ"ก่อนที่จะวิ่งกลับไปแสดงหน้าทางเลือกเดิมอีกครั้ง
  1. <font size="4">
  2. label game_continues:
  3.     b "(และฉันก็เดินออกจากร้าน)"
  4.     $ current_money = inventory.money
  5.     b "ฉันเหลือเงิน %(current_money)d บาท"
  6. </font>
คัดลอกไปที่คลิปบอร์ด
ใน label สุดท้ายนี้จะมีการอัพเดทยอดเงินคงเหลือล่าสุดอีกครั้งก่อนที่จะสั่งให้แสดงออกมาให้ผู้เล่นรับทราบ
ทดสอบโค๊ด:
Shop_Advanced_01.jpg
Shop_Advanced_02.jpg
Shop_Advanced_03.jpg


***************************************

บทความโดย นุ้ก
ขอจบบทความแค่เพียงเท่านี้ แล้วพบกันใหม่บทความหน้าค่ะ ^^
(ขอสงวนสิทธิ์อนุญาตให้เผยแพร่เฉพาะในเว็บ www.graphicfufu.comเท่านั้น)


ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|GraphicFUFU

GMT+7, 2024-3-28 23:16 , Processed in 0.107588 second(s), 21 queries .

Powered by Discuz! X3.4 R20180101, Rev.59

© 2001-2017 Comsenz Inc.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้