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

 

พล่ามมากเปลืองที่ เริ่มเลยละกัน  พอดีไม่ได้เห็นโจทย์เต็มๆ  แต่ที่แน่ๆคืออาจารย์ให้เขียนเกม Tic Tac Toe เอาง่ายๆก็เกม ox ล่ะนะพร้อมกับเขียน AI ไว้สำหรับเล่นคนเดียวด้วย  เห็นมีคนบอกว่าให้ใช้ภาษา java อะฮ้า ภาษาถนัดกันเลยล่ะเซ่ะ  อาจารย์สอนจาวาเทพซะขนาดนั้น โฮ่ๆ  แต่ข้าพเจ้าพูดตรงๆลืมไปแทบสิ้น  ก็เลยต้องมานั่งอ่าน API กันใหม่นิดหน่อย (ถ้าเรียกชั่วโมงนึงว่าหน่อยได้อะนะ)  ระหว่างข้าพเจ้านั่งรื้อฟื้น API มาดู algorithm ของ AI ของเรากันก่อนดีกว่าเนอะ

การทำงานของ AI (บ่นนิดนึง ปุ่ม shift เป็นบ้าอะไรวะกดโคตรยาก)  หลักๆก็มีอยู่ไม่กี่ขั้น  แต่จะที่จะทำวันนี้เอามาแค่ 3 ขั้นล่ะนะ เพราะขี้เกียจทำให้มันฉลาดเกิน เดี๋ยวจะแพ้คอม กร๊ากๆ  ถ้าอาจารย์อยากได้ AI ฉลาดกว่านี้ค่อยว่ากันอีกที  อืมพล่ามมาเยอะไม่ได้ขึ้นซักที  มาดูกันเลยว่า AI ของเรามีวิธีการคิดยังไงมั่ง เรียงตามความสำคัญเลยละกัน

1. หาช่องที่เดินอีกหนึ่งตาแล้ว AI จะชนะ : แน่นอนเล่นแล้วก็ต้องชนะ ไม่งั้นจะเล่นทำแมวอะไร  ในที่นี้ AI จะหาช่องที่เดินอีกแค่หนึ่งตาแล้วจะชนะ ไม่ว่าจะแนวนอน แนวตั้ง รึแนวทแยงก็เอาซักแนว หุหุ

2. หาช่องที่ user เดินอีกหนึ่งตาแล้วจะชนะ  : โอ้ะ AI เราไม่มีทางไหนที่เดินแล้วชนะเลยแฮะ  ถ้าเราไม่ชนะก็อย่าหวังว่าใครจะชนะ (ออกแนวตัวร้ายนิดๆ -0-)  ลองหาช่องที่ user เดินตานึงแล้วจะชนะ แล้วรีบกาช่องนั้นก่อนมันซะ ฮ่าๆๆ

3. เดินมั่วไปเหอะ : ชิบป๋งละช่องที่จะชนะก็ไม่มี แถม user ก็เล่นห่วยแตกไม่มีช่องที่เกือบจะชนะเลยวุ้ย  งั้นก็เดินมั่วๆไปละกัน ซักวันมันก็ชนะเองแหละ  :P

 

ก็หมดละวิธีคิดของ AI สุดเทพของเรา (อย่ามองด้วยสายตาแบบน้าน) จริงๆก็มีขั้นที่ถ้ายังไม่มีช่องที่ชนะก็พยายามเดินในช่องที่สองตาจะชนะ อะไรแบบนั้น แต่อันนั้นมัน...ขี้เกียจอะ  ช่างมันเถอะ เอาแค่นี้ก็พอแล้ว

 

หลังจากนั่งนึกวิธีคิดของ AI สุดเทพและรื้อฟื้น API ของ java เรียบร้อยแล้ว  ก็มานั่งคิดกันต่อว่าแล้วไอที่บอกเช็คว่าจะชนะเนี่ย  มันทำยังไงล่ะ(วะ)  แถมแต่ละตาก็ต้องเช็คว่าไอที่มันเดินกันไปตะกี้มีใครชนะแล้วยังเนี่ย  แล้วยังต้องคอยทำเครื่องหมายช่องที่แต่ละคนเดิน แถมถ้าโดนกาช่องนั้นไปแล้วก็กาซ้ำไม่ได้ และอื่นๆอีกจิปาถะ (มากไปปะ ฮ่าๆ) เอาเป็นว่าค่อยๆทำไปละกัน  เริ่มกันโลด

 

ขั้นแรก : pattern ที่จะทำให้ชนะ 

     ขั้นแรกเลยเราก็ต้องรู้ก่อนว่ายังไงถึงจะเรียกว่าชนะในเกมนี้  หลังจากที่ไปเปิดใน wiki และหาข้อมูลจาก 120 website ทั่วโลก (เวอร์ไปมะ) ก็ได้รู้ว่าการจะชนะเกมนี้ได้มีอยู่ด้วยกัน 8 pettern ก็คือ แนวนอน 3 แบบ แนวตั้ง 3 แบบ และแนวทแยง 2 แบบ   ถ้าเกิดเราให้แต่ละช่องแทนด้วยตัวเลข 1-9 เราจะได้เลขชุดที่จะเอาไปแทงหวย มะช่าย!! เอาไปเป็นตัวแปรสำหรับไว้เทียบการชนะซะ ตั้งชื่อไว้ว่า winCombination ละกัน เป็นตัวแปร array สองมิติ  instance อย่างนี้

private int[][] winCombination = new int[][] { 

            {1, 2, 3}, {4, 5, 6},{7, 8, 9}, //แนวนอน        
            {1, 4, 7}, {2, 5, 8},{3, 6, 9}, //แนวตั้ง
            {1, 5, 9}, {3, 5, 7}  //แนวทแยง    

};

 

ขั้นที่ 2 : สร้างตัวเช็คและตัวเทียบ

     เมื่อรู้ pattern แล้วแน่นอนว่าเราก็ต้องมีการเช็ค pattern ว่าตอนนี้ตรงกันแล้วรึยัง  หลังจากพลิก javadoc ไปมาสองสามรอบ  ก็ตัดสินใจว่าจะใช้ Vector ในการทำงานเนื่องจาก ท่าทางจะใช้ง่ายสุด ฮ่าๆๆ  อะว่าแล้วเราก็สร้างตัวแปรกันเลย

  Vector wHorizon[] = new Vector[3];
  Vector wVertical[] = new Vector[3];
  Vector wDialognal[] = new Vector[2];
  Vector userTable = new Vector();
  Vector AITable = new Vector();

 

ขั้นที่ 3 : สร้าง Constructor และ main

     แน่นอนว่าการใช้งานคลาสส่วนใหญ่ก็ต้องมี Constructor อยู่แล้วล่ะเนอะ  ซึ่ง Constructor ของข้าพเจ้าจะมีด้วยกัน 2 method ก็คือ createVector() กับ createGUI() ชื่อก็บอกอยู่แล้วว่าแต่ละอันไว้ทำอะไรล่ะนะ 

ขั้นที่ 4 : รอให้ user เริ่มเกม

     เนื่องจาก AI ของเรานั้นเทพมาก  เราจึงต่อให้ก่อนด้วยการให้ user เริ่มเกมก่อน ครุๆ เมื่อ user หลงกลกดปุ่มปั๊มเราก็รับ event มาทำต่อใน actionPerformed() ซะเลย

ขั้นที่ 5 : วาดรูปและ disable ปุ่มที่ถูกใช้แล้ว

    ตรวจสอบว่าเป็นปุ่มไหนแล้วส่งค่าไปเก็บใน userTable แล้ววาดรูปลงไปที่ปุ่มโดยใช้ drawPic(cellPosition) และ disable ปุ่มทิ้งซะ  เดี๋ยวจะโดนกดซ้ำ

ขั้นที่ 6 : ตรวจสอบ pettern ว่าชนะแล้วยัง 

    ที่ user คลิกไปตะกี้ทำให้ชนะแล้วยังน้า  ด้วยการใช้ checkWinCondition()

ขั้นที่ 7 : checkWinCondition()

   ไหนดูเด้ะมีใครชนะแล้วยังหว่า  โดยการวนลูปเช็ค userTable และ AITable เทียบกับ Vector pattern ที่เราทำไว้  ถ้ามีอันไหนตรงก็โป๊ะเชะ ส่งค่ากลับไปว่ามีคนชนะแว้วว  ถ้าไม่เจอก็เล่นกันต่อไป

ขั้นที่ 8 : ถ้า user ชนะก็จบเกมซะ

     ถ้า checkWinCondition() return มาเป็น true ก็เรียกคำสั่ง gameOver() แล้วประกาศชื่อผู้ชนะซะ  และขึ้นกระดานใหม่ด้วย newGame()

ขั้นที่ 8 : ถ้า user เดินไปตะกี้ไม่ชนะคราวนี้ก็ถึงตา AI แล้วซินะ

     ถ้าผ่าน if(!checkWinCondition()) มาได้คราวนี้ AI สุดเทพของเราก็ได้เดินซะที  ทำตามวิธีการคิดที่บอกไว้ด้านบนเด้ะๆ เริ่มด้วยหาช่องที่จะชนะด้วย canWin() ถ้ายังชนะไม่ได้ก็หาทางบล็อคด้วย blockUser() ถ้าไม่มีที่จะทำทั้งสองอย่างก็เดินมันมั่วๆไปด้วย randomMove()

ขั้นที่ 9 : canWin() และ blockUser()

     อย่างที่บอก method นี้จะไว้เช็คว่ามีตรงไหนที่ AI เดินแล้วจะชนะได้เลยบ้าง  ซึ่ง algorithm ก็คือในการคลิกแต่ละคนจะมีค่าคลิกต่างกัน  โดย user จะมีค่า 1 ส่วน AI จะมีค่า 5 แล้วจะทำวนลูปเพื่อหาผลรวมของทุกแนวโดยใช้ winCombination ในการวนเพื่อหาผลรวม  ถ้ามีแนวไหนมีค่า 2(1+1) (ในกรณีของ user) หรือ 10 (5+5)(ในกรณีของ AI) ก็หมายความว่าแนวนั้นมีการกาอยู่แล้ว 2 ช่อง ถ้ากาอีกอันก็เป็นอันชนะ  เมื่อเจอแล้วก็ flag แนวนั้นไว้แล้วนำไปหาช่องที่ยังว่างเป็นช่องสุดท้ายด้วย chooseMove(winTiles) ซึ่งจะไปเรียก checkEmpty(tile1,tile2,tile3) แล้วจะ return ค่าของช่องที่ยังว่างไปให้ drawPic(cellPosition) เพื่อวาดเครื่องหมายพร้อมกับเก็บข้อมูลการเดินของ AI ไว้ใน AITable

Credit : Adapted algorithm from Cinjection in  Tic-Tac-Toe A.I. WalkThrough.

ขั้นที่ 10 : randomMove()

     อันนี้ไม่มีอะไรก็แรนดอมเลข 1-9 ขึ้นมาแล้วตรวจสอบว่าโดนใช้ไปแล้วยัง  ถ้าโดนใช้ไปแล้วก็แรนดอมใหม่จนกว่าจะได้  แต่ถ้าแรนดอมเกิน 50 ครั้งแล้วไม่ได้ซะทีก็จะทำการวนลูปทีละแนวเพื่อหาช่องที่เหลือแล้วเติมไปซะ ไม่งั้นแรนดอมนานเกิน user เซ็งตายซะก่อน

ขั้นที่ 11 : ตรวจสอบ pattern ว่าชนะแล้วยัง (อีกที)

    เหมือนขั้นที่ 6-7-8 เด้ะๆ

ขั้นที่ 12 : จบ turn แล้วรอให้ user เลือกช่อง

    ถ้าตรวจแล้วยังไม่ชนะก็จบ turn ตัวเองแล้วรอ user  ให้เล่นต่อแล้วก็วนต่อไปเรื่อยๆจนกว่าจะมีใครชนะ หรือเดินกันจนครบช่องแล้ว ก็ให้เสมอกันไปซะ

 

ในที่สุดก็จบแล้วเกม ox พร้อม AI สุดเทพ (ที่มีการคิดตั้ง 3 ขั้น)  ส่วนไฟล์ src ก็โหลดไปดูได้จาก  ตรงนี้   (ทำไมมันอัพขึ้น exteen ไม่ได้ฟะแง่งง)

 

Comment

Comment:

Tweet

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

#3 By เดกน้อย (124.121.168.249) on 2010-08-30 15:34

เบื่อคนเก่ง เชอะ!

#2 By PolarHoney on 2009-07-18 15:46

โห เทพว่ะ wink

#1 By KarokKung on 2009-07-16 18:58