fork download
  1. import random
  2. import time
  3. import os
  4.  
  5. class Horse:
  6. """
  7. คลาสสำหรับแสดงข้อมูลของม้าแต่ละตัวในการแข่งขัน
  8. """
  9. def __init__(self, name, emoji, odds):
  10. self.name = name # ชื่อของม้า
  11. self.emoji = emoji # อีโมจิแทนตัวม้า (ใช้สำหรับแสดงผลบนหน้าจอ)
  12. self.odds = odds # อัตราต่อรองของม้า (ตัวคูณเงินรางวัล)
  13. self.position = 0 # ตำแหน่งปัจจุบันของม้าบนสนามแข่ง
  14.  
  15. def move(self):
  16. """
  17. คำนวณการเคลื่อนที่ของม้าในแต่ละรอบ
  18. ม้าที่มีอัตราต่อรองต่ำ (มีโอกาสชนะสูงกว่า) จะมีแนวโน้มก้าวได้ไกลกว่า
  19. """
  20. # ปรับความเร็วสูงสุดตามอัตราต่อรอง: ยิ่ง odds ต่ำ (ม้าเก่ง) ยิ่ง max_step สูง
  21. # เพิ่มค่าคงที่ 3 เพื่อให้ม้ามีการเคลื่อนไหวเสมอ
  22. max_step = int(10 / self.odds) + 3
  23. step = random.randint(1, max_step) # สุ่มก้าวเดิน
  24. self.position += step
  25.  
  26. class RaceGame:
  27. """
  28. คลาสหลักสำหรับจัดการตรรกะของเกมแข่งม้าทั้งหมด
  29. """
  30. def __init__(self, initial_credit=2000):
  31. self.credit = initial_credit # เครดิตเริ่มต้นของผู้เล่น
  32. self.horses = [
  33. Horse("พยัคฆ์ทมิฬ", "🐎", 2.5), # ม้า 1
  34. Horse("ม้าเร็วแสง", "🏇", 3.0), # ม้า 2
  35. Horse("สายฟ้าผ่า", "🐴", 4.0), # ม้า 3
  36. Horse("ลมกรด", "🦄", 5.5), # ม้า 4
  37. Horse("อัศวินรัตติกาล", "🎠", 7.0) # ม้า 5
  38. ]
  39. self.track_length = 60 # ความยาวของสนามแข่ง (ในหน่วยตัวอักษร)
  40. self.bet_amount = 0 # จำนวนเครดิตที่เดิมพันในรอบปัจจุบัน
  41. self.bet_horse_id = -1 # ID ของม้าที่เดิมพัน (-1 หากยังไม่ได้เดิมพัน)
  42. self.is_race_active = False # สถานะการแข่ง (True หากกำลังแข่งอยู่)
  43.  
  44. def clear_screen(self):
  45. """
  46. ล้างหน้าจอ Console
  47. """
  48. os.system('cls' if os.name == 'nt' else 'clear')
  49.  
  50. def display_status(self):
  51. """
  52. แสดงสถานะปัจจุบันของเกม (เครดิต, อัตราต่อรอง)
  53. """
  54. self.clear_screen()
  55. print("+" + "="*40 + "+")
  56. print(f"| {'เกมแข่งม้าพยัคฆ์นำโชค':^38} |")
  57. print("+" + "="*40 + "+")
  58. print(f" เครดิตของคุณ: {self.credit} 💰")
  59. print("-" * 42)
  60. print(" อัตราต่อรองม้า:")
  61. for i, horse in enumerate(self.horses):
  62. print(f" [{i+1}] {horse.emoji} {horse.name}: {horse.odds:.1f}x")
  63. print("-" * 42)
  64.  
  65. def place_bet(self):
  66. """
  67. ให้ผู้เล่นวางเดิมพัน
  68. """
  69. if self.is_race_active:
  70. print("ไม่สามารถวางเดิมพันขณะการแข่งขันกำลังดำเนินอยู่ได้")
  71. return False
  72.  
  73. while True:
  74. self.display_status()
  75. print("\n")
  76. print("เลือกม้าที่จะเดิมพัน:")
  77. for i, horse in enumerate(self.horses):
  78. print(f" [{i+1}] {horse.name}")
  79. print(" [0] ยกเลิก")
  80.  
  81. try:
  82. choice = int(input("ป้อนหมายเลขม้าที่คุณต้องการเดิมพัน: "))
  83. if choice == 0:
  84. self.bet_horse_id = -1
  85. self.bet_amount = 0
  86. print("ยกเลิกการเดิมพันแล้ว.")
  87. return False
  88. if 1 <= choice <= len(self.horses):
  89. self.bet_horse_id = choice - 1
  90. break
  91. else:
  92. print("ตัวเลือกไม่ถูกต้อง กรุณาลองใหม่")
  93. except ValueError:
  94. print("ป้อนตัวเลขเท่านั้น กรุณาลองใหม่")
  95.  
  96. while True:
  97. try:
  98. amount = int(input(f"ป้อนจำนวนเครดิตที่ต้องการเดิมพัน (มี {self.credit} 💰): "))
  99. if 0 < amount <= self.credit:
  100. self.bet_amount = amount
  101. # หักเครดิตทันทีที่วางเดิมพัน
  102. self.credit -= self.bet_amount
  103. print(f"คุณเดิมพัน {self.bet_amount} เครดิตกับ {self.horses[self.bet_horse_id].name}!")
  104. return True
  105. else:
  106. print("จำนวนเครดิตไม่ถูกต้องหรือไม่เพียงพอ กรุณาลองใหม่")
  107. except ValueError:
  108. print("ป้อนตัวเลขเท่านั้น กรุณาลองใหม่")
  109.  
  110. def draw_track(self):
  111. """
  112. วาดสนามแข่งและตำแหน่งของม้าบนหน้าจอ Console
  113. """
  114. self.clear_screen()
  115. print("+" + "="* (self.track_length + 10) + "+")
  116. print(f"| {'การแข่งขันม้าพยัคฆ์นำโชค':^{self.track_length + 8}} |")
  117. print("+" + "="* (self.track_length + 10) + "+")
  118. print(f" เครดิต: {self.credit} 💰")
  119. # แสดงข้อมูลเดิมพันปัจจุบัน
  120. bet_info = f"เดิมพัน: {self.bet_amount} กับ {self.horses[self.bet_horse_id].name}" if self.bet_horse_id != -1 else "ยังไม่ได้วางเดิมพัน"
  121. print(f" {bet_info}")
  122. print("-" * (self.track_length + 12))
  123.  
  124. for i, horse in enumerate(self.horses):
  125. track_segment = ['_'] * self.track_length
  126. # ตรวจสอบให้แน่ใจว่าม้าไม่ออกนอกสนาม (visual)
  127. horse_pos_on_track = min(int(horse.position), self.track_length - 1)
  128. track_segment[horse_pos_on_track] = horse.emoji
  129. track_line = "".join(track_segment)
  130. print(f"[{i+1}] {track_line} | เส้นชัย")
  131. print("-" * (self.track_length + 12))
  132.  
  133.  
  134. def run_race(self):
  135. """
  136. ดำเนินการแข่งขันม้าจนกว่าจะมีผู้ชนะ
  137. """
  138. if self.bet_amount == 0 or self.bet_horse_id == -1:
  139. print("กรุณาวางเดิมพันก่อนเริ่มการแข่งขัน.")
  140. return
  141.  
  142. self.is_race_active = True
  143. for horse in self.horses:
  144. horse.position = 0 # รีเซ็ตตำแหน่งม้าทุกตัวไปที่จุดเริ่มต้น
  145.  
  146. print("กำลังเตรียมการแข่งขัน...")
  147.  
  148. winner_id = -1
  149. while winner_id == -1:
  150. self.draw_track() # วาดสนามแข่งในแต่ละเฟรม
  151. for horse in self.horses:
  152. horse.move()
  153. if horse.position >= self.track_length:
  154. winner_id = horse.id
  155. break # พบผู้ชนะแล้ว หยุดการเคลื่อนที่
  156.  
  157. time.sleep(0.15) # หน่วงเวลาเพื่อให้เห็นภาพการเคลื่อนไหว (150ms)
  158.  
  159. self.draw_track() # วาดสนามแข่งเป็นครั้งสุดท้ายเพื่อแสดงผลลัพธ์
  160. winning_horse = self.horses[winner_id]
  161. print(f"\n🎉 ม้า {winning_horse.name} ชนะการแข่งขัน! 🎉")
  162.  
  163. if self.bet_horse_id == winner_id:
  164. winnings = self.bet_amount * winning_horse.odds
  165. self.credit += winnings # เพิ่มเงินรางวัลให้กับเครดิต
  166. print(f"ยินดีด้วย! คุณชนะ {winnings:.1f} เครดิต!")
  167. else:
  168. print(f"เสียใจด้วย คุณแพ้การเดิมพัน {self.bet_amount} เครดิต.")
  169.  
  170. self.bet_amount = 0 # รีเซ็ตการเดิมพันสำหรับรอบถัดไป
  171. self.bet_horse_id = -1
  172. self.is_race_active = False
  173. input("\nกด Enter เพื่อเล่นต่อ...")
  174.  
  175. def play(self):
  176. """
  177. เริ่มเกมและจัดการเมนูหลัก
  178. """
  179. while True:
  180. self.display_status()
  181. print("\n")
  182. print("1. วางเดิมพัน")
  183. print("2. เริ่มการแข่งขัน (ต้องวางเดิมพันก่อน)")
  184. print("3. ออกจากเกม")
  185.  
  186. choice = input("ป้อนตัวเลือกของคุณ: ")
  187.  
  188. if choice == '1':
  189. self.place_bet()
  190. elif choice == '2':
  191. # ตรวจสอบว่ามีการวางเดิมพันก่อนเริ่มแข่ง
  192. if self.bet_amount > 0 and self.bet_horse_id != -1:
  193. self.run_race()
  194. else:
  195. print("กรุณาวางเดิมพันก่อนเริ่มการแข่งขัน.")
  196. elif choice == '3':
  197. print("ขอบคุณที่เล่น! แล้วพบกันใหม่!")
  198. break
  199. else:
  200. print("ตัวเลือกไม่ถูกต้อง กรุณาลองใหม่.")
  201.  
  202. # เริ่มเกมเมื่อรันสคริปต์โดยตรง
  203. if __name__ == "__main__":
  204. game = RaceGame()
  205. game.play()
Success #stdin #stdout 0.03s 25656KB
stdin
Standard input is empty
stdout
import random
import time
import os

class Horse:
    """
    คลาสสำหรับแสดงข้อมูลของม้าแต่ละตัวในการแข่งขัน
    """
    def __init__(self, name, emoji, odds):
        self.name = name    # ชื่อของม้า
        self.emoji = emoji  # อีโมจิแทนตัวม้า (ใช้สำหรับแสดงผลบนหน้าจอ)
        self.odds = odds    # อัตราต่อรองของม้า (ตัวคูณเงินรางวัล)
        self.position = 0   # ตำแหน่งปัจจุบันของม้าบนสนามแข่ง

    def move(self):
        """
        คำนวณการเคลื่อนที่ของม้าในแต่ละรอบ
        ม้าที่มีอัตราต่อรองต่ำ (มีโอกาสชนะสูงกว่า) จะมีแนวโน้มก้าวได้ไกลกว่า
        """
        # ปรับความเร็วสูงสุดตามอัตราต่อรอง: ยิ่ง odds ต่ำ (ม้าเก่ง) ยิ่ง max_step สูง
        # เพิ่มค่าคงที่ 3 เพื่อให้ม้ามีการเคลื่อนไหวเสมอ
        max_step = int(10 / self.odds) + 3
        step = random.randint(1, max_step) # สุ่มก้าวเดิน
        self.position += step

class RaceGame:
    """
    คลาสหลักสำหรับจัดการตรรกะของเกมแข่งม้าทั้งหมด
    """
    def __init__(self, initial_credit=2000):
        self.credit = initial_credit # เครดิตเริ่มต้นของผู้เล่น
        self.horses = [
            Horse("พยัคฆ์ทมิฬ", "🐎", 2.5), # ม้า 1
            Horse("ม้าเร็วแสง", "🏇", 3.0), # ม้า 2
            Horse("สายฟ้าผ่า", "🐴", 4.0), # ม้า 3
            Horse("ลมกรด", "🦄", 5.5), # ม้า 4
            Horse("อัศวินรัตติกาล", "🎠", 7.0)  # ม้า 5
        ]
        self.track_length = 60      # ความยาวของสนามแข่ง (ในหน่วยตัวอักษร)
        self.bet_amount = 0         # จำนวนเครดิตที่เดิมพันในรอบปัจจุบัน
        self.bet_horse_id = -1      # ID ของม้าที่เดิมพัน (-1 หากยังไม่ได้เดิมพัน)
        self.is_race_active = False # สถานะการแข่ง (True หากกำลังแข่งอยู่)

    def clear_screen(self):
        """
        ล้างหน้าจอ Console
        """
        os.system('cls' if os.name == 'nt' else 'clear')

    def display_status(self):
        """
        แสดงสถานะปัจจุบันของเกม (เครดิต, อัตราต่อรอง)
        """
        self.clear_screen()
        print("+" + "="*40 + "+")
        print(f"| {'เกมแข่งม้าพยัคฆ์นำโชค':^38} |")
        print("+" + "="*40 + "+")
        print(f"  เครดิตของคุณ: {self.credit} 💰")
        print("-" * 42)
        print("  อัตราต่อรองม้า:")
        for i, horse in enumerate(self.horses):
            print(f"    [{i+1}] {horse.emoji} {horse.name}: {horse.odds:.1f}x")
        print("-" * 42)

    def place_bet(self):
        """
        ให้ผู้เล่นวางเดิมพัน
        """
        if self.is_race_active:
            print("ไม่สามารถวางเดิมพันขณะการแข่งขันกำลังดำเนินอยู่ได้")
            time.sleep(1)
            return False

        while True:
            self.display_status()
            print("\n")
            print("เลือกม้าที่จะเดิมพัน:")
            for i, horse in enumerate(self.horses):
                print(f"  [{i+1}] {horse.name}")
            print("  [0] ยกเลิก")

            try:
                choice = int(input("ป้อนหมายเลขม้าที่คุณต้องการเดิมพัน: "))
                if choice == 0:
                    self.bet_horse_id = -1
                    self.bet_amount = 0
                    print("ยกเลิกการเดิมพันแล้ว.")
                    time.sleep(1)
                    return False
                if 1 <= choice <= len(self.horses):
                    self.bet_horse_id = choice - 1
                    break
                else:
                    print("ตัวเลือกไม่ถูกต้อง กรุณาลองใหม่")
                    time.sleep(1)
            except ValueError:
                print("ป้อนตัวเลขเท่านั้น กรุณาลองใหม่")
                time.sleep(1)

        while True:
            try:
                amount = int(input(f"ป้อนจำนวนเครดิตที่ต้องการเดิมพัน (มี {self.credit} 💰): "))
                if 0 < amount <= self.credit:
                    self.bet_amount = amount
                    # หักเครดิตทันทีที่วางเดิมพัน
                    self.credit -= self.bet_amount
                    print(f"คุณเดิมพัน {self.bet_amount} เครดิตกับ {self.horses[self.bet_horse_id].name}!")
                    time.sleep(1)
                    return True
                else:
                    print("จำนวนเครดิตไม่ถูกต้องหรือไม่เพียงพอ กรุณาลองใหม่")
                    time.sleep(1)
            except ValueError:
                print("ป้อนตัวเลขเท่านั้น กรุณาลองใหม่")
                time.sleep(1)

    def draw_track(self):
        """
        วาดสนามแข่งและตำแหน่งของม้าบนหน้าจอ Console
        """
        self.clear_screen()
        print("+" + "="* (self.track_length + 10) + "+")
        print(f"| {'การแข่งขันม้าพยัคฆ์นำโชค':^{self.track_length + 8}} |")
        print("+" + "="* (self.track_length + 10) + "+")
        print(f"  เครดิต: {self.credit} 💰")
        # แสดงข้อมูลเดิมพันปัจจุบัน
        bet_info = f"เดิมพัน: {self.bet_amount} กับ {self.horses[self.bet_horse_id].name}" if self.bet_horse_id != -1 else "ยังไม่ได้วางเดิมพัน"
        print(f"  {bet_info}")
        print("-" * (self.track_length + 12))

        for i, horse in enumerate(self.horses):
            track_segment = ['_'] * self.track_length
            # ตรวจสอบให้แน่ใจว่าม้าไม่ออกนอกสนาม (visual)
            horse_pos_on_track = min(int(horse.position), self.track_length - 1)
            track_segment[horse_pos_on_track] = horse.emoji
            track_line = "".join(track_segment)
            print(f"[{i+1}] {track_line} | เส้นชัย")
        print("-" * (self.track_length + 12))


    def run_race(self):
        """
        ดำเนินการแข่งขันม้าจนกว่าจะมีผู้ชนะ
        """
        if self.bet_amount == 0 or self.bet_horse_id == -1:
            print("กรุณาวางเดิมพันก่อนเริ่มการแข่งขัน.")
            time.sleep(1)
            return

        self.is_race_active = True
        for horse in self.horses:
            horse.position = 0 # รีเซ็ตตำแหน่งม้าทุกตัวไปที่จุดเริ่มต้น

        print("กำลังเตรียมการแข่งขัน...")
        time.sleep(2)

        winner_id = -1
        while winner_id == -1:
            self.draw_track() # วาดสนามแข่งในแต่ละเฟรม
            for horse in self.horses:
                horse.move()
                if horse.position >= self.track_length:
                    winner_id = horse.id
                    break # พบผู้ชนะแล้ว หยุดการเคลื่อนที่

            time.sleep(0.15) # หน่วงเวลาเพื่อให้เห็นภาพการเคลื่อนไหว (150ms)

        self.draw_track() # วาดสนามแข่งเป็นครั้งสุดท้ายเพื่อแสดงผลลัพธ์
        winning_horse = self.horses[winner_id]
        print(f"\n🎉 ม้า {winning_horse.name} ชนะการแข่งขัน! 🎉")

        if self.bet_horse_id == winner_id:
            winnings = self.bet_amount * winning_horse.odds
            self.credit += winnings # เพิ่มเงินรางวัลให้กับเครดิต
            print(f"ยินดีด้วย! คุณชนะ {winnings:.1f} เครดิต!")
        else:
            print(f"เสียใจด้วย คุณแพ้การเดิมพัน {self.bet_amount} เครดิต.")

        self.bet_amount = 0 # รีเซ็ตการเดิมพันสำหรับรอบถัดไป
        self.bet_horse_id = -1
        self.is_race_active = False
        input("\nกด Enter เพื่อเล่นต่อ...")

    def play(self):
        """
        เริ่มเกมและจัดการเมนูหลัก
        """
        while True:
            self.display_status()
            print("\n")
            print("1. วางเดิมพัน")
            print("2. เริ่มการแข่งขัน (ต้องวางเดิมพันก่อน)")
            print("3. ออกจากเกม")

            choice = input("ป้อนตัวเลือกของคุณ: ")

            if choice == '1':
                self.place_bet()
            elif choice == '2':
                # ตรวจสอบว่ามีการวางเดิมพันก่อนเริ่มแข่ง
                if self.bet_amount > 0 and self.bet_horse_id != -1:
                    self.run_race()
                else:
                    print("กรุณาวางเดิมพันก่อนเริ่มการแข่งขัน.")
                    time.sleep(1)
            elif choice == '3':
                print("ขอบคุณที่เล่น! แล้วพบกันใหม่!")
                break
            else:
                print("ตัวเลือกไม่ถูกต้อง กรุณาลองใหม่.")
                time.sleep(1)

# เริ่มเกมเมื่อรันสคริปต์โดยตรง
if __name__ == "__main__":
    game = RaceGame()
    game.play()