|
import gradio as gr |
|
import random |
|
|
|
|
|
|
|
|
|
|
|
def approximate_temperature(planet_type, distance_au): |
|
""" |
|
คำนวณอุณหภูมิ (สมมุติเบื้องต้น) ตามชนิดดาว + ระยะ AU |
|
""" |
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
def generate_planet_info( |
|
planet_name_th, |
|
planet_type_th, |
|
distance_str, |
|
diameter_str, |
|
atmosphere_th, |
|
life_th |
|
): |
|
|
|
try: |
|
distance_au = float(distance_str) |
|
except: |
|
distance_au = 1.0 |
|
|
|
try: |
|
diameter_factor = float(diameter_str) |
|
except: |
|
diameter_factor = 1.0 |
|
|
|
|
|
temp_c = approximate_temperature(planet_type_th, distance_au) |
|
gravity_g = approximate_gravity(diameter_factor) |
|
|
|
|
|
child_summary = child_friendly_summary( |
|
planet_name_th, planet_type_th, temp_c, gravity_g, atmosphere_th, life_th |
|
) |
|
|
|
|
|
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" |
|
) |
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
|
|
|
|
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_button_html = """ |
|
<button style="background-color: #F06292; border: 2px solid #E91E63; font-weight: bold; |
|
font-size: 1.0rem; padding: 8px 20px; border-radius: 10px;" |
|
onclick="copyPromptText()"> |
|
คัดลอก Prompt |
|
</button> |
|
<script> |
|
function copyPromptText() { |
|
const promptBox = document.querySelector('#prompt-en textarea'); |
|
if (!promptBox) { |
|
alert('ไม่พบข้อความ Prompt!'); |
|
return; |
|
} |
|
const promptText = promptBox.value; |
|
navigator.clipboard.writeText(promptText); |
|
alert('คัดลอก Prompt แล้ว! นำไปใช้ใน Midjourney ได้เลย~'); |
|
} |
|
</script> |
|
""" |
|
|
|
with gr.Blocks(css=css_code) as demo: |
|
gr.Markdown("<h1 id='title'>Planetary Adventure (Thai) + สรุปข้อมูลดวงดาว</h1>") |
|
gr.Markdown(""" |
|
<div class="game-desc"> |
|
<p>สร้างดาวเคราะห์ในจินตนาการ พร้อมข้อความสรุปสนุก ๆ สำหรับเด็ก และ Prompt ภาษาอังกฤษเพื่อนำไปเจนภาพ!</p> |
|
<ol> |
|
<li>กรอกข้อมูลด้านล่างเป็นภาษาไทย เช่น ชื่อดาว, ชนิดดาว, ฯลฯ</li> |
|
<li>กดปุ่ม <strong>"สร้างโลกแฟนตาซี"</strong></li> |
|
<li>ดู <em>ข้อความสรุป (สำหรับเด็ก)</em>, <em>รายละเอียด (เทคนิค)</em> และ <em>Prompt อังกฤษ</em></li> |
|
<li>กด "<strong>คัดลอก Prompt</strong>" เพื่อเอาไปใช้ใน AI สร้างภาพ เช่น Midjourney</li> |
|
</ol> |
|
</div> |
|
""") |
|
|
|
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() |
|
|