Lab04: Game of Life
เราต้องการทำโปรแกรมจำลองสภาวะการแพร่กระจายของแบคทีเรียเซลเดียว
ดังนี้ เริ่มต้น โปรแกรมจะทำงานโดย
ให้เราใส่จำนวนช่องของพื้นที่ที่จะสำรวจก่อน
เซลของแบคทีเรียหนึ่งเซลจะอยู่ในช่องได้ หนึ่งช่อง โดย ช่องที่มีสีดำ
หมายถึง เซลนั้นมีชีวิต คือมีเซลของแบคทีเรียอยู่
ส่วนช่องที่มีสีขาวหมายถึงไม่มีเซลแบคทีเรียอยู่ โดยจะใช้ฟอร์มดังนี
- (อย่าลืม pop up message ถ้าผู้ใช้ไม่ได้ใส่ตัวเลขที่ถูกต้องด้วยนะ)
้
เมื่อเราเลือกว่าจะใช้พื้นที่ขนาดใดแล้ว
(ใส่ตัวเลข แผนที่จะถูกสร้างขึ้นมาให้มีจำนวนแถวและจำนวนหลักของช่อง
เท่ากัน เป็นจัตุรัส) จะมีวินโดว์ปรากฎดังรูปด้านล่าง ทั้งนี้
ทุกช่องในตอนแรกจะไม่มีแบคทีเรียอยู่เลย
(รูปนี้แสดง สภาพจำนวนช่องที่ต่างกันไปตาม ตัวเลขที่ผู้ใช้ให้กับโปรแกรม วินโดว์มีขนาด 500*500 เบี้ยวๆหน่อยก็ช่างมัน)
- ช่องแต่ละช่อง เราสามารถกดได้ ถ้ากดก็จะเปลี่ยนจากขาวเป็นดำ ดำเป็นขาว
- ถ้ากดปุ่ม Random ทุกช่องจะถูกสุ่มสีดำหรือขาวขึ้นมา ใช้่เพื่อจำลองสภาพเริ่มต้นของกลุ่มแบคทีเรีย ผลที่ได้จากการกด Random จะเป็นได้ดังรูป
- ถ้ากด Step จะเป็นการดูสถานะถัดไปของกลุ่มแบคทีเรียนี้ ณ เวลา หนึ่งชั่วโมงผ่านไป ซึ่งกฏการอยู่และตายของแบคทีเรียมีดังนี้
- สำหรับช่องที่มีแบคทีเรีย
- ถ้ามีช่องข้างเคียงที่มีแบคทีเรียอยู่ 2 ถึง 3 ช่อง จะมีชีวิตรอดต่อไป
- แต่ถ้ามีช่องข้างเคียงที่มีแบคทีเรียอยู่น้อยกว่า
2 หรือมากกว่า 3 ช่อง แบคทีเรียในช่องนั้นจะตาย (เป็นการจำลองการขาดอาหาร และการแย่งอาหารของแบคทีเรีย)
- ส่วนช่องที่ไม่มีแบคทีเรีย
- ถ้ามีช่องข้างเคียงที่มีชีวิต
3 ช่องพอดี ก็จะกลายเป็นช่องที่มีแบคทีเรีย (จำลองการแพร่พันธุ์)
- ระวังตรงขอบนะ นอกขอบ ถือว่า ไม่มีอะไรอยู่
ตัวอย่างการกด สามตัวอย่าง โดย ย่อวินโดว์ให้ดูง่ายๆ สำหรับแผนที่ที่มีแค่สามช่อง เป็นดังนี้










- ถ้ากด Clear จะเป็นการทำให้ทุกช่องเป็นสีขาว เป็นการรีเซ็ตนั่นเอง
จงเขียนโปรแกรมนี้ จากเริ่มต้นโดยไม่มีอะไรเลย
พอทำเสร็จแล้ว ทำเป็น executable jar ไว้ (เอา source ใส่ด้วย อย่าลืม) ส่งมาที่ progmethcp@gmail.com ภายในเที่ยงคืนวันอาทิตย์ (ใช่แล้ว คราวนี้แล็บถือเป็นการบ้านในตัว เพื่อให้ได้ทบทวนหลายๆเรื่องที่เรียนมา) โดยในเมล์ subject ต้องเขียนเป็น studentId_lab04_secNumber และชื่อไฟล์จะต้องเป็น studentId_lab04_secNumber.jar ตัวอย่างเช่น 5032117621_lab04_1.zip
studentID คือเลขประจำตัวนิสิต
secNumber คือเบอร์ตอนเรียน
ไกด์
- ถ้าไม่แน่ใจว่า
คำสั่งของต่างๆของเรา (เช่น getbackGround()) ที่ใช้ใน actionPerformed
นั้น ทำคำสั่งบน ปุ่มที่เรา addListener มันจริงหรือเปล่า
ให้ใช้ event.getSource() เพื่อให้ได้ตัวปุ่มที่สร้าง
event มาจริงๆ แล้วจึงสั่งคำสั่งจากตัวปุ่มที่ได้ ตัวอย่างเช่น
JButton x =
(JButton)event.getSource();
Color currentColor = x.getBackground();
- ถ้าตัวแปรไหนของคลาส
ใช้ข้างใน actionPerformed ตามปกติไม่ได้ ขอแนะนำให้เขียน
คลาสแยกต่างหากเลย แล้วส่งตัวแปรผ่านให้คอนสตรัคเตอร์ของคลาสนั้น
เช่น
randomButton.addActionListener(new
ranDomButtonListener(cells));
แล้วมีไฟล์ของ Listener
ที่เราเขียนเองต่างหาก
public class ranDomButtonListener implements
ActionListener {
JButton[][] cells;
public
ranDomButtonListener(JButton[][] c) {
cells = c;
}
public void actionPerformed(ActionEvent e) {
// ในนี้ก็ใช้อาร์เรย์
ที่ถูกส่งเข้าคอนสตรัคเตอร์มา ได้เเล้ว
}
}
- ในการคำนวณสีที่เปลี่ยนไปนั้น
ทุกๆช่องต้องถือว่าคำนวณไปพร้อมกัน (ดูสภาพสีรอบข้าง
แล้วตัดสินใจเปลี่ยนสี พอตัดสินใจว่าแต่ละช่องจะเป็นสีอะไร
ค่อยทำการเปลี่ยนสีทุกช่องพร้อมกัน) จะเปลี่ยนทีละช่องระหว่างคำนวณไม่ได้
เพราะถ้าเปลี่ยนสีทีละช่อง
สีที่เปลี่ยนไปแล้วจะไปกระทบการทำงานของช่องอื่น
ทำให้ไม่เป็นผลลัพธ์จากการทำงานพร้อมกันที่แท้จริง