เรื่องสคริปท์ (ต่อ)
posted on 10 Aug 2005 18:31 by 9tawan in Project
วันนี้ คะแนนวิชา Intro to Concurrency ออก เห็นแล้วตกใจ เฮ้ย เป็นไปได้ไง 49/50 เคยทำได้สูงสุดก็แค่ 18/20 (Intro Com Prog II) แต่ ดูไปดูมา อ้าวเฮ้ย เต็ม 90 ว่ะ (อ.เขียนของผมผิดคนเดียว) อะไรกัน เหอ ๆๆ
ตอนนั่งรถเมล์ก็นึกอะไรออกอย่าง ถ้าสามารถให้ตัว Script รันจากบรรทัดไหนก็ได้ (โดยการตัดสคริปท์ด้านบนออก) มันจะมีปัญหาแน่ ๆ สมมติว่า ...
if score<20 then
showScore()
#ทำอะไรสักอย่าง
run("win.scr")
else run("lose.scr")
แล้ว ถ้าผมรันจากบรรทัดที่ 2 ? จะเกิดอะไรขึ้นล่ะ else cause ที่ไม่ทราบที่มาก็จะสร้างปัญหาน่ะสิ (ก็ไม่รู้ว่ามาจาก else ไหนอ่ะ)
โจทย์ของผมก็คือ ต้องทำให้ตัวเกมมันสามารถเซฟจากจุดใดก็ได้ของเกม ตอนแรกคิดว่าจะแค่ข้ามบรรทัดด้านบนไปเฉย ๆ แต่ ดูจากข้างบนก็น่าจะรู้แล้วนะครับ ดังนั้นผมเลยต้องเปลี่ยนมาใช้วิธีทางโปรแกรมคือ ต้องทำตัวเก็บ State เก็บว่า ค่า state ต่าง ๆ ที่ผ่านมาในสคริปท์นั้น ๆ มีอะไรบ้าง อย่างเช่น
selectchoice = showSelectChoice()
if selectvalue == 0 then
stateA+=10
showText("ชั้นเกลียดคุณ");
selectchoice = showSelectChoice()
else
statusB += 20
showText("อย่ามาให้ชั้นเห็นหน้าอีก")
selectchoice = showSelectChoice()
if selectchoice == 0 then
#ทำอะไรก็ว่าไป
จะสังเกตได้ว่า ทางแยกส่วนใหญ่ของตัวเกมมาจากตัว user แทบทั้งนั้น ดังนั้นก็แค่เก็บว่าทำอะไรไว้บ้างลงไปใน linklist หรือใน stack เสร็จแล้วก็พอเซฟก็ให้เก็บค่าที่ทำไว้ จากนั้น พอถึงเวลาก็รันสคริปท์เพียงแต่ว่าจะไม่ถาม user รอบสองแต่ว่าจะใช้ค่าที่เก็บไว้แทน (เริ่มเป็นเรื่องใหญ่แล้วไง) คือ ตรงนี้ก็ไม่ต้องแสดงให้คนเล่นเห็น (อาจจะขึ้น Now Loading บังหน้าไปก็ได้ 555)
จริง ๆ มันยังมีปัญหาเกี่ยวกับพวกค่าตัวแปรที่ไม่ได้มาจาก widget (เพราะว่าค่าจาก widget สามารถใช้วิธีซิกแซกเอาค่าพวกนี้ออกมาได้ แต่จากตัวแประที่มาจากตัวสคริปท์เองจะลำบากกว่า) คิดว่าต้องออกแบบเรื่องการจัดการ state หรือพวกตัวแปรต่าง ๆ ให้ดีมาก ๆ ถึงจะเวิร์ค
อีกระบบที่ง่ายกว่า คือ บังคับให้ว่าเวลาเซฟให้เก็บแค่ค่าตัวแปรระบบบางตัว กับแค่ว่ารันสคริปท์อะไรอยู่ พอโหลดขึ้นมาก็รันสคริปท์ใหม่ตั้งแต่ต้น แต่จะขาดความคล่องตัวตรงนี้ไปเท่านั้นเอง (แต่ของมันง่ายกว่าเยอะ) สรุปว่าเอาไงดีน้า ~
มีความเห็นไงก็โพสต์ ๆ ได้เน้่อ
:D
edit @ 2005/08/11 23:34:59
ตอนนั่งรถเมล์ก็นึกอะไรออกอย่าง ถ้าสามารถให้ตัว Script รันจากบรรทัดไหนก็ได้ (โดยการตัดสคริปท์ด้านบนออก) มันจะมีปัญหาแน่ ๆ สมมติว่า ...
if score<20 then
showScore()
#ทำอะไรสักอย่าง
run("win.scr")
else run("lose.scr")
แล้ว ถ้าผมรันจากบรรทัดที่ 2 ? จะเกิดอะไรขึ้นล่ะ else cause ที่ไม่ทราบที่มาก็จะสร้างปัญหาน่ะสิ (ก็ไม่รู้ว่ามาจาก else ไหนอ่ะ)
โจทย์ของผมก็คือ ต้องทำให้ตัวเกมมันสามารถเซฟจากจุดใดก็ได้ของเกม ตอนแรกคิดว่าจะแค่ข้ามบรรทัดด้านบนไปเฉย ๆ แต่ ดูจากข้างบนก็น่าจะรู้แล้วนะครับ ดังนั้นผมเลยต้องเปลี่ยนมาใช้วิธีทางโปรแกรมคือ ต้องทำตัวเก็บ State เก็บว่า ค่า state ต่าง ๆ ที่ผ่านมาในสคริปท์นั้น ๆ มีอะไรบ้าง อย่างเช่น
selectchoice = showSelectChoice()
if selectvalue == 0 then
stateA+=10
showText("ชั้นเกลียดคุณ");
selectchoice = showSelectChoice()
else
statusB += 20
showText("อย่ามาให้ชั้นเห็นหน้าอีก")
selectchoice = showSelectChoice()
if selectchoice == 0 then
#ทำอะไรก็ว่าไป
จะสังเกตได้ว่า ทางแยกส่วนใหญ่ของตัวเกมมาจากตัว user แทบทั้งนั้น ดังนั้นก็แค่เก็บว่าทำอะไรไว้บ้างลงไปใน linklist หรือใน stack เสร็จแล้วก็พอเซฟก็ให้เก็บค่าที่ทำไว้ จากนั้น พอถึงเวลาก็รันสคริปท์เพียงแต่ว่าจะไม่ถาม user รอบสองแต่ว่าจะใช้ค่าที่เก็บไว้แทน (เริ่มเป็นเรื่องใหญ่แล้วไง) คือ ตรงนี้ก็ไม่ต้องแสดงให้คนเล่นเห็น (อาจจะขึ้น Now Loading บังหน้าไปก็ได้ 555)
จริง ๆ มันยังมีปัญหาเกี่ยวกับพวกค่าตัวแปรที่ไม่ได้มาจาก widget (เพราะว่าค่าจาก widget สามารถใช้วิธีซิกแซกเอาค่าพวกนี้ออกมาได้ แต่จากตัวแประที่มาจากตัวสคริปท์เองจะลำบากกว่า) คิดว่าต้องออกแบบเรื่องการจัดการ state หรือพวกตัวแปรต่าง ๆ ให้ดีมาก ๆ ถึงจะเวิร์ค
อีกระบบที่ง่ายกว่า คือ บังคับให้ว่าเวลาเซฟให้เก็บแค่ค่าตัวแปรระบบบางตัว กับแค่ว่ารันสคริปท์อะไรอยู่ พอโหลดขึ้นมาก็รันสคริปท์ใหม่ตั้งแต่ต้น แต่จะขาดความคล่องตัวตรงนี้ไปเท่านั้นเอง (แต่ของมันง่ายกว่าเยอะ) สรุปว่าเอาไงดีน้า ~
มีความเห็นไงก็โพสต์ ๆ ได้เน้่อ
:D
edit @ 2005/08/11 23:34:59