การสร้างเกม Tic-Tac-Toe ใน C ++

Kar Srang Kem Tic Tac Toe Ni C



Tic-tac-toe เป็นเกมที่น่าสนใจ เก่า และคลาสสิกที่สร้างความบันเทิงมาหลายชั่วอายุคน ในโอเอกซ์ ผู้เล่นสองคนแข่งขันกันบนตารางขนาด 9 สี่เหลี่ยมที่มีเครื่องหมายรูปแบบแฮช ผู้เล่นแต่ละคนผลัดกันวางสัญลักษณ์ (O หรือ X) ลงในช่องสี่เหลี่ยมว่างช่องใดช่องหนึ่ง ในบทความนี้ เราจะสำรวจวิธีสร้างเกมโอเอกซ์ในภาษาการเขียนโปรแกรม C++ ตัวอย่างต่อไปนี้จะแนะนำคุณตลอดการสร้างเกมโอเอกซ์ที่เรียบง่ายแต่น่าดึงดูด ครอบคลุมแนวคิดที่สำคัญ การแยกย่อยโค้ด และข้อควรพิจารณาในการสร้างประสบการณ์การเล่นเกมแบบโต้ตอบ

สร้างเกม Tic-Tac-Toe ใน C ++

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

ตัวอย่าง: Tic-Tac-Toe บนคอนโซลพื้นฐานโดยไม่ใช้อาร์เรย์ 2 มิติ

ในตัวอย่างนี้ เราจะใช้อาร์เรย์ 2 มิติ ฟังก์ชัน และเงื่อนไข if-else เพื่อสร้างเกมโอเอกซ์ในภาษา C++ ในเกมนี้ ผู้เล่นสองคนได้รับอนุญาตให้ผลัดกันป้อนการเคลื่อนไหวของตน และจะกำหนดสถานะของเกมโดยการตรวจหาผู้ชนะหรือเสมอกัน ดูรหัสที่กำหนดต่อไปนี้:







#รวม

ใช้เนมสเปซมาตรฐาน -

เป็นโมฆะ กระดานวาดภาพ - ถ่าน กระดาน - 3 - - 3 - - -

บูล isMoveValid - ถ่าน กระดาน - 3 - - 3 - - ภายใน แถว - ภายใน พ.อ - -

บูล isBoardFull - ถ่าน กระดาน - 3 - - 3 - - -

ถ่าน ตรวจสอบผู้ชนะ - ถ่าน กระดาน - 3 - - 3 - - -

ภายใน หลัก - - -

ถ่าน กระดาน - 3 - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ภายใน แถว - พ.อ -

ถ่าน ผู้เล่นปัจจุบัน - 'เอ็กซ์' -

ในขณะที่ - จริง - -

กระดานวาดภาพ - กระดาน - -

ศาล - 'ผู้เล่น' - ผู้เล่นปัจจุบัน - ตาของ ' ป้อนแถว (1-3) และคอลัมน์ (1-3): ' -

การกิน - แถว - พ.อ -

แถว -

พ.อ -

ถ้า - คือ MoveValid - กระดาน - แถว - พ.อ - - -

กระดาน - แถว - - พ.อ - - ผู้เล่นปัจจุบัน -

ถ่าน ผู้ชนะ - ตรวจสอบผู้ชนะ - กระดาน - -

ถ้า - ผู้ชนะ - - - -

กระดานวาดภาพ - กระดาน - -

ศาล - 'ผู้เล่น' - ผู้ชนะ - 'เป็นผู้ชนะ! \n - -

หยุดพัก -

-

ถ้า - isBoardFull - กระดาน - - -

กระดานวาดภาพ - กระดาน - -

ศาล - “มันเสมอกัน! \n - -

หยุดพัก -

-

ผู้เล่นปัจจุบัน - - ผู้เล่นปัจจุบัน - 'เอ็กซ์' - - 'โอ' - 'เอ็กซ์' -

- อื่น -

ศาล - 'การย้ายไม่ถูกต้อง เลือกเซลล์อื่น \n - -

- -

กลับ 0 -

-

เป็นโมฆะ กระดานวาดภาพ - ถ่าน กระดาน - 3 - - 3 - - -

ศาล - 'ข| \t 1 \t - \t 2 \t - \t 3 \t - \n - -

ศาล - - \n - -

สำหรับ - ภายใน - 0 - - 3 - - - -

ศาล - - 1 - - -

สำหรับ - ภายใน ที - 0 - ที - 3 - ที - - -

ศาล - - - กระดาน - - - ที - -

ถ้า - ที - 2 - ศาล - - \t - \t - -

-

ศาล - - \t - \n - -

ถ้า - - 2 - ศาล - - \n - -

-

ศาล - - \n - - -

บูล isMoveValid - ถ่าน กระดาน - 3 - - 3 - - ภายใน แถว - ภายใน พ.อ - -

กลับ - แถว - 0 - แถว - 3 - พ.อ - 0 - พ.อ - 3 - กระดาน - แถว - - พ.อ - - - - -

-

บูล isBoardFull - ถ่าน กระดาน - 3 - - 3 - - -

สำหรับ - ภายใน - 0 - - 3 - - - -

สำหรับ - ภายใน ที - 0 - ที - 3 - ที - - -

ถ้า - กระดาน - - - ที - - - - -

กลับ เท็จ -

- - -

กลับ จริง - -

ถ่าน ตรวจสอบผู้ชนะ - ถ่าน กระดาน - 3 - - 3 - - -

สำหรับ - ภายใน - 0 - - 3 - - - -

ถ้า - กระดาน - - - 0 - - กระดาน - - - 1 - - กระดาน - - - 1 - - กระดาน - - - 2 - - กระดาน - - - 0 - - - - -

กลับ กระดาน - - - 0 - -

-

ถ้า - กระดาน - 0 - - - - กระดาน - 1 - - - - กระดาน - 1 - - - - กระดาน - 2 - - - - กระดาน - 0 - - - - - - -

กลับ กระดาน - 0 - - - -

- -

ถ้า - กระดาน - 0 - - 0 - - กระดาน - 1 - - 1 - - กระดาน - 1 - - 1 - - กระดาน - 2 - - 2 - - กระดาน - 0 - - 0 - - - - -

กลับ กระดาน - 0 - - 0 - -

-

ถ้า - กระดาน - 0 - - 2 - - กระดาน - 1 - - 1 - - กระดาน - 1 - - 1 - - กระดาน - 2 - - 0 - - กระดาน - 0 - - 2 - - - - -

กลับ กระดาน - 0 - - 2 - -

-

กลับ - -

-

นี่คือรายละเอียดการทำงาน:



“#include ” เป็นคำสั่งตัวประมวลผลล่วงหน้าที่รวมไลบรารีสตรีม I/O สำหรับการดำเนินการอินพุต/เอาต์พุต การใช้ “namespace std” ช่วยให้สามารถใช้ฟังก์ชัน cout, cin ฯลฯ ได้โดยตรงในโปรแกรม C++ โดยไม่ต้องใช้ “std:: prefix”



โปรแกรมนี้มีต้นแบบฟังก์ชันสี่แบบ ได้แก่ DrawBoard(), isMoveValid(), isBoardFull() และ checkWinner() การประกาศฟังก์ชันเรียกว่าฟังก์ชันต้นแบบ แม้จะมาหลังฟังก์ชันหลักในโปรแกรมก็จะถูกใช้งาน ฟังก์ชั่นหลักประกอบด้วยลูปเกมและตรรกะเพื่อจัดการการเลี้ยวและการเคลื่อนไหวของผู้เล่น ภายในฟังก์ชันหลัก บอร์ดเกมจะเริ่มต้นด้วยช่องว่าง





ถ่าน กระดาน - 3 - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - -

หลังจากนี้ จะมีการกำหนดตัวแปรสองแถวและคอลัมน์เพื่อจัดเก็บข้อมูลการย้ายของผู้เล่น “ถ่าน currentPlayer = ‘X’;” กำหนดว่าผู้เล่น 'X' ไปก่อน

ตอนนี้ วงจรเกม while (จริง) เริ่มต้นขึ้น และดำเนินไปจนกว่าจะมีผู้ชนะหรือเสมอกัน ลูป 'ในขณะที่' นี้เรียกว่า 'drawBoard();' เพื่อแสดงกระดาน หลังจากแสดงบอร์ดบนคอนโซลแล้ว ผู้ใช้จะถูกขอให้เลือกเซลล์ที่จะทำเครื่องหมายในคำสั่งโค้ดต่อไปนี้:



ศาล - 'ผู้เล่น' - ผู้เล่นปัจจุบัน - ' ถึงคราว ป้อนแถวและคอลัมน์ (1-3): ' -

ผู้เล่นป้อนการเคลื่อนไหวของตนใน “cin >> row >> col;”

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

กระดาน - แถว - - พ.อ - - ผู้เล่นปัจจุบัน -

ข้อความนี้วางเครื่องหมายของผู้เล่นไว้บนกระดาน

ถ่าน ผู้ชนะ - ตรวจสอบผู้ชนะ - กระดาน - -

ถ้า - ผู้ชนะ - - - -

กระดานวาดภาพ - กระดาน - -

ศาล - 'ผู้เล่น' - ผู้ชนะ - “ชนะ! \n - -

ข้อความเหล่านี้จะตรวจสอบหาผู้ชนะทุกครั้งที่ผู้เล่นทำเครื่องหมายการเข้าร่วมบนกระดาน จะมีการประกาศชื่อผู้ชนะหากมีผู้ชนะ และโปรแกรมจะออกจากวงจรเกม

ถ้า - isBoardFull - กระดาน - - -

คำสั่งนี้จะตรวจสอบการเสมอกัน เงื่อนไขการเสมอกันจะเกิดขึ้นในกรณีที่กระดานเต็มและไม่มีผู้ชนะ ในกรณีนี้ “เสมอกัน!” ถูกพิมพ์บนหน้าจอ

ผู้เล่นปัจจุบัน - - ผู้เล่นปัจจุบัน - 'เอ็กซ์' - - 'โอ' - 'เอ็กซ์' -

คำสั่งนี้จะเปลี่ยนผู้เล่นเพื่อให้ผู้เล่นทุกคนมีโอกาสเล่นในเทิร์นของตน

ศาล - 'การย้ายไม่ถูกต้อง เลือกเซลล์อื่น \n - -

หากการย้ายไม่ถูกต้อง ผู้ใช้จะได้รับแจ้งให้ป้อนข้อมูลอีกครั้งและเลือกเซลล์อื่น

หลังจากฟังก์ชัน 'main' คำจำกัดความของฟังก์ชันสำหรับต้นแบบฟังก์ชันที่ประกาศไว้ก่อนหน้านี้จะเริ่มต้นขึ้น ฟังก์ชั่นแรกที่กำหนดไว้ที่นี่คือ DrawBoard() ซึ่งใช้ในการวาดบอร์ดโอเอกซ์ไปยังคอนโซล ฟังก์ชัน DrawBoard() จะพิมพ์สถานะปัจจุบันของบอร์ด รวมถึงเส้นตารางด้วย

ฟังก์ชันถัดไปที่กำหนดไว้ที่นี่คือ isMoveValid() ฟังก์ชันนี้ใช้เพื่อกำหนดว่าอนุญาตให้มีการเคลื่อนไหวทั้งภายในกระดานและบนเซลล์ว่างหรือไม่ ฟังก์ชัน isBoardFull() ใช้เพื่อตรวจสอบว่าบอร์ดยังเต็มหรือไม่ นี่เป็นเงื่อนไขสำหรับสถานการณ์ที่เสมอกันเมื่อไม่มีผู้ชนะ isBoardFull() ตรวจสอบว่าตำแหน่งทั้งหมดบนกระดานเต็มหรือไม่ ซึ่งบ่งชี้ว่าไม่มีผู้ชนะเสมอกัน หากมีผู้ชนะ สามารถตรวจสอบได้โดยใช้ฟังก์ชัน checkWinner() checkWinner() ตรวจสอบบรรทัดที่เป็นไปได้ทั้งหมดสำหรับเครื่องหมายของผู้เล่นคนเดียวกัน (“X” หรือ “O”) และส่งคืนเครื่องหมายของผู้เล่นที่ชนะหากพบ หรือเว้นวรรค “ “ หากยังไม่มีผู้ชนะ ต่อไปนี้เป็นผลลัพธ์ของโปรแกรม มันแสดงให้เห็นทุกตาของผู้เล่นแต่ละคน

ประการแรก กระดานมีความชัดเจน ผู้เล่น “X” จะได้รับแจ้งให้เลือกเซลล์ที่จะทำเครื่องหมาย ที่นี่ ผู้เล่น “X” เข้าสู่ 2 และ 2 เซลล์ของแถว 2 และคอลัมน์ 2 ถูกทำเครื่องหมายไว้ โปรดดูกระดานที่มีเครื่องหมายดังต่อไปนี้:

ตอนนี้ถึงตาของผู้เล่น O ผู้เล่นจะได้รับแจ้งให้เลือกเซลล์ที่จะทำเครื่องหมาย ผู้เล่น “O” เลือก 1 สำหรับแถวและ 1 สำหรับคอลัมน์ เซลล์ที่เลือกถูกทำเครื่องหมายไว้สำหรับผู้เล่น “O” ดังที่แสดงในตัวอย่างเอาต์พุตต่อไปนี้:

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

ตอนนี้ถึงคราวสำหรับผู้เล่น “O” ผู้เล่นเลือก 1 สำหรับแถวและ 3 สำหรับคอลัมน์

เทิร์นถัดไปเกิดขึ้นอีกครั้งกับผู้เล่น “X” ผู้เล่นเลือก 3 สำหรับแถวและ 1 สำหรับคอลัมน์

ผู้เล่น “O” เลือก 3 สำหรับแถวและ 2 สำหรับคอลัมน์

ผู้เล่น “X” เลือกแถวที่สองและคอลัมน์ที่สาม

ตอนนี้ผู้เล่น “O” จะเลือกแถวที่สองและคอลัมน์แรก

ผู้เล่น “X” เลือกแถวที่สามและคอลัมน์ที่สามในครั้งนี้

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

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

บทสรุป

การพัฒนาเกมโอเอกซ์โดยใช้ C++ เป็นแบบฝึกหัดเชิงปฏิบัติที่ดีเยี่ยมเพื่อเสริมทักษะการเขียนโปรแกรมของคุณ บทความนี้อธิบายวิธีสร้างโอเอกซ์ใน C++ อย่างถูกต้อง คำแนะนำทีละขั้นตอนที่ให้ไว้ในบทความนี้ประกอบด้วยอาร์เรย์ 2 มิติ ฟังก์ชัน และเงื่อนไข if-else เพื่อให้ผู้อ่านเข้าใจกลไกของเกม การโต้ตอบของผู้ใช้ และโครงสร้างโค้ดที่มีประสิทธิภาพ คำแนะนำโดยละเอียดของโค้ดและคำอธิบายฟังก์ชันที่มีความสำคัญต่อการเล่นเกมหลักช่วยให้ผู้อ่านได้รับข้อมูลเชิงลึกอันล้ำค่าทั้งเกี่ยวกับแนวทางปฏิบัติในการเขียนโปรแกรม C++ และความซับซ้อนของการพัฒนาเกมแบบง่ายๆ