BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC KTKTCN KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN 1 Đề Tài Lập trình game cờ caro Python Nhóm sinh viên thực hiện : Trần Cao T , Đỗ Văn C, Phạm Thế V, Khi vọng đồ án này có thể giúp các bạn trong quá trình làm luận án hay báo cáo
BỘ CÔNG THƯƠNG TRƯỜNG ĐẠI HỌC KINH TẾ-KỸ THUẬT CÔNG NGHIỆP KHOA CÔNG NGHỆ THÔNG TIN - - ĐỒ ÁN Đề Tài : Lập trình game cờ caro Python Giảng viên hướng dẫn : Bùi Văn Tân Nhóm sinh viên thực Trần Cao Thành Đỗ Văn Chiến Phạm Thế Vinh : Lớp : DHTI14A1ND Hà Nội, ngày tháng 11 năm 2022 Mục lục Mô tả đồ án game cờ Caro .3 Yêu cầu đồ án: 1.1Game caro gì? .3 1.2Luật chơi game: 1.3 Phạm vi nghiên cứu Phân tích cách hoạt động .3 2.1 Biểu diễn bảng cờ 2.2 Vẽ bàn cờ lên hình 2.3 Cho phép người chơi chọn O X Quyết định xem người trước 3.1 Kiểm Tra xem người chơi thắng hay chưa 3.2 Kiểm tra xem ô bàn cờ hay không 3.3 Cho phép người chơi nhập bước .7 Chọn bước từ tập hợp bước 4.1 Xây dựng chiến thuật với Game AI 4.2 Tạo đoạn mã AI cho máy tính 4.3 Kiểm tra xem máy tính thắng bước hay khơng .9 4.4 Kiểm tra xem người chơi có thắng bước hay khơng 4.5 Kiểm tra xem bàn cờ đầy hay chưa 10 Vòng lặp cho trò chơi 10 Đoạn mã thực thi đầy đủ : 11 Mô tả đồ án game cờ Caro Yêu cầu đồ án: 1.1Game caro gì? Là loại game đối kháng gồm có hai người chơi hình (hoặc tờ giấy) có kẻ vng người chơi đánh ký tự O -X (tùy quy định tùng người) vào 1.2Luật chơi game: Trị chơi gồm hai người, bên đánh dấu O-X Nếu bên đạt dấu chung hàng (có thể hàng ngang, hàng dọc, hàng chéo) thắng.Lưu ý, đạt dấu hàng mà bị chặn trước đầu chưa thắng mà người chơi đạt dấu hết hàng trận đấu coi hòa 1.3 Phạm vi nghiên cứu Nghiên cứu, phân tích,tham khảo tài liệu python Phân tích cách hoạt động Về , chương trình có luồng hoạt động sau: Ngoài , để tránh việc làm với giao diện , thực nước thông qua việc bấm vào số với quy ước vị trí bàn cờ tương đương giống bàn phím gọi điện thoại máy di động Như hình đây: 2.1 Biểu diễn bảng cờ Đầu tiên, phải tìm cách biểu diễn bảng dạng liệu lưu biến Trên giấy, bảng cờ caro XO vẽ dạng cặp đường ngang cặp đường dọc Trong chương trình này, bảng cờ caro biểu diễn dạng danh sách chuỗi ký tự Mỗi chuỗi ký tự đại diện cho chín khoảng trống bàn cờ Nhớ đặt bàn cờ giống bàn phím số bàn phím Vì vậy, danh sách có 10 chuỗi ký tự lưu trữ biến có tên board, board[7] khoảng trống bên trái bàn cờ, board[8] khoảng trống bên Người chơi nhập số từ đến trị chơi biết họ muốn vào 2.2 Vẽ bàn cờ lên hình Chúng ta định nghĩa hàm drawboad() có nhiệm vụ thực vẽ bàn cờ sau: Hàm drawBoard() thực in bàn cờ biểu thị tham số board Hãy nhớ bàn cờ biểu diễn dạng danh sách bao gồm 10 chuỗi ký tự, chuỗi ký tự số dấu khoảng trống bàn cờ Chuỗi ký tự số bị bỏ qua Các hàm trò chơi hoạt động cách truyền danh sách gồm 10 chuỗi ký tự bàn cờ Ta cần đảm bảo khoảng trống chuỗi, không, bàn cờ trông bị lệch in hình 2.3 Cho phép người chơi chọn O X Hàm inputPlayerLetter() hỏi người chơi muốn X hay O Điều kiện vòng lặp while chứa dấu ngoặc đơn, có nghĩa biểu thức bên dấu ngoặc đơn đánh giá trước Nếu biến letter đặt thành 'X', biểu thức đánh sau: Nếu chữ có giá trị 'X' 'O', điều kiện vịng lặp False cho phép trình thực thi chương trình tiếp tục qua khối lệnh while Nếu điều kiện True, chương trình tiếp tục yêu cầu người chơi chọn chữ người chơi nhập X O Hàm trả danh sách có hai phần tử: Phần tử (chuỗi số 0) chữ người chơi phần tử thứ hai chữ máy tính Quyết định xem người trước Hàm whoGoesFirst() thực định xem trước hàm random.randit(0,1) Tiếp theo thực vẽ kí tự lên bàn cờ Các tham số bao gồm board, letter move Biến board danh sách bao gồm 10 chuỗi ký tự biểu thị trạng thái bảng Biến letter biến letter người chơi ('X' 'O') Biến move vị trí bàn cờ mà người chơi muốn 3.1 Kiểm Tra xem người chơi thắng hay chưa Giả sử le 'O' bo ['', 'O', 'O', 'O', '', 'X', '', 'X', '', ''] Bàn cờ trông giống sau: 3.2 Kiểm tra xem bàn cờ cịn hay khơng Cho bàn cờ caro nước có, hàm isSpaceFree() trả liệu nước thực thi hay khơng: 3.3 Cho phép người chơi nhập bước Hàm getPlayerMove() yêu cầu người chơi nhập số cho ô mà họ muốn di chuyển: Chọn bước từ tập hợp bước Tham số board danh sách chuỗi ký tự biểu diễn bàn cờ caro Tham số thứ hai, movesList, danh sách số nguyên có để chọn Ví dụ: movesList [1, 3, 7, 9], điều có nghĩa selectRandomMoveFromList() trả số nguyên góc 4.1 Xây dựng chiến thu ật v ới Game AI Thuật toán AI bao gồm bước sau: Xem liệu máy tính thực hành động để giành chiến thắng trị chơi hay khơng Nếu có thực di chuyển Nếu không, chuyển sang bước 2 Xem liệu người chơi thực hành động khiến máy tính thua hay khơng Nếu có , di chuyển đến để chặn người chơi Nếu khơng, chuyển sang bước Kiểm tra xem có khoảng trống góc (khoảng 1,3,7 9) khơng Nếu khơng có khoảng trống góc , thực chuyển sang bước 4 Kiểm tra xem khoảng trống có trống rỗng hay khơng Nếu có , di chuyển tới Nếu khơng , thực bước 5 Di chuyển khoảng trống cạnh bên (khoảng trống 2,4,6 8).Khơng cịn bước khoảng trống bên tất cịn lại q trình thực hiên đạt đến bước 4.2 Tạo đoạn mã AI cho máy tính Đối số board, đại diện cho bàn cờ Đối số thứ hai ký tự mà máy tính sử dụng, 'X' 'O' tham số computerLetter Thuật toán AI bàn cờ caro hoạt động sau: Xem liệu máy tính thực hành động để giành chiến thắng trị chơi hay khơng Nếu có, thực hành động Nếu khơng, chuyển sang bước 2 Xem liệu người chơi thực hành động làm cho máy tính thua trị chơi hay khơng Nếu có, máy tính di chuyển đến để chặn người chơi Nếu khơng, chuyển sang bước 3 Kiểm tra xem có góc số góc (ơ 1, 3, 9) thực bước hay khơng Nếu khơng có ô nào, chuyển sang bước 4 Kiểm tra xem trung tâm có cịn trống hay khơng Nếu có, thực di chuyển đến Nếu khơng, chuyển sang bước 5 Di chuyển cạnh (ơ 2, 4, 8) Khơng có thêm bước nữa, khoảng trống bên cạnh cịn lại Hàm trả giá trị số nguyên từ đến biểu diễn cho bước máy tính Ta qua cách thức thực bước bên 4.3 Kiểm tra xem máy tính có th ể th ắng m ột b ước hay khơng 4.4 Kiểm tra xem người chơi có thắng m ột bước hay khơng 4.5 Kiểm tra xem bàn cờ đầy hay chưa 10 Hàm trả True danh sách 10 chuỗi ký tự đối số board mà truyền có dấu 'X' 'O' số (ngoại trừ số bỏ qua) Vòng lặp for cho phép ta kiểm tra số từ đến danh sách board Ngay sau tìm thấy khơng gian trống bàn cờ (nghĩa isSpaceFree(board, i) trả True), hàm isBoardFull() trả False Nếu vòng lặp kết thúc, nghĩa bàn cờ khơng cịn trống nào, hàm trả giá trị True Vòng lặp cho trò chơi 11 Đoạn mã thực thi đầy đủ : import random def drawBoard(board): #Thực in bàn cờ print(board[7] + '|' + board[8] + '|' + board[9]) print('-+-+-') print(board[4] + '|' + board[5] + '|' + board[6]) print('-+-+-') print(board[1] + '|' + board[2] + '|' + board[3]) def inputPlayerLetter(): #Cho phép người chơi nhập ký tự mà họ muốn sử dụng #Trả tập hợp kiểu List với ký tự mà người chơi chọn làm phần tử letter = '' while not (letter == 'X' or letter == 'O'): print('Ban muon chon X hoac O?') letter = input().upper() if letter == 'X': return ['X', 'O'] else: 12 return ['O', 'X'] def whoGoesFirst(): #Chọn ngẫu nhiên cho phép người chơi trước hay không if random.randint(0, 1) == 0: return 'computer' else: return 'player' def makeMove(board, letter, move): board[move] = letter def isWinner(bo, le): #Trả True người chơi thắng return ((bo[7] == le and bo[8] == le and bo[9] == le) or (bo[4] == le and bo[5] == le and bo[6] == le) or (bo[1] == le and bo[2] == le and bo[3] == le) or (bo[7] == le and bo[4] == le and bo[1] == le) or (bo[8] == le and bo[5] == le and bo[2] == le) or (bo[9] == le and bo[6] == le and bo[3] == le) or (bo[7] == le and bo[5] == le and bo[3] == le) or (bo[9] == le and bo[5] == le and bo[1] == le)) def getBoardCopy(board): #Sao chép bàn cờ boardCopy = [] for i in board: boardCopy.append(i) return boardCopy def isSpaceFree(board, move): #Trả True nước chỗ trống return board[move] == ' ' def getPlayerMove(board): #Lấy nước người chơi move = ' ' while move not in '1 9'.split() or not isSpaceFree(board, int(move)): print('Buoc di tiep theo cua ban la gi ? (1-9)') move = input() return int(move) 13 def chooseRandomMoveFromList(board, movesList): #Trả nước hợp lệ #Trả None khơng cịn nước hợp lệ possibleMoves = [] for i in movesList: if isSpaceFree(board, i): possibleMoves.append(i) if len(possibleMoves) != 0: return random.choice(possibleMoves) else: return None def getComputerMove(board, computerLetter): #Xác định nước cho máy if computerLetter == 'X': playerLetter = 'O' else: playerLetter = 'X' #Giải thuật cho máy chơi #Kiểm tra xem nước có thắng hay khơng for i in range(1, 10): boardCopy = getBoardCopy(board) if isSpaceFree(boardCopy, i): makeMove(boardCopy, computerLetter, i) if isWinner(boardCopy, computerLetter): return i #Kiểm tra xem người chơi thắng nước hay không for i in range(1, 10): boardCopy = getBoardCopy(board) if isSpaceFree(boardCopy, i): makeMove(boardCopy, playerLetter, i) if isWinner(boardCopy, playerLetter): return i #Chọn nước góc bàn cờ trống move = chooseRandomMoveFromList(board, [1, 3, 7, 9]) if move != None: 14 return move #Chọn nước if isSpaceFree(board, 5): return #Chọn nước cạnh bên bàn cờ return chooseRandomMoveFromList(board, [2, 4, 6, 8]) def isBoardFull(board): #Trả True nước khơng cịn, ngược lại trả False for i in range(1, 10): if isSpaceFree(board, i): return False return True print('Chao mung den voi game co caro!') while True: #Thiết lập lại bàn cờ theBoard = [' '] * 10 playerLetter, computerLetter = inputPlayerLetter() turn = whoGoesFirst() print('The ' + turn + ' se duoc choi truoc.') gameIsPlaying = True while gameIsPlaying: if turn == 'player': drawBoard(theBoard) move = getPlayerMove(theBoard) makeMove(theBoard, playerLetter, move) if isWinner(theBoard, playerLetter): drawBoard(theBoard) print('Hooray! Ban da chien thang !') gameIsPlaying = False else: if isBoardFull(theBoard): drawBoard(theBoard) print('Tran dau da hoa!') 15 break else: turn = 'computer' else: move = getComputerMove(theBoard, computerLetter) makeMove(theBoard, computerLetter, move) if isWinner(theBoard, computerLetter): drawBoard(theBoard) print('May tinh da danh ban ! Ban da thua.') gameIsPlaying = False else: if isBoardFull(theBoard): drawBoard(theBoard) print('Tran dau da hoa !') break else: turn = 'player' print('Ban co muon choi lai khong? (yes hoac no)') if not input().lower().startswith('y'): break 16 ... bàn cờ đầy hay chưa 10 Vòng lặp cho trò chơi 10 Đoạn mã thực thi đầy đủ : 11 Mô tả đồ án game cờ Caro Yêu cầu đồ án: 1. 1Game caro gì? Là loại game đối kháng...Mục lục Mô tả đồ án game cờ Caro .3 Yêu cầu đồ án: 1. 1Game caro gì? .3 1. 2Luật chơi game: 1. 3 Phạm vi nghiên cứu ... False for i in range (1, 10 ): if isSpaceFree(board, i): return False return True print('Chao mung den voi game co caro! ') while True: #Thiết lập lại bàn cờ theBoard = [' '] * 10 playerLetter, computerLetter