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("
สร้างดาวเคราะห์ในจินตนาการ พร้อมข้อความสรุปสนุก ๆ สำหรับเด็ก และ Prompt ภาษาอังกฤษเพื่อนำไปเจนภาพ!