Thaigraph

 

   

ค้นหา
Thaigraph หน้าฟอรั่ม Ren'Py [renpy] ทำร้านค้าแบบ Advanced ...
ดู: 1557|ตอบ: 7
go

[renpy] ทำร้านค้าแบบ Advanced

Rank: 7Rank: 7Rank: 7

โพสต์เมื่อ 18-5-2015 12:21 |แสดงโพสต์ทั้งหมด
[renpy] ทำร้านค้าแบบ Advanced

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

ส่วนแบบง่ายเราแปลเป็นบทความไว้ที่นี่ http://www.thaigraph.com/thread-3406-1-1.html ให้แล้วค่ะ อาจจะไม่ตรงกันทั้งหมดนะ เพราะแปลเอาตามที่ตัวเองเข้าใจ ^^"

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

นอกจากนี้ข้าพเจ้าก็จัดการแปลบางส่วนแบบคิดเอาเองไปเลย จะได้ดูเป็นไทยเข้าใจง่ายมากขึ้นมาดูโค๊ดตัวอย่างกันดีกว่าค่ะ
  1. define b = Character('คิมหันต์', color="#f8f092")

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

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

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

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

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

  25. label start:

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

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

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

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

  43.     jump preshop
  44.     jump shop2

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

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

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

  60.                 jump game_continues

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

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

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

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


อธิบาย:

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

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

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

"self.cost" เป็นการประกาศตัวแปร "ชนิดตัวเลข"  ชื่อ "cost" ภายในคลาสชื่อ "Item" เพื่อมาใช้แทนค่า"ราคาของสินค้า" และกำหนดให้มีค่าเท่ากับ "cost"
  1.     class Inventory:
คัดลอกไปที่คลิปบอร์ด
สร้างคลาส Inventory ขึ้นมา โดยตั้งชื่อให้กับคลาสนี้ว่า "Inventory"

  1.         def __init__(self, money=100):
คัดลอกไปที่คลิปบอร์ด
ภายในคลาส "Inventory" เราได้กำหนดคร่าวๆ ว่าโมดูลกลุ่มนี้มีตัวแปรชื่อ  "money" เป็นชนิด  Internal Method และกำหนดค่าเริ่มต้นให้ = 100 เพื่อมาใช้แทนค่า "จำนวนเงินคงเหลือ" ในเกมส์

  1.             self.money = money
คัดลอกไปที่คลิปบอร์ด
ก่อนหน้าเราได้ประกาศตัวแปรชื่อ "money" ภายในคลาสชื่อ "Inventory" ไปแล้ว โดยในบรรทัดนี้เราได้ระบุว่าตัวแปรชื่อ "self.money" ในคลาสชื่อ "Inventory" มีค่าเท่ากับ "money"

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

  1.             if self.money >= item.cost:
คัดลอกไปที่คลิปบอร์ด
กำหนดให้ถ้า "money"(จำนวนเงินของผู้เล่น) มากกว่า หรือเท่ากับ "cost" (ราคาสินค้า) จริง

  1.                 self.money -= item.cost
คัดลอกไปที่คลิปบอร์ด
ให้นำ "money"(จำนวนเงินของผู้เล่น) หักกับ "cost" (ราคาสินค้า) (ก็คือถ้าผู้เล่นคลิกซื้อสินค้าไปแล้ว ให้หักเงินของผู้เล่นออกไปตามราคาของสินค้า)

  1.                 self.items.append(item)
คัดลอกไปที่คลิปบอร์ด
จากนั้นให้นำค่า "item" ที่ได้มา ไปเพิ่มให้กับตัวแปรชื่อ "items"  (ที่ตอนแรกเรากำหนดให้เป็นค่า "ว่าง" )

  1.                 return True
คัดลอกไปที่คลิปบอร์ด
หลังจากผู้เล่นซื้อสินค้าไปแล้วให้ส่งคำตอบว่า "True" กลับไปยังภายนอก

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

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

  1. label shop2:
  2.     b "ฉันเดินตรงไปที่ร้านอาหารทันที"
  3.     menu shop:
  4.         b "ซื้ออะไรกินดีนะ"
  5.         "ซื้อส้มตำถาด ราคา %(somtumcost)d บาท.":
คัดลอกไปที่คลิปบอร์ด
สร้าง label ทางเลือกสินค้าให้กับผู้เล่น โดยแต่ละช้อยทางเลือกจะมีการดึงค่าข้อมูลภายในคลาส Item ตัวแปรชื่อ cost ผ่านตัวแปรนอกที่ประกาศไว้ข้างต้นขึ้นมาแสดง

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

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

  9.         "ไม่ซื้ออะไรเลย":
  10.             jump game_continues
คัดลอกไปที่คลิปบอร์ด
ทุกครั้งที่มีการซื้อสินค้า ควรมีทางเลือกสำหรับยกเลิกการซื้อให้กับผู้เล่นด้วย
  1. label fallthrough:
  2.     b "แย่จัง เงินไม่พอซื้อ"
  3.     jump shop2
คัดลอกไปที่คลิปบอร์ด
เมื่อผู้เล่นมีเงินไม่พอซื้อ ค่าที่ได้รับจากเงื่อนไขทางเลือกจะกลายเป็น False และวิ่งมาที่ label นี้เพื่อแสดงคำว่า "แย่จัง เงินไม่พอซื้อ" ก่อนที่จะวิ่งกลับไปแสดงหน้าทางเลือกเดิมอีกครั้ง

  1. label game_continues:
  2.     b "(และฉันก็เดินออกจากร้าน)"
  3.     $ current_money = inventory.money
  4.     b "ฉันเหลือเงิน %(current_money)d บาท"
คัดลอกไปที่คลิปบอร์ด
ใน label สุดท้ายนี้จะมีการอัพเดทยอดเงินคงเหลือล่าสุดอีกครั้ง ก่อนที่จะสั่งให้แสดงออกมาให้ผู้เล่นรับทราบ

ทดสอบโค๊ด:




ลิงค์ตัวอย่างไฟล์เกมส์ประกอบบทความนะคะ
[hide][/hide]


บทความโดย Nookfufu2
(ขอสงวนสิทธิ์ให้เผยแพร่เฉพาะในเว็บไทยกราฟเท่านั้น!!!)
ไฟล์แนบ: คุณจำเป็นต้องเข้าสู่ระบบก่อนจึงจะสามารถดูและดาวน์โหลดไฟล์แนบได้ หากยังไม่มีแอคเคานต์หรือยังไม่ได้เป็นสมาชิก กรุณาสมัครสมาชิก
บางบทความคุณจำเป็นต้องสมัครสมาชิกแบบ VIP และ SUPERVIP ถึงจะเข้าอ่านบทความได้

Rank: 10Rank: 10Rank: 10

โพสต์เมื่อ 18-5-2015 19:41 |แสดงโพสต์ทั้งหมด
ขบอคุณมากครับ หน้าสนใจมากเลย

Rank: 1

โพสต์เมื่อ 26-8-2015 16:35 |แสดงโพสต์ทั้งหมด
ขอบคุณค่า

Rank: 1

โพสต์เมื่อ 5-12-2015 21:16 |แสดงโพสต์ทั้งหมด
ขอบคุณค่ะ

Rank: 1

โพสต์เมื่อ 25-12-2015 22:21 |แสดงโพสต์ทั้งหมด

Rank: 1

โพสต์เมื่อ 13-7-2016 09:38 |แสดงโพสต์ทั้งหมด
ขอบคุณมากครับ

Rank: 1

โพสต์เมื่อ 31-8-2017 11:14 |แสดงโพสต์ทั้งหมด
55555555555555

Rank: 1

โพสต์เมื่อ 26-4-2019 14:58 |แสดงโพสต์ทั้งหมด
โอ้ว
คุณต้องเข้าสู่ระบบก่อนจึงจะสามารถตอบกลับ เข้าสู่ระบบ | สมัครสมาชิก


Thaigraph

GMT+7, 18-6-2019 11:49 , Processed in 0.253407 second(s), 22 queries .

Powered by Discuz! X1.5

© 2001-2010 Comsenz Inc. Thai Language by DiscuzThai! Team.

Top 10 Best Sellers in Clothing for 2017 Top 10 Best Sellers in Clothing Best Sellers in Clothing
Top 10 Best Sellers in Books reviewer 2017 Top 10 Best Sellers in Books Best Sellers in Books