import gradio as gr import random ######################### # ฟังก์ชันคำนวณง่าย ๆ ######################### def approximate_temperature(planet_type, distance_au): """ คำนวณอุณหภูมิ (สมมุติเบื้องต้น) ตามชนิดดาว + ระยะ AU """ # กำหนด base_temp if planet_type == "ดาวหิน (Rocky Planet)": base_temp = 15 elif planet_type == "ดาวก๊าซ (Gas Giant)": base_temp = 30 elif planet_type == "ดาวน้ำแข็ง (Icy Planet)": base_temp = -50 else: base_temp = 0 # ปรับตามระยะทาง if distance_au > 1.0: diff = (distance_au - 1.0) * 20 approx_temp = base_temp - diff else: diff = (1.0 - distance_au) * 30 approx_temp = base_temp + diff return round(approx_temp) def approximate_gravity(diameter_earth): """ แรงโน้มถ่วงสมมุติ (g) = diameter_earth เท่า """ return round(1.0 * diameter_earth, 2) ######################### # ฟังก์ชันสรุปข้อมูล (สำหรับเด็ก) ######################### def child_friendly_summary( name_th, planet_type_th, temp_c, gravity_g, atmosphere_th, life_th ): """ สร้างข้อความสรุป (ภาษาไทย) ให้เด็กอ่านเข้าใจง่าย เช่น "ดาว ซานาดา เป็นดาวหิน อุณหภูมิใกล้ๆ 20°C มีบรรยากาศ..." """ if temp_c > 40: temp_comment = "ค่อนข้างร้อนเลยนะ!" elif temp_c < -10: temp_comment = "หนาวมาก ๆ เลยนะ!" else: temp_comment = "ค่อนข้างสบาย ๆ น่าอยู่!" if gravity_g > 1.5: gravity_comment = f"แรงโน้มถ่วงประมาณ {gravity_g}g เลยนะ อาจจะเดินยากหน่อย!" elif gravity_g < 0.5: gravity_comment = f"แรงโน้มถ่วงเบาแค่ {gravity_g}g ระวังลอยได้นะ!" else: gravity_comment = f"แรงโน้มถ่วงกำลังดี ~{gravity_g}g" summary_th = ( f"ดาว {name_th} เป็น{planet_type_th} " f"อุณหภูมิราว ๆ {temp_c}°C {temp_comment}\n" f"{gravity_comment}\n" f"บรรยากาศ: {atmosphere_th}\n" f"มีสิ่งมีชีวิต: {life_th}\n" f"น่าสนุกจังเลย!" ) return summary_th ######################### # ฟังก์ชันสร้าง Prompt ######################### def generate_planet_info( planet_name_th, planet_type_th, distance_str, diameter_str, atmosphere_th, life_th ): # 1) แปลง string เป็น float try: distance_au = float(distance_str) except: distance_au = 1.0 try: diameter_factor = float(diameter_str) except: diameter_factor = 1.0 # 2) คำนวณ temp_c = approximate_temperature(planet_type_th, distance_au) gravity_g = approximate_gravity(diameter_factor) # 3) สรุปเด็กอ่านง่าย (child_friendly_summary) child_summary = child_friendly_summary( planet_name_th, planet_type_th, temp_c, gravity_g, atmosphere_th, life_th ) # 4) รายละเอียดเชิงเทคนิค (ภาษาไทย) detail_th = ( f"ชื่อดาวเคราะห์: {planet_name_th}\n" f"ชนิดดาว: {planet_type_th}\n" f"ระยะห่างจากดาวฤกษ์: ~{distance_au} AU\n" f"ขนาด: ~{diameter_factor} เท่าโลก\n" f"อุณหภูมิพื้นผิวโดยประมาณ: ~{temp_c} °C\n" f"แรงโน้มถ่วง: ~{gravity_g} g\n" f"บรรยากาศ: {atmosphere_th}\n" f"สิ่งมีชีวิต: {life_th}\n" ) # 5) Prompt ภาษาอังกฤษ (สำหรับ Midjourney) # แปลง planet_type_th เป็นคำอังกฤษสั้น ๆ type_map = { "ดาวหิน (Rocky Planet)": "a rocky planet", "ดาวก๊าซ (Gas Giant)": "a gas giant", "ดาวน้ำแข็ง (Icy Planet)": "an icy planet", } type_en = type_map.get(planet_type_th, "a mysterious planet") prompt_en = ( f"Planet Name: '{planet_name_th}' | " f"{type_en}, orbiting at {distance_au} AU, " f"size about {diameter_factor}x Earth diameter, " f"with atmosphere '{atmosphere_th}', " f"hosting '{life_th}'. " f"Surface temperature ~{temp_c} C, " f"gravity ~{gravity_g} g. " f"Highly detailed, awe-inspiring, cinematic." ) return child_summary, detail_th, prompt_en ######################### # สร้าง UI (Gradio) ######################### css_code = """ body { background-color: #F9FBFF; font-family: "Kanit", sans-serif; } #title { color: #4A90E2; text-align: center; font-size: 2rem; margin-top: 20px; margin-bottom: 10px; font-weight: bold; } .game-desc { margin: 0 auto; width: 90%; background-color: #ECF6FF; border: 2px dashed #B3DAFF; border-radius: 10px; padding: 15px; color: #333; margin-bottom: 20px; } .btn-main { background-color: #FFE066; border: 2px solid #FFCA28; font-weight: bold; font-size: 1.1rem; padding: 10px 30px; border-radius: 10px; margin-right: 10px; } #child-summary, #detail-th, #prompt-en { background-color: #FFFDF5; border: 2px solid #FFE082; border-radius: 10px; padding: 10px; margin-bottom: 20px; } """ def welcome_text(): return "ยินดีต้อนรับสู่ Planetary Adventure! ลองกรอกข้อมูลแล้วกด 'สร้างโลกแฟนตาซี' ดูสิ!" # ปุ่ม Copy Prompt (HTML + JS) copy_button_html = """ """ with gr.Blocks(css=css_code) as demo: gr.Markdown("

Planetary Adventure (Thai) + สรุปข้อมูลดวงดาว

") gr.Markdown("""

สร้างดาวเคราะห์ในจินตนาการ พร้อมข้อความสรุปสนุก ๆ สำหรับเด็ก และ Prompt ภาษาอังกฤษเพื่อนำไปเจนภาพ!

  1. กรอกข้อมูลด้านล่างเป็นภาษาไทย เช่น ชื่อดาว, ชนิดดาว, ฯลฯ
  2. กดปุ่ม "สร้างโลกแฟนตาซี"
  3. ดู ข้อความสรุป (สำหรับเด็ก), รายละเอียด (เทคนิค) และ Prompt อังกฤษ
  4. กด "คัดลอก Prompt" เพื่อเอาไปใช้ใน AI สร้างภาพ เช่น Midjourney
""") planet_name = gr.Textbox(label="ชื่อดาวเคราะห์ (ภาษาไทย)", placeholder="ตัวอย่าง: ดาวซานาดา") planet_type = gr.Dropdown( label="ชนิดดาว", choices=["ดาวหิน (Rocky Planet)", "ดาวก๊าซ (Gas Giant)", "ดาวน้ำแข็ง (Icy Planet)"], value="ดาวหิน (Rocky Planet)" ) distance_au = gr.Textbox(label="ระยะห่างจากดาวฤกษ์ (หน่วย AU)", placeholder="เช่น 0.8 หรือ 1 หรือ 2") diameter_factor = gr.Textbox(label="ขนาดเส้นผ่านศูนย์กลาง (เท่าโลก)", placeholder="เช่น 1, 2, 0.5") atmosphere_th = gr.Textbox(label="ลักษณะบรรยากาศ", placeholder="ตัวอย่าง: ออกซิเจนบาง ๆ, มีคาร์บอนไดออกไซด์สูง") life_th = gr.Textbox(label="สิ่งมีชีวิตบนดาว", placeholder="ตัวอย่าง: สัตว์เลื้อยคลานขนาดยักษ์") create_btn = gr.Button("สร้างโลกแฟนตาซี", elem_classes="btn-main") child_summary_output = gr.Textbox( label="ข้อความสรุป (อ่านง่ายสำหรับเด็ก)", interactive=False, elem_id="child-summary" ) detail_th_output = gr.Textbox( label="รายละเอียด (เทคนิค)", interactive=False, elem_id="detail-th" ) prompt_en_output = gr.Textbox( label="Prompt ภาษาอังกฤษ", interactive=False, elem_id="prompt-en" ) gr.HTML(copy_button_html) # เมื่อกดปุ่ม create_btn.click( fn=generate_planet_info, inputs=[planet_name, planet_type, distance_au, diameter_factor, atmosphere_th, life_th], outputs=[child_summary_output, detail_th_output, prompt_en_output] ) demo.load(fn=welcome_text, inputs=None, outputs=child_summary_output) demo.launch()