Tải bản đầy đủ (.docx) (16 trang)

ĐỒ án 1 game cờ caro python

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (680.2 KB, 16 trang )

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 1
Đề 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 hiện
1. Trần Cao Thành
2. Đỗ Văn Chiến
3. Phạm Thế Vinh

:

Lớp : DHTI14A1ND
Hà Nội, ngày 1 tháng 11 năm 2022
1


Mục lục
Mô tả đồ án game cờ Caro...............................................................................................3
1. Yêu cầu của đồ án:........................................................................................................3
1.1Game caro là gì?.........................................................................................................3
1.2Luật chơi game:..........................................................................................................3
1.3 Phạm vi nghiên cứu..............................................................................................3
2. Phân tích cách hoạt động...............................................................................................3


2.1

Biểu diễn bảng cờ............................................................................................................4

2.2

Vẽ bàn cờ lên trên màn hình..........................................................................................4

2.3

Cho phép người chơi chọn O hoặc X.............................................................................5

3. Quyết định xem ai là người đi trước.....................................................................................6
3.1

Kiểm Tra xem người chơi thắng hay chưa...................................................................6

3.2

Kiểm tra xem ô trên bàn cờ còn hay không..................................................................7

3.3

Cho phép người chơi nhập 1 bước.................................................................................7

4. Chọn một bước đi từ tập hợp các bước đi..............................................................................7
4.1 Xây dựng chiến thuật với Game AI....................................................................................8
4.2 Tạo đoạn mã AI cho máy tính.............................................................................................8
4.3 Kiểm tra xem máy tính có thể thắng trong một bước đi hay khơng...............................9
4.4 Kiểm tra xem người chơi có thắng trong một bước đi nào đó hay khơng......................9

4.5 Kiểm tra xem bàn cờ đã đầy hay chưa............................................................................10
5 . Vòng lặp cho trò chơi..............................................................................................................10
6 . Đoạn mã thực thi đầy đủ :......................................................................................................11

2


Mô tả đồ án game cờ Caro
1.

Yêu cầu của đồ án:

1.1Game caro là gì?
Là một loại game đối kháng gồm có hai người chơi trên một màn
hình (hoặc một
tờ giấy) có kẻ các ơ vng đều nhau và người chơi đánh các 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, lần lượt mỗi bên đánh dấu O-X. Nếu mỗi
bên đạt được
3 dấu chung hàng (có thể là hàng ngang, hàng dọc, hàng chéo)
thì thắng.Lưu ý, nếu đạt được 2 dấu cùng hàng mà bị chặn trước
1 đầu là chưa thắng và khi mà 2 người chơi đạt dấu hết hàng thì
trận đấu được coi là 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
2. Phân tích cách hoạt động
Về cơ bản , chương trình có luồng hoạt động như sau:


3


Ngoài ra , để tránh việc làm với giao diện , chúng ta sẽ thực hiện các nước đi
thông qua việc bấm vào các con số với quy ước vị trí ơ trên bàn cờ tương
đương và giống như bàn phím gọi điện thoại trên máy di động .Như hình
dưới đây:

2.1 Biểu diễn bảng cờ
Đầu tiên, chúng ta sẽ phải tìm ra cách biểu diễn bảng cơ dưới dạng dữ liệu được
lưu trong một biến. Trên giấy, bảng cờ caro XO được vẽ dưới dạng một cặp
đường ngang và một cặp đường dọc. Trong chương trình này, bảng cờ caro sẽ
được biểu diễn dưới dạng danh sách các chuỗi ký tự. Mỗi chuỗi ký tự đại diện
cho một trong chín khoảng trống trên bàn cờ.
Nhớ rằng chúng ta đang đặt bàn cờ của mình giống như một bàn phím số trên bàn
phím. Vì vậy, nếu một danh sách có 10 chuỗi ký tự được lưu trữ trong một biến có
tên là board, thì board[7] sẽ là khoảng trống trên cùng bên trái trên bàn

4


cờ, board[8] sẽ là khoảng trống bên trên cùng ở giữa và cứ như thế. Người chơi sẽ
nhập một số từ 1 đến 9 để cho trò chơi biết họ muốn đi vào ô nào.

2.2 Vẽ bàn cờ lên trên màn hình
Chúng ta sẽ định nghĩa hàm drawboad() có nhiệm vụ thực hiện vẽ bàn cờ
như sau:

Hàm drawBoard() sẽ thực hiện in ra bàn cờ được biểu thị bằng tham số board. Hãy nhớ

rằng bàn cờ được biểu diễn dưới dạng danh sách bao gồm 10 chuỗi ký tự, trong đó
chuỗi ký tự ở chỉ số 1 là dấu trên khoảng trống 1 trên bàn cờ. Chuỗi ký tự tại chỉ số 0 sẽ
bị bỏ qua. Các hàm của trò chơi hoạt động bằng cách truyền một danh sách gồm 10
chuỗi ký tự là bàn cờ.
Ta cần đảm bảo rằng các khoảng trống sẽ được căn đúng trong các chuỗi, nếu không,
bàn cờ trông sẽ bị lệch khi in trên màn hình.

2.3 Cho phép người chơi chọn O hoặc X

Hàm inputPlayerLetter() sẽ hỏi người chơi muốn X hay O. Điều kiện của vịng
lặp while chứa dấu ngoặc đơn, có nghĩa là biểu thức bên trong dấu ngoặc đơn
được đánh giá trước. Nếu biến letter được đặt thành 'X', biểu thức sẽ đánh giá
như sau:

5


Nếu chữ cái có giá trị 'X' hoặc 'O', thì điều kiện của vòng lặp là False và cho phép quá
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 là True, chương
trình sẽ tiếp tục yêu cầu người chơi chọn một chữ cái cho đến khi người chơi nhập X
hoặc O.
Hàm tiếp theo trả về một danh sách có hai phần tử:

Phần tử đầu tiên (chuỗi ở chỉ số 0) là chữ cái của người chơi và phần tử thứ
hai là chữ cái của máy tính .
3. Quyết định xem ai là người đi trước

Hàm whoGoesFirst() sẽ được thực hiện quyết định xem ai đi trước bằng hàm
random.randit(0,1).
Tiếp theo chúng ta sẽ thực hiện vẽ kí tự lên trên bàn cờ

6


Các tham số bao gồm board, letter và move. Biến board là danh sách bao gồm
10 chuỗi ký tự biểu thị trạng thái của bảng. Biến letter có thể là biến letter của
người chơi ('X' hoặc 'O'). Biến move là vị trí trên bàn cờ mà người chơi muốn đi.

3.1 Kiểm Tra xem người chơi thắng hay chưa

Giả sử le là 'O' và bo là ['', 'O', 'O', 'O', '', 'X', '', 'X', '', ''] . Bàn cờ sẽ trông giống như
sau:

3.2 Kiểm tra xem ơ trên bàn cờ cịn hay không
Cho một bàn cờ caro và một nước đi có thể có, hàm isSpaceFree() sẽ
trả về liệu nước đi đó có thể thực thi được hay khơng:

3.3 Cho phép người chơi nhập 1 bước

7


Hàm getPlayerMove() sẽ yêu cầu người chơi nhập số cho ô mà họ muốn di chuyển:

4. Chọn một bước đi từ tập hợp các bước đi

Tham số board là danh sách các chuỗi ký tự biểu diễn bàn cờ caro. Tham số thứ
hai, movesList, là danh sách các số nguyên của các ơ có thể có để chọn. Ví dụ:
nếu movesList là [1, 3, 7, 9], điều đó có nghĩa là selectRandomMoveFromList() sẽ trả về
số nguyên là một trong các ô ở các góc.


4.1 Xây dựng chiến thu ật v ới Game AI
Thuật toán AI bao gồm các bước sau:
1. Xem liệu máy tính có thể thực hiện hành động nào để giành chiến
thắng trong trị chơi hay khơng . Nếu có sẽ thực hiện di chuyển .Nếu
khơng, chuyển sang bước 2.
2. Xem liệu người chơi có thể thực hiện hành động nào 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 3

8


3. Kiểm tra xem có bất kỳ khoảng trống nào trong góc (khoảng 1,3,7
hoặc 9) khơng . Nếu khơng có khoảng trống ở góc , thực hiện chuyển
sang bước 4
4. Kiểm tra xem khoảng trống ở giữa có trống rỗng hay khơng. Nếu có ,
di chuyển tới đó. Nếu khơng , thực hiện bước 5
5. Di chuyển trên bất kỳ khoảng trống ở các cạnh bên nào (khoảng trống
2,4,6 hoặc 8).Khơng cịn bước nào nữa bởi vì các khoảng trống bên là
tất cả những gì cịn lại nếu q trình thực hiên đạt đến bước 5
4.2 Tạo đoạn mã AI cho máy tính

Đối số đầu tiên là board, đại diện cho bàn cờ. Đối số thứ hai là ký tự mà máy tính sử
dụng, là 'X' hoặc 'O' trong tham số computerLetter.
Thuật toán AI của bàn cờ caro hoạt động như sau:
1. Xem liệu máy tính có thể thực hiện hành động nào để giành chiến thắng trong trò
chơi hay khơng. Nếu có, thực hiện hành động đó. Nếu khơng, chuyển sang bước
2.
2. Xem liệu người chơi có thể thực hiện hành động nào làm cho máy tính thua trị
chơi hay khơng. Nếu có, máy tính sẽ di chuyển đến đó để chặn người chơi. Nếu

khơng, chuyển sang bước 3.
3. Kiểm tra xem có góc nào trong số các góc (ơ 1, 3, 7 hoặc 9) có thể được thực
hiện bước đi hay khơng. Nếu khơng có ơ nào, chuyển sang bước 4.
4. Kiểm tra xem ô ở trung tâm có cịn trống hay khơng. Nếu có, thực hiện di chuyển
đến đó. Nếu khơng, chuyển sang bước 5.
5. Di chuyển trên bất kỳ cạnh nào (ô 2, 4, 6 hoặc 8). Khơng có thêm bước nào nữa,
bởi vì các khoảng trống bên cạnh là các ơ duy nhất cịn lại.
Hàm sẽ trả về một giá trị số nguyên từ 1 đến 9 biểu diễn cho bước đi của máy tính.
Ta sẽ cùng đi qua cách thức thực hiện các bước bên trên.

9


4.3 Kiểm tra xem máy tính có th ể th ắng trong m ột b ước đi hay
không

4.4 Kiểm tra xem người chơi có thắng trong m ột bước đi nào đó hay
khơng

4.5 Kiểm tra xem bàn cờ đã đầy hay chưa

10


Hàm này trả về True nếu danh sách 10 chuỗi ký tự trong đối số board mà nó được
truyền có dấu 'X' hoặc 'O' ở trong mỗi chỉ số (ngoại trừ chỉ số 0 được bỏ qua). Vòng lặp
for cho phép ta kiểm tra các chỉ số từ 1 đến 9 trên danh sách board. Ngay sau khi nó
tìm thấy một không gian trống trên bàn cờ (nghĩa là khi isSpaceFree(board, i) trả về
True), hàm isBoardFull() sẽ trả về False.
Nếu vịng lặp kết thúc, nghĩa là bàn cờ đã khơng cịn ơ trống nào, hàm sẽ trả về giá trị

là True.

5 . Vòng lặp cho trò chơi

11


6 . Đoạn mã thực thi đầy đủ :
import random
def drawBoard(board):
#Thực hiện in ra 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ả về tập hợp kiểu List với ký tự mà người chơi chọn làm phần tử đầu tiên
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 bất kỳ cho phép người chơi đ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ả về True nếu 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ả về True nếu nước đi còn chỗ trống
return board[move] == ' '
def getPlayerMove(board):
#Lấy nước đi của người chơi
move = ' '

while move not in '1 2 3 4 5 6 7 8 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ả về một nước đi hợp lệ
#Trả về None nếu khơng cịn nước đi 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 đi 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 đi tiếp theo có thắng được 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 có thể thắng trong nước đi tiếp theo 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 một nước đi ở các góc bàn cờ nếu trống
move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
if move != None:
14


return move
#Chọn nước đi ở giữa
if isSpaceFree(board, 5):
return 5
#Chọn một trong các nước đi ở các cạnh bên của bàn cờ
return chooseRandomMoveFromList(board, [2, 4, 6, 8])
def isBoardFull(board):
#Trả về True nếu các nước đi khơng cịn, ngược lại trả về 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



×