: คำแนะนำในการทำปฏิบัติการ

lab นี้เป็น lab ครั้งแรก ไม่ต้องส่ง แต่ part 1 ต้องทำให้เสร็จ ส่วน part 2 เอากลับไปทำเล่นต่อเนื่องเรื่อยๆนะ 






Lab 1 : Part 1 เริ่มใช้ Eclipse
 

วันนี้เราจะมาลองเครื่องมือใหม่กัน เมื่อตอนปีหนึ่ง ทุกคนใช้ JLab ในการเขียนจาวา ปีนี้เราจะมาใช้เครื่องมืออีกตัว เรียกว่า Eclipse ซึ่งใช้ได้ดีมากๆ

ก่อนอื่นมาดูวิธี install กันก่อน

1. download file zip มาจาก www.eclipse.org (ราวๆ 120 MB)
2. extract zip file ไปที่ directory ที่ต้องการลง

มีแค่นี้เลย install ง่ายมาก (ที่ศูนย์คอมฯเราได้ลงไว้ให้ทุกคนแล้ว หา shortcut เอา)

ลอง double click ขึ้นมาดู

ถ้าเปิดเข้าไปครั้งแรกก็จะมีกล่องขึ้นมาสำหรับใส่ folder ที่จะเก็บผลงานของตัวเอง ใน lab นี้ให้ใส่ว่า z:\eclipse ถ้าติ๊กเครื่องหมายถูกก็หมายความว่าเวลาเปิดครั้งหน้าก็ไม่ต้องมาถามอีก(ที่ไม่เอาไว้ drive c เพราะว่าศูนย์คอมฯ ไม่ให้ใช้นะ)

ตัว drive z นั้น เวลาเรา log in เข้าไปมันจะไปเชื่อมโยงกับที่เก็บข้อมูลส่วนตัวของเราในศูนย์คอม เพราะฉะนั้นเวลาต้องการใช้ เราสามารถไปนั่งที่เครื่องไหนก็ได้นะ
 

หน้าต่างหน้า intro จะเป็นแบบนี้


ปิดทิ้งไป วลาปิดให้กด กากบาทที่ด้านซ้ายบนของหน้าต่าง intro นะ อย่าเผลอไปกดมุมขวาบนของ Eclipse ล่ะ


1. ก้าวแรก สร้าง project
ก่อนจะเริ่มทำงานแต่ละงาน เราจะต้องสร้าง project ก่อน ที่ต้องมี project ก็เพื่อเอาไว้เก็บงานให้เป็นหมวดหมู่ จะได้ไม่ปะปนกันเวลาไฟล์เยอะๆ

เวลาจะสร้าง project ให้ไปที่ File ตรงมุมซ้ายบนแล้วเลือก new -> project


 

เราจะเขียนโปรแกรม Java เพราะฉะนั้น เราก็เลือก Java Project

เสร็จแล้วก็พิมพ์ชื่อ project ลงไป ให้ชื่อว่า Lab1 โดย case sensitive ตรงนี้จะสังเกตว่าเราเลือกได้ทั้ง next และ finish (ตรงนี้เราแค่จะสร้าง project ง่ายๆ เพราะ ฉะนั้นกด finish เลยก็ได้)
 

พอเสร็จแล้วในหน้าต่างด้านซ้ายก็จะมี project ของเราขึ้นมา เป็นการแสดงว่า project ของเราสร้างอยู่ในเครื่องแล้ว ต่อไปมันก็จะถามว่าจะเปลี่ยน perspective รึเปล่า ตอบ yes ไปละกัน


พอเปิดขึ้นมาครั้งแรกจะเห็นว่าหน้าจอแบ่งออกเป็น 4 ส่วน ดังนี้ครับ ซึ่งแต่ละส่วนเราสามารยืดขยายได้ตามใจ แล้วลากไปไหนก็ได้ด้วย



Tip: ลองคลิกขวาตรงหน้าต่างด้านซ้ายดูสิครับ จะเห็นว่ามี pop up menu new ขึ้นมาใช่มั้ยล่ะ ตรงนั้นก็ใช้สร้าง project ได้เหมือนกัน

 

2. ก้าวที่สอง สร้างไฟล์

ลองเลือกสร้าง class จาก File-> New ->Class
หรือจาก pop up menu เมื่อกี้

พอคลิกไปแล้วจะเห็นเป็นช่องๆ ให้กรอกรายละเอียดของ class

 

ในรูปตัวอย่างนี้ เป็นการสร้างคลาสใหม่ของ project ที่ชื่อว่า sort แต่ว่า ที่จะให้ทำ คือ สร้างคลาสอื่นนะ

ลองทำดูเอง ให้ลองสร้าง public class ชื่อ Hello ที่มี method main โดยไม่ต้อง inherit abstract method (ให้สร้างโดยใช้ ช่องที่ให้กรอกกับกา เท่านั้นนะ ห้ามมาพิมพ์เองทีหลังล่ะ)

พอสร้างเสร็จแล้วมันอาจจะมี comment เต็มไปหมดเลย ใน lab นี้ให้ปล่อย comment พวกนั้นเอาไว้นั่นแหละ ไม่ต้งลบทิ้งหรอกนะ (Eclipse สามารถช่วยเราร่าง comment ได้)

คราวนี้จะทำแบบครั้งแรกๆของจาวา โดยให้เขียนโปรแกรมให้พิมพ์คำว่า "Nate River"

เขียนเล้ยยยยยยย

ตอนที่เขียนอยู่ (ห้ามจดชื่อนี้ลงสมุดโน๊ต) สังเกตว่า ชื่อไฟล์จะมีเครื่องหมาย * ขึ้นมาด้วย ซึ่งหมายความว่า ไฟล์นี้ยังไม่ได้ save

ยังไม่ต้อง save นะ ให้ลองรันดูเลย ให้ไปที่เมนู Run แล้วเลือก Run As Java Application (ตรงนี้มันจะมีถามว่าจะ save รึเปล่า ก็ save ได้ตรงนี้เลย สรุปคือ Eclipse จะช่วยเรา save ไฟล์ได้อัตโนมัติ ) ผลลัพธ์จะออกที่ console ที่หน้าต่างล่าง

หมายเหตุ: Eclipse ช่วยเตือนเราว่าให้ save ในตอนที่จำเป็น ซึ่งเจ๋งมาก แต่ปัญหาคือ บางทีมันไม่ทำ เพราะฉะนั้น บางทีถ้าโปรแกรมรันไม่ได้ เราก็อาจจะต้อง save ด้วยตัวเองอีกรอบ ก่อนที่จะรันใหม่


3. Third step, importing file

การ import คือ การนำเอาไฟล์ที่ถูกสร้างไว้อยู่แล้วเข้ามาใน project เอาเป็นว่ามันคือการ copy ไฟล์เข้ามาใส่ใน project ที่เราต้องการนั่นแหละครับ แต่แทนที่เราจะทำใน windows explorer ก็ใช้วิธีนี้แทนจะง่ายกว่า

วิธีทำก็คือ คลิกขวาที่ชื่อ project แต่คราวนี้ให้เลือก import แทน

พอเข้าไปก็มีตัวเลือกอีกนั่นแหละ ที่ขอแนะนำในตอนนี้มีอยู่สองอัน ครับคือ file system หมายถึง import file ปกติเลย ส่วนอีกอันก็คือ Archive file ครับ จะเป็นการแตกไฟล์ zip พร้อมกับ import เข้ามา (zip ไฟล์ จะมีนามสกุล .jar ก็ได้ นี่เป็นไฟล์ที่เป็นการซิปใช้กับจาวา คงเคยเห็นกันมาแล้วจาก JLab)



-------
InsertionSort
ลอง import ไฟล์นี้ดูแล้วกันนะครับ อันนี้เป็นแบบเอาจากจาร์

เอาล่ะ ลอง import จาก file system ดูบ้าง ลอง unzip ตัวจาร์ที่โหลดมาไปไว้ซักที่ไหนที่หนึ่งใน drive z แล้วสร้างโปรเจ็คใหม่เลย แล้วคราวนี้ import จากโฟลเดอร์ที่ unzip ไว้
-------
 

4. ก้าวที่สี่ สร้าง .jar ไฟล์
 

จริงๆ แล้ว จาร์ก็คือ zip นั่นเอง แต่เราสามารถทำให้มัน executable ได้ด้วย (double click ใน window explorer แล้วมันจะ run program ที่เขียนด้วยภาษา Java ได้)

lab ของเราทุก lab จะต้องส่งเป็น jar file (ครั้งนี้ยังไม่ต้องส่ง)

วิธีสร้าง .jar fie เนี่ยก็คลิกขวา ที่ชื่อ project แล้ว เลือก export จากนั้นก็เลือก jar file เสร็จแล้วก็ใส่ชื่อไฟล์ลงไป และเลือก option ให้เรียบร้อย(อย่าลืมเลือกให้ include source นะ)

 


 

 

สำคัญ: lab ส่วนใหญ่จะต้องมี source code หรือ text file เพราะฉะนั้นควรจะทำการสร้างไฟล์เหล่านี้ไว้ที่ตัว project เลย แล้วเวลาสร้าง jar ไฟล ์นั้นในกลุ่มช่องตรงกลางก็ให้ติ๊กที่ช่อง Export java source files and resources (หมายถึง source code) เสมอ

(สรุปคือ ให้ติ๊ก  2 ช่องคือ Export generated class files and resources และ Export java source files and resources)

แบบนี้แล้วใน jar file ก็จะมี class ไฟล์ ต่างๆ ที่เราสร้างขึ้นเอง แล้วก็ source code ครบถ้วน

สำคัญ: ก่อนที่จะส่ง jar file ก็ลองใช้ winzip extract ออกมาดูซักหน่อยก็แล้วกันนะจะได้แน่ใจว่าส่งไฟล์ไปครบถ้วนหรือเปล่า และถ้าใครอยากจะใช้วิธีการ copy ไฟล์ที่ต้องการมาไว้ใน project ใหม่ แล้วใช้ project นั้นสร้าง jar ก็ทำได้เหมือนกันนะ"
 

5. ภาคผนวก ก่อนเริ่ม part 2

tips & tricks
1. คุณเคยมีปัญหารึเปล่าครับ เกี่ยวกับการที่ไม่รู้ว่าขณะนี้ cursor ของคุณกำลังอยู่ที่ row ไหน column เท่าไหร่ ถ้าคุณกำลังเผชิญปัญหานี้ เราสามารถแก้ให้คุณได้ เพียงแค่คุณ เหลือบตามองลงไปด้านล่าง ของ Eclipse จะเห็นตัวเลขสองตัวกั้นด้วย colon แสดง row และ column ของคุณอยู่ แต่อย่าเพิ่งครับ ยัง ยังไม่หมดเพียงเท่านี้ ถ้าคุณอยากจะรู้ว่าข้อความที่คุณเห็นอยู่บนหน้าจอนั้นอยู่ที่บรรทัดที่เท่าไหร่ ลองทำตามที่เราแนะนำสิครับ
1.1 ไปที่ menu Window เลือก Preferences
1.2 ที่ Java-> Editor ติ๊กที่ช่อง show line numbers
เพียงเท่านี้ทุกครั้งที่ คุณเปิด Java Editor ก็จะมีเลขบรรทัดกำกับอยู่ด้านหน้า แล้วคุณจะต้องพูดว่า โอ้! มันช่างยอดเยี่ยมจริงๆ


2. กรณีที่หาคู่ของ วงเล็บ หรือ ปีกกาไม่เจอ ให้ขยับ cursor ไปด้านหลังของวงเล็บหรือปีกกาอันใดอันหนึ่งแล้วคู่ของมันจะปรากฏกรอบสี่เหลี่ยมขึ้นมาล้อมรอบทันที

3. กรณีที่มีไฟล์ภาษา Java ที่เขียนมาอย่างไร้ซึ่งรูปแบบจนดูไม่รู้เรื่อง ให้ลองเปิด menu source แล้ว เลือก Format(hot key Ctrl+Shift+F) source ของคุณจะถูกจัดรูปแบบอย่างสวยงาม

4. ถ้ากำลังจะต้องพิมพ์ชื่อ class หรือ variable ยาวๆ ที่คุณนึกไม่ออกหรือขี้เกียจพิมพ์ ขณะเริ่มพิมพ์อักษรไปบางตัวให้กด Ctrl+Space แล้วจะปรากฎตัวเลือกออกมาให้คุณเลือกใช้ได้

5. ที่ menu Window เลือก Show View แล้วจะมี view สำหรับดู project หลายๆ แบบ แสดงออกมา แบบที่ขอแนะนำเบื้องต้นมีสองแบบ
5.1 package explorer จะแสดงให้เห็นเฉพาะส่วนที่มั่นใจว่าเกี่ยวข้องกับการเขียนโปรแกรมใน project เท่านั้น
5.2 navigator จะแสดงทุกอย่างใน directory ของ project(เหมือนดูจาก windows explorer)

6. ถ้าต้องการเปลี่ยนพวกชื่อตัวแปร ชื่อไฟล์ และอะไรก็ตามที่เกี่ยวกับชื่อให้ ใช้วิธี refactor จะดีกว่า search แล้ว replace

7. กรณีที่พยายาม run files แล้วปรากฏว่า ไฟล์ที่ run กลับ กลายเป็นไฟล์อื่น ให้ทำการเปลี่ยน focus ไปที่ file ที่ต้องการจะ run แล้วลอง run ใหม่อีกที

8. เวลาที่ลบ project จะมีให้เลือกว่า จะลบ content รึเปล่า(ลบ content ก็คือลบไฟล์ใน directory ของ project จริงๆ ถ้าไม่เช่นนั้น แล้วจะเป็นเพียงการทำให้มองไม่เห็น project นั้นเท่านั้น)

9. ถ้าเปิด class ไฟล์ ออกมาโดยไม่มี source มันก็จะขึ้นมาบอกว่าไม่มี source ของไฟล์ แล้วบอกได้แค่ว่ามี method และ ตัวแปรบางตัวแต่ class ไฟล์ ก็ยังใช้งานได้ตามปกตินะ เช่น ถ้ามี main class ก็ลองสั่งให้ run ได้

 

คำถามยอดฮิต
Q: How will midterm and final be like?
A: Lab.

Q: Should I withdraw?
A: Do the labs and homework yourself so that you don't have to ask this question.

Q: I am good in this subject and my friends ask me to help them cheat in exam. What should I do?
A: Don't help them. If they cause too many problems then tell the teachers.

Q: I want to complain about the labs. They are too hard. Can you make them a little easier?
A: Don't worry about that. It is equally hard to everyone. And about the grade, the teachers will decide on the standard when compared among the students. Just do your best.

Q: I don't like this teaching assistant. Can you do anything about him?
A: Pretend to like all of them. But if you notice that one is really unfair with only you or show some kind of sign that he is a pervert then talk to the teachers(however, try to be positive on him).(I can't suggest anything if you don't like the teachers.)

Q: Please have some mercy. I can't do this lab.
A: We are usually very kind when we mark the labs. It's just that we won't tell you. But don't cheat or copy since it will also cause us to show our mercy in the other way.

Q: The other subjects also cause me a lot of time by their homework and quiz. Can you reduce the homework to lessen my load?
A: That is your fate as a sophomore. Get passed it and you will become a junior. It's the destiny you chose.

Q: Are communications allowed in the lab?
A: We are fine with talking as long as you don't disturb the others. Using internet for entertainment is also fine but you should finish the lab and (hopefully) homework first. We graciously allowed using such a program as MSN messenger but you shouldn't send any files concerning the lab with them to be polite.


Q: Why are there so many mistakes in your English grammar?
A: This subject is not FE. So this question will be of no concern.

Advice
1. มาให้ตรงเวลาเพราะ lab จะมีแนวว่าโหดขึ้นเรื่อยๆ จนอาจจะมีคนน้ำตาร่วง(อย่าเพิ่งคิดว่าอะไรๆ จะง่ายเหมือนใน computer programming)
2. สองหัวดีกว่าเดียว และสามหัวก็คงดีกว่าสองหัว สรุปก็คือช่วยกันคิดก็คงจะดี แต่ทำได้เองจะดีกว่ามาก เพราะฉะนั้นพยายามยืนหยัดด้วยลำแข้งของตัวเองนะ
3. ถ้ามีข้อสงสัย ถาม TA หรืออาจารย์ ไม่ต้องเกรงใจให้มากนัก เพราะถ้าไม่มีใครถามเลยพวกเราจะรู้สึกเบื่อมาก
4. เวลาเขียนโปรแกรมภาษา Java 'help สำคัญยิ่งชีพ' ถ้าไม่มี help file ในเครื่องก็เปิดดูได้จาก java.sun.com

Part 2: ทบทวนและเกริ่นนำเนื้อหาเรื่องคลาสทั้งหมด

(ไม่ต้องส่ง แต่ขอให้เอาไปทำเล่นที่บ้านทุกคน สนุกมากๆ)

 

จุดมุ่งหมายของ part 2 นี้คือ

  • ให้นิสิตทบทวนการเขียนโปรแกรม

  • ทบทวนการใช้อาร์เรย์

  • ทบทวนการเขียนและเรียกใช้เมธอด

  • ให้ไปทบทวนว่า class รับอะไรจาก superclass ได้บ้าง (แล็บหน้าเราจะมาดูเรื่องนี้กันโดยเฉพาะ เพื่อความเข้าใจที่แน่นอน)

  • ให้ไปอ่านว่า Interface คืออะไร ใช้อย่างไรได้บ้าง (เราจะมีแล็บอื่นที่เน้น Interface โดยเฉพาะ แต่ว่าอยากให้ไปอ่านก่อน)

  • แล็บนี้ไม่ต้องส่ง แต่ขอให้เก็บแล็บนี้ไว้ ถ้าเรายังไม่เข้าใจเรื่องคลาส เราจะเข้าใจมากขึ้นในระหว่างเรียน แล้วขอให้เอา CodeRally มาดูอีกเรื่อยๆ เราก็จะเขียน CodeRally ได้เข้าใจมากขึ้น และเขียนได้ดีขึ้น

  • ให้นิสิตคนที่เป็นแล้ว สอนเพื่อนด้วย

 

CodeRally [from http://www.alphaworks.ibm.com/tech/coderally]

หรือโหลดไฟล์จาก ลิ้งค์นี้   unzip jar  ทั้งหมดไปไว้ในplugins folder ของ eclipse

CodeRally คือการเขียนโปรแกรมบังคับรถแข่ง แข่งกัน นิสิตจะต้องเขียนคลาสและเมธอดของจาวา เพื่อทำ AI ของรถ พอเราเขียน AI เสร็จก็เอาไปทดลองในสนามแข่ง แข่งกับเครื่องหรือเพื่อนๆ

รถของเรา (คลาสจะเรียกว่า Rally car) สามารถรับรู้ตำแหน่งของสิ่งต่างๆในสนามแข่งได้ รวมถึงสามารถรับรู้สภาพของรถคันอื่นได้ด้วย รถนั้นชนกันได้ แล้วยังโยนยางสำรอง (เก็บได้ในฉาก) เพื่อทำให้รถคันอื่นเสียได้ด้วย นอกจากนี้ยังเปลี่ยนเป็นรถตำรวจ (เข้า protected mode) ซึ่งเป็นอมตะชั่วคราวได้อีกด้วย

ในการแข่งนั้น หนึ่งแมทช์จะมีรถแข่งได้หกคัน ซึ่งแต่ละคันจะสุ่มโผล่และสุ่มหันหน้าที่ตำแหน่งต่างๆกันไป แต่ละคันจะมีน้ำมันและยางสำรองเท่ากัน การขับเคลื่อนต้องเสียน้ำมัน ในสนามแข่งจะมีที่เติมน้ำมันอยู่ ถ้าเอารถไปจอดทับได้ก็จะได้เติมน้ำมัน นอกจากนี้ยังมีที่เก็บยางอีกด้วย ถ้าน้ำมันหมดรถจะเคลื่อนไปไหนไม่ได้

ในการคิดคะแนน วิธีคิดของคนที่ทำ CodeRally เป็นดังนี้

  • ขว้างยางถูกรถอีกคัน

  • วิ่งผ่านธง (check point)

  • น้ำมันที่เหลือในตอนแข่งจบ (การแข่งใช้เวลาประมาณสองนาที)

ซึ่งรถที่ได้คะแนนมากที่สุดจะถือว่าชนะ

เอาล่ะ มาเริ่มเล่นกันดีกว่า

1. ไปที่ File > New > Project

2. เลือก Other > Game Project คลิ้กที่ Next ตามรูป Figure 1.

Figure 1 Create new Game Project

3. เลือกให้เกมเป็น CodeRally ใส่ ID นิสิตลงตรง project name จากนั้นคลิ้ก Finish ตามรูป Figure 2.

Figure 2 New Game Project name

4. โครงสร้างโปรเจ็คจะเป็นดัง Figure 3.

Figure 3 Your game project

5. เลือก RallyCar.java ไฟล์นี้จะเป็นไฟล์ที่เราต้องแก้ไฟล์เดียวเท่านั้น ในเมธอด getColor() ให้เปลี่ยนสีจาก CAR_BLUE เป็นสีใดก็ได้ที่นิยามไว้ใน Car.java (อันนี้ทำเพื่อให้เราได้ใส่สีที่ชอบเฉยๆ ไม่มีอะไรพิเศษ)

6. ลองรันดูเลย วิธีการคือ เลือก games.xml จากนั้นใส่ชื่อและสถาบัน แล้วคลิ้ก Add My Team จากนั้นก็เลือกผู้เล่นที่บังคับด้วยคอมอื่นๆ แล้ว Add ไปด้วย พอเสร็จแล้วให้รันด้วยการคลิ้ก Run ดัง Figure 4.

Figure 4 Setup your car to the race

7. สภาพการแข่งจะเป็นดังรูป Figure 5

8. ถ้าจะเอาไฟล์เอกสารของเมธอดต่างๆ และคลาสต่างๆ,

8.1. คลิ้กชื่อโปรเจ็คแล้วเลือกเมนู File > Export

8.2. เลือก Java > Javadoc

8.3. คลิ้ก Next แล้วก็ Finish. (อาจต้องมีการหา javadoc.exe ให้เจอ ซึ่งปกติจะอยู่ในโฟลเดอร์ของ jdk)

9. เท่านี้ก็จะได้โฟลเดอร์ doc ออกมา ซึ่งเราจะดูคำอธิบายของทุกคลาสได้ (คำอธิบายเมธอดและคลาส เราจะเรียกว่า javadoc)

10. สิ่งที่เราต้องเขียนก็คือ เมธอด move() ใน RallyCar.java

ต่อไปนี้เป็นคำแนะนำนะ

Coding Your Car – Overview

RallyCar.java นั้นมีโครงอยู่แล้ว เราสามารถเติมตัวแปรและเมธอดเพิ่มเติมในคลาสนี้ได้ตามใจ สร้างคลาสอื่นก็ยังได้

พอต้องการจะทดสอบ อย่าลืมเซฟซะก่อน แล้วเลือก games.xml แล้วรัน

คลาส Car.java เป็นซุปเปอร์คลาสของ RallyCar จะมีเมธอดหลายๆอย่างที่ RallyCar รับสืบทอดไป จงใช้เมธอดเหล่านี้ให้เป็นประโยชน์

ห้ามแก้คลาส Car จริงๆแล้ว เวลารัน CodeRally รันคนละ Car กับที่เรามี ที่เราได้มาเป็นแค่ตัวโครงเฉยๆ

นอกจากนี้ยังมี อินเตอร์เฟสอีกสามอัน (โปรดไปอ่านเรื่อง Interface และ abstract class เพื่อความเข้าใจตรงนี้ จะช่วยได้มาก)

IObject.java

เป็นอินเตอร์เฟสของทุกออบเจ็กต์ในสนามแข่ง ทุกออบเจ็กต์จะ implement อินเตอร์เฟสนี้ (ไปอ่านว่า การ implement คืออะไร) อินเตอร์เฟสนี้นิยามเมธอด

getX() และ getY() ซึ่งรีเทิร์นตำแหน่งของออบเจ็กต์ในสนามแข่ง ซึ่งเลขของ x กับ y นั้นไม่มีค่าลบ และเป็นไทป์ double

ISpareTire.java

อินเตอร์เฟสนี้ extend มาจาก IObject ซึ่งอินเตอร์เฟสนี้นิยามยางสำรองที่อยู่ในสนามแข่ง ยางทุกเส้นจะ implement อินเตอร์เฟสนี้ อินเตอร์เฟสนี้มีเมธอด getHeading() และ getSpeed() ดังนั้นเราสามารถรู้ข้อมูลของยางระหว่างที่ถูกขว้างไปได้

ICar.java

อินเตอร์เฟสนี้ extend มาจาก IObject ซึ่งอินเตอร์เฟสนี้นิยามรถที่อยู่ในสนามแข่ง นิยามเมธอดที่รถสามารถเรียกใช้ได้ (ทั้งเรียกของตัวมันเอง และเรียกของรถคันอื่น)  เมธอดเหล่านี้ได้ถูกอธิบายไว้ข้างล่างและใน JavaDocs

The CodeRally Track Simulation

Identification

มีโครงเมธอดใน RallyCar เพื่อไว้สำหรับให้รถเราดูต่างจากคันอื่น เมธอดนี้ก็คือ getColor() ซึ่งต้องรีเทิร์น byte constant ที่เลือกมาจากสีรถที่นิยามไว้ในคลาส Car เราใช้เมธอดนี้ในการให้สีรถของเรา  ค่า default ของ getColor() นั้นคือ CAR_BLUE

เมธอดนี้ ต้องไม่ทำอะไรนอกจากรีเทิร์นค่าคงที่

Initialization

ในตอนที่รถเราถูกวางในสนามแข่ง ตัวซิมูเลเตอร์จะเรียกเมธอด initialize() ของรถเรา ดังนั้นให้เราใส่โค้ดสำหรับการเซ็ตค่าเริ่มต้นต่างๆของรถเราได้ที่เมธอดนี้ เราสามารถเรียกใช้เมธอดอะไรก็ได้ แต่ว่า ซิมูเลเตอร์จะรัน initialize() เป็นเวลาหนึ่งวินาทีเท่านั้น ดังนั้นถ้ารันเมธอด initialize() ไม่เสร็จ รถของเราอาจจะเข้ามาในสนามในสภาพที่ค่าต่างๆเละได้

Moving Your Car

หลังจากซิมูเลเตอร์เรียกใช้ initialize() เสร็จไปแล้ว มันจะเรียกเมธอด move() ของรถแต่ละคันเรียงลำดับกันไป ซึ่งการเรียกนี้เกิดทุก clock tick เราสามารถเรียกเมธอดต่างๆเพื่อดูสภาพรถ เปลี่ยนตัวแปร ดูสถานะรถคันอื่น หาตำแหน่งของต่างๆในสนามแข่ง (เช่นหาปั๊มน้ำมัน) และ โยนยางสำรองออกไป

move() นั้นมีพารามิเตอร์สี่ตัว ซึ่งเป็นการบอกค่าต่างๆจาก cycle การทำงานรอบที่แล้ว ซึ่งพารามิเตอร์เหล่านี้บอกถึง:

  • การใช้เวลาของเมธอด move() (หน่วยเป็น milliseconds) ในรอบการทำงานที่แล้ว

  • รอบที่แล้วชนขอบสนามหรือเปล่า

  • รอบที่แล้ว เราชนกับรถคันอื่นหรือเปล่า

  • รอบที่แล้ว เราโดนยางขว้างโดนหรือเปล่า  

  • พารามิเตอร์ตัวแรกเป็น int ส่วนตัวที่สองเป็น boolean ตัวที่สามและสี่นั้นเป็น ICar (หรือเป็น null ถ้าไม่ได้ชนหรือโดนปา) พารามิเตอร์ตัวแรกจะใช้บอกได้ว่า โค้ดเรายาวเกินไป นานเกินไปหรือไม่ เพราะ ซิมูเลเตอร์ก็มีเวลาให้ move() จำกัดเหมือนกัน

    CodeRally Track Details

    สนามแข่งนั้นเป็นสองมิติ แกน x ยาว 1010 หน่วย ส่วนแกน y ยาว 580 หน่วย จุด (0,0) อยู่ซ้ายบนของจอ สนามมีผนังล้อมรอบ ซึ่งรถออกนอกผนังนี้ไม่ได้ ไม่มีผนังอยู่ข้างในสนามแต่อย่างใด รถสามารถเคลื่อนที่ไปไหนก็ได้ในสนาม ยกเว้นแต่ว่าชน หรือ ติดรถคันอื่น ออบเจ็กต์เคลื่อนที่ในทิศทางที่เรียกว่า headings ซึ่งวัดเป็นจำนวนเต็ม หน่วยเป็นองศา (0 องศา หมายถึง ตรงขึ้นข้างบน) องศานั้นมีค่าตั้งแต่ 0 ถึง 359  ค่าขององศาเพิ่มตามเข็มนาฬิกา

    Figure 5 Simulated track world

    ในโลกของเกมนั้นมีสิ่งต่างๆดังต่อไปนี้:

    มีนาฬิกา ticking clock ซึ่งค่าของมันอ่านได้ด้วย getClockTicks()

    ในตอนเริ่มแข่งแต่ละนัด รถแต่ละคันจะมีน้ำมัน 100 หน่วยและยางเอาไว้ขว้าง 3 เส้น

    เมื่อเราเซ็ตพวงมาลัยและคันเร่ง รถจะเคลื่อนตามนั้นจนกว่าจะมีคำสั่งใหม่ (แม้ว่าจะเกิดการชนก็ตาม จะพยายามเคลื่อนที่ตามคำสั่งเดิมอยู่ดี นอกจากเราเขียนแก้)

    พวงมาลัยและคันเร่งเปลี่ยนค่าได้ทันที แต่ว่าความเร็วและทิศทางจะไม่เปลี่ยนในทันทีเพราะรถนั้นมีความเฉื่อย

    ค่าคันเร่งน้อยสุด (MIN_THROTTLE) คือ -50 และค่าคันเร่งมากสุด(MAX_THROTTLE) คือ 100 อัตราการเปลี่ยนความเร็ว(นับจากสภาพรถหยุด) คือ 8 หน่วยต่อ tick (ยกเว้นกรณีที่เกิดการชนกัน)

    ค่าหักพวงมาลัยน้อยที่สุด (MAX_STEER_LEFT) คือ -10 และค่าหักพวงมาลัยมากสุด (MAX_STEER_RIGHT) คือ 10 อัตราการเปลี่ยนทิศนั้นขึ้นกับความเร็วของรถ เราสามารถหาอัตรานี้ได้โดยใช้ getChangeInHeading()

    ตำแหน่งของรถ บนสนามแข่งนั้น เป็นจุด รถมีความยาว 60 หน่วย และกว้าง 40 หน่วย โดยตำแหน่งคือจุดกลางรถนั้นเอง

    เราถือว่า ยางที่ขว้างออกไป ชนรถ เมื่อตำแหน่งของมันอยู่ใกล้จุดกลางรถ 40 หน่วย หรือน้อยกว่า

    ยางที่ขว้างนั้น มีความเร็วคงที่ เท่ากับ 12 หน่วย/tick เมื่อชนกับรถหรือผนังแล้ว ยางจะหายไป

    จุดเช็คพอยต์ ที่เติมน้ำมัน และที่เติมยาง ไม่มีผลต่อยางที่ขว้างออกมา ยางที่ขว้างออกมาจะไม่มีวันชนกัน

    รถมีน้ำมันได้มากที่สุด 100 หน่วย

    รถมียางไว้ขว้างได้มากสุด 5 เส้น

    เมื่อตำแหน่งรถอยู่ใกล้ที่เติมน้ำมันเป็นระยะ 25 หน่วยหรือใกล้กว่า น้ำมันจะเพิ่มด้วยอัตรา 1 หน่วยต่อ clock tick จนเต็มถัง (ถ้ารถออกจากระยะไปแล้ว น้ำมันก็ไม่เพิ่ม) ในสนามแข่งจะมีที่เติมน้ำมันอยู่สามที่ ตำแหน่งจะเป็นการสุ่ม

    เมื่อรถอยู่ใกล้ที่เติมยางเป็นระยะ  25 หน่วยหรือใกล้กว่า (และรถมียางสำหรับขว้างน้อยกว่า 5 เส้น) รถจะเก็บยางด้วยอัตรา 1 เส้นต่อ 5 clock ticks ในสนามแข่งจะมีที่เติมยางอยู่ 3 ที่ ตำแหน่งของที่เติมยางจะเป็นการสุ่ม

    รถสามารถป้องกันตัวเองได้ด้วยการเข้า "protect mode" แปลงเป็นรถตำรวจ ซึ่งรถที่เข้าโหมดนี้นั้น จะกินน้ำมันสองเท่าของทั่วไป โหมดนี้นั้นจะคงอยู่ 50 clock tick

    ถ้ารถเราชนกับรถอีกคัน โมเม้นตั้มจะถ่ายถึงกัน รถที่ชนจะเสียน้ำมัน 10 หน่วย (ยกเว้นถ้ารถนั้นอยู่ใน protect mode)

    ถ้าเรายิงยางชนคันอื่น เราจะได้ 10 คะแนน ส่วนรถที่โดนยางจะน้ำมันลด 10 หน่วย เมธอด move() จะไม่ถูกเรียกไป 10 clock tick และรถจะถูกแรงยางพาให้เคลื่อนไปนิดหน่อย เราจะไม่ได้คะแนนถ้ารถที่โดนเราขว้างอยู่ใน protect mode รถที่อยู่ใน protect mode ก็จะไม่เป็นไร ไม่โดนแรงยางด้วย

    เมื่อขว้างยางไปแล้ว รถเราจะไม่สามารถโยนยางได้อีก 25 clock tick

    move() หนึ่งนั้น จำกัดเวลาได้แค่ 500 มิลลิวินาที ถ้าในช่วงเวลานี้ยังทำ move() ไม่เสร็จ เมธอด move() จะไม่ถูกเรียกอีกต่อไปในการแข่งนั้น รถคันนั้นจะคงค่าต่างๆที่ตั้งไว้ล่าสุด  

    สำหรับจุดเช็คพอยต์นั้น รถเราจะได้ 2 คะแนนถ้าผ่านในระยะ 25 หน่วยจากเช็คพอยต์นั้น และถ้าเราไปยังเช็คพอยต์ต่อไป (ที่เลขต่อกัน) รถเราจะได้ 6 คะแนน ถ้ารถเราผ่านเช็คพอยต์เดิมสองที จะไม่ได้คะแนน

    ตารางคะแนนเป็นดังนี้ คะแนนในการแข่งนั้นคิดจากคะแนนรวม

    Action

    Points Earned

    ผ่านเช็คพอยต์

    2

    ผ่านเช็คพอยต์เรียงลำดับเบอร์

    6

    ยิงยางโดนรถคันอื่น

    10

    สำหรับทุกๆ 10 หน่วยของน้ำมันที่เหลือ หลังจากแข่งเสร็จแล้ว

    1

     

    General Information, Caveats, Constraints, and Restrictions

    Car ไม่สามารถมี constructor ได้

    Car ห้ามใช้ static initialization block ในการ initialize

    โค้ดทั้งหมดต้องอยู่ในคลาส RallyCar

    Car ห้ามสร้าง thread เอง ห้ามปริ๊น ห้ามสร้างไฟล์ ห้ามทำ system function

    Car ใช้ System.out.println() เพื่อพิมพ์ลง Eclipse console ได้ แต่ว่าเวลาที่ใช้ก็นับเป็นส่วนหนึ่งของเวลา move() ด้วย อย่าลืมว่าฟังก์ชั่นพวกนี้ใช้เวลานาน

    ห้ามสร้างโค้ดที่จะทำลายระบบการแข่ง

     

    Example RallyCar Code

    ข้างล่างเป็นตัวอย่างโค้ดของ move() เป็นโค้ดจากหลายๆส่วนนะ ไม่ใช่ move() อันเดียว โปรดสังเกตว่าโค้ดเหล่านี้เป็นตัวอย่างเท่านั้น เราสามารถเขียนโค้ดให้ดีกว่านี้อีกมากมายนัก

    /**

    * Go toward the first spare tire depot.

    */

    public void move(int lastMoveTime, boolean hitWall,

         ICar collidedWithCar, ICar hitBySpareTire) {

         // pick a spare tire depot

         IObject st = getSpareTireDepot()[0];

         // go toward the checkpoint

         int h = getHeadingTo(st);

         if (getHeading() > h)

              setSteeringSetting(MAX_STEER_LEFT);

         else

              setSteeringSetting(MAX_STEER_RIGHT);

         setThrottle(MAX_THROTTLE);

    }

    /**

    * Put the car in reverse for a few moves if you collide with another car.

    */

    protected int wait;

    public void move(int lastMoveTime, boolean hitWall,

         ICar collidedWithCar, ICar hitBySpareTire) {

         if (collidedWithCar != null)

              wait = 10;

         if (wait > 0)

              setThrottle(MIN_THROTTLE);

         else

              setThrottle(MAX_THROTTLE);

         if (wait > 0)

              wait--;

    }

    CodeRally This Week (ลองทำให้ได้ตามนี้ดูสำหรับสัปดาห์แรกนี้)

    1. ให้รถวิ่งตามเช็คพอยต์

    2. ให้หยุดเติมน้ำมันได้

     

    To download goto http://www.alphaworks.ibm.com/tech/coderally