Lab: Object-Oriented Programming Concept
สำหรับวันนี้เราจะมาเขียนโปรแกรมรันเกมไพ่อย่างง่ายๆกัน นิสิตจะได้ฝึก
- การนิยามเมธอดต่างๆในคลาส
- การใช้ตัวแปรที่เป็นคลาสหนึ่งไปเป็นสมาชิกของออบเจ็กต์อีกคลาสหนึ่ง
- การเรียกใช้เมธอดต่างๆ และการใช้ object ผ่าน main
มาเริ่มกันเลย
จงเขียนคลาส Card
ซึ่งเราจะนิยามเป็นไพ่ใบหนึ่งจากสำรับไพ่ที่นิยมใช้เล่นกันทั่วไป ซึ่งไพ่นั้นจะมีตัวแปรสองอย่างต่อไปนี้
- private rank
– 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, and A
- private suit
– spades(ª),
heart (©),
diamond (¨),
and club (§)
และต้องมีเมธอดดังต่อไปนี้
- getRank,
getSuit, setRank, setSuit โดย set ทั้งสองเมธอดนี้ต้องอนุญาตให้ค่า
rank กับ suit เป็นค่าที่ถูกต้องเท่านั้น
ถ้ามีการพยายามเซ็ตค่าประหลาดๆเข้ามา ให้ print error message
แล้วออกจากโปรแกรม
- combineRank(Card a) เป็นการรวมค่า rank เข้ากับไพ่อีกใบ โดยให้มีค่ารวมไม่เกิน 21 (เมธอดนี้รีเทิร์น int) ตัว rank ที่เป็นอักษร ถือว่ามีค่าเท่ากับสิบ ยกเว้น A ที่มีค่าเท่ากับ 11 ก็ได้ หรือ 1 ก็ได้
- (เมธอดอื่นๆที่จำเป็น สามารถเขียนเพิ่มได้ตามใจ ไม่บังคับ)
หลังจากเขียนคลาส Card เสร็จแล้ว จงเขียนคลาส Deck
ซึ่งหนึ่ง deck หรือสำรับไพ่่นั้นจะประกอบไปด้วยไพ่่ 52 ใบ (เอาจากทุก
rank และ suit
โดยต้องมีการเรียงด้วย (สำหรับแต่ละ suit ให้เลข 2 เป็นใบแรกและ A
เป็นใบสุดท้าย suit แรกคือ spades
เรียงลำดับตามที่กำหนดไว้ข้างบน) ระหว่างการเล่นไพ่
อนุญาตให้สามารถเอาไพ่ออกจาก deck ได้
(อาจต้องมีการเขียนเมธอดเพิ่มจากที่ระบุไว้)
ให้คลาส
Deck มีเมธอดต่างๆดังต่อไปนี้
- shuffle
– เป็นเมธอดที่จะกระทำการสับไพ่ เรียงลำดับไพ่ให้ไม่เหมือนเดิมโดยสุ่มเรียงเอา (ทำได้หลายแบบ ขอให้สุ่มตำแหน่งไพ่ได้ดีก็โอเค)
- pick
– รีเทิร์นไพ่ที่อยู่บนสุดของ deck แล้วเอาไพ่นั้นออกจาก deck ไป
เราจะมาจำลองเกมไพ่แบบหนึ่ง ในเมธอด main กัน โดยขั้นตอนของการเล่นเกมจะเป็นดังนี้
- สร้าง deck ขึ้นมาสองสำรับ สำรับแรกเรียกเป็น ของ player1 สำรับที่สองเป็นของ player2
- สับไพ่ทั้งสองสำรับ
- ผู้เล่นทั้งสอง ต่างฝ่ายต่างหยิบไพ่สองใบแรกมาจากสำรับของตน ใครได้ rank รวม เข้าใกล้แต่ไม่เกิน
21 มากกว่าคนนั้นจะชนะ (เกิน 21 ถือว่าแพ้ทันที) ตัว rank ที่เป็นอักษร
ถือว่ามีค่าเท่ากับสิบ ยกเว้น A ที่มีค่าเท่ากับ 11 ก็ได้ หรือ 1 ก็ได้
(ถ้า rank รวมเท่ากันจะถือว่าเสมอกัน ทำให้เกมไม่จบ
ต้องหยิบไพ่สองใบต่อไป)
- เกมจบเมื่อมีคนชนะ หรือ ดูไพ่หมดสำรับแล้วยังไม่แพ้ชนะกัน (อะไรมันจะปานนั้น)
- เมื่อเกมจบ
จะต้องมีการพิมพ์ว่าใครชนะ หรือไม่มีใครชนะ แล้วค่อยออกจากเกม
เมธอดที่สามารถนำมาใช้ได้
/**
*
Returns a random number between first and last (excluding last)
*/
public
static int random(int first, int last) {
return first + (int)(Math.random()*(last –
first))
}
/**
*
Returns a random number from 0 to N (exclusive N)
*/
public
static int random(int n) {
return random(0, n);
}
การส่ง
export
ไฟล์เป็น jar file (ต้องมีซอร์สโค้ด)
แล้วส่งมาที่ progmethcp@gmail.com ภายในวันอังคารที่ 5 กรกฎาคม ไฟล์จะต้องตั้งชื่อว่า xxxxxxxxxx_Object.jar
โดย xxxxxxxxxx นั้นเป็นเลขประจำตัวนิสิต ส่วนใน subject ของเมล์ ให้ใส่ xxxxxxxxxx_Object โดย xxxxxxxxxx นั้นเป็นเลขประจำตัวนิสิต
อย่าลืม การฝึกเท่านั้น ถึงจะทำให้โค้ดได้เก่งขึ้น ตอนนี้โจทย์ยังถือว่าง่ายอยู่ ต้องรีบทำให้เข้าใจ ทำให้ได้เร็วๆ