Python đã trở thành một trong những ngôn ngữ lập trình phổ biến nhất vàđược sử dụng rộng rãi trong nhiều lĩnh vực từ phát triển web, khoa học dữliệu, trí tuệ nhân tạo, đến hệ thống và ứn
Khái niệm python
Python là một ngôn ngữ lập trình thông dịch mạnh mẽ, hướng đối tượng và có ngữ nghĩa động Được coi là ngôn ngữ bậc cao, Python nổi bật với cú pháp rõ ràng, dễ đọc và dễ viết Mô hình hóa đối tượng trong Python cho phép phân chia mã thành các đối tượng độc lập, đồng thời hỗ trợ kế thừa, đa hình và truy cập vào thuộc tính cũng như phương thức.
Python hỗ trợ việc sử dụng module và gói, khuyến khích lập trình theo hướng module hóa, giúp tổ chức và tái sử dụng mã hiệu quả Điều này không chỉ nâng cao khả năng quản lý dự án mà còn thúc đẩy quá trình phát triển ứng dụng quy mô lớn.
Python được xây dựng trên nền tảng trình thông dịch và thư viện chuẩn mở rộng, cả hai đều được cung cấp miễn phí dưới dạng mã nguồn hoặc nhị phân cho các nền tảng chính Sự phân phối tự do này đã tạo ra một môi trường phát triển phong phú và năng động.
Guido van Rossum đã sáng lập ngôn ngữ lập trình Python vào cuối những năm 1980, lấy cảm hứng từ ngôn ngữ ABC và ảnh hưởng từ SETL, đồng thời có khả năng tương tác với Hệ điều hành Amoeba Ông đóng vai trò quan trọng trong việc phát triển Python, là tác giả chính và có ảnh hưởng lớn đến định hướng phát triển của ngôn ngữ này.
Python là ngôn ngữ lập trình phổ biến, được ứng dụng rộng rãi trong phát triển web, khoa học dữ liệu, trí tuệ nhân tạo, và ứng dụng di động Sức mạnh và tính linh hoạt của Python đã thu hút một cộng đồng lập trình viên đa dạng và đam mê trên toàn cầu.
Ứng dụng của Python
Một số những ứng dụng phổ biến của Python là:
- Xây dựng những chú bot
- Trích xuất dữ liệu từ trang web (web scrapping)
- Học máy (machine learning), hình hoá dữ liệu (data visualization), phân tích dữ liệu (data analysis)
- Xây dựng trang web với các framework như Django và Flask
- Phát triển game với Pygame
- Phát triển ứng dụng điện thoại với các framework như Kivy
Đặc điểm của Python
Python nổi bật với cú pháp đơn giản và dễ đọc, cho phép lập trình viên tập trung vào việc giải quyết vấn đề mà không bị rối rắm bởi cú pháp phức tạp.
Cộng đồng lập trình viên Python rất lớn và năng động, cung cấp nhiều nguồn hỗ trợ, tài liệu và giải pháp cho hầu hết các vấn đề mà người dùng gặp phải.
Python sở hữu một bộ thư viện phong phú và các framework mạnh mẽ, hỗ trợ việc phát triển đa dạng ứng dụng từ web cho đến khoa học dữ liệu và trí tuệ nhân tạo.
Python hỗ trợ đa nền tảng, cho phép người dùng viết mã một lần và chạy trên nhiều hệ điều hành như Windows, macOS và Linux.
Python là một ngôn ngữ lập trình đa năng, được ứng dụng rộng rãi trong phát triển ứng dụng web, xử lý dữ liệu và trí tuệ nhân tạo Ngôn ngữ này đóng vai trò quan trọng trong nhiều lĩnh vực như công nghệ thông tin, khoa học dữ liệu và ngành công nghiệp trò chơi.
Tkinter - Thư Viện Xây Dựng Giao Diện
Thư viện Tkinter trong Python là công cụ tiêu chuẩn để phát triển giao diện người dùng đồ họa (GUI) Nó cung cấp một bộ công cụ phong phú cho việc tạo và quản lý cửa sổ, các widget như nút và khung, cũng như xử lý sự kiện trong các ứng dụng GUI.
Tkinter, được xây dựng trên nền tảng Tcl/Tk, đã được tích hợp sẵn trong các phiên bản tiêu chuẩn của Python mà không cần cài đặt thêm Điều này giúp Tkinter trở thành lựa chọn phổ biến và tiện lợi cho việc khởi đầu các dự án GUI nhỏ hoặc đơn giản.
Thư viện cung cấp nhiều widget cơ bản như nút, ô văn bản và hộp chứa, đồng thời cho phép tùy chỉnh linh hoạt giao diện, quản lý bố cục, màu sắc, sự kiện và tương tác với người dùng.
Mặc dù Tkinter không sở hữu nhiều tính năng phức tạp và thiếu công cụ tạo giao diện tương tác, nó vẫn là một công cụ hữu ích cho việc phát triển các ứng dụng GUI đơn giản trong Python Tkinter cung cấp nền tảng cơ bản giúp người dùng hiểu rõ cách thức hoạt động của các ứng dụng GUI Trong bài viết này, chúng ta sẽ giới thiệu về game “TIC-TOC-TOE”.
PHÂN TÍCH, GIẢI QUYẾT BÀI TOÁN
Phân thích yêu cầu
2.1.1 Mục tiêu của trò chơi
Trò chơi Tic-Tac-Toe có mục tiêu chính là tạo ra chuỗi ba ký hiệu liên tiếp của một người chơi, thường là "X" hoặc "O", trên bảng lưới 3x3 Người chơi phải chiến thắng bằng cách sắp xếp ký hiệu của mình theo hàng ngang, hàng dọc hoặc hàng chéo, đồng thời ngăn chặn đối thủ tạo ra chuỗi chiến thắng.
+ Đối tượng chính của trò chơi là người chơi, thường là hai người chơi chơi với nhau.
Giao diện người chơi được thiết kế đơn giản với lưới 3x3 ô vuông, cho phép người dùng dễ dàng chọn ô bằng cách nhấp hoặc chạm vào Sự thân thiện và dễ sử dụng của giao diện này mang lại trải nghiệm tốt cho người chơi.
Người chơi lần lượt chọn ô trống để đặt ký hiệu của mình (thường là
Mục tiêu của trò chơi là tạo ra một chuỗi ba ký hiệu giống nhau, có thể là "X" hoặc "O", theo hàng ngang, hàng dọc hoặc hàng chéo Đồng thời, người chơi cần phải ngăn chặn đối thủ tạo ra chuỗi chiến thắng của họ.
Trò chơi sẽ kết thúc khi một trong hai người chơi tạo thành chuỗi ba ký hiệu liên tiếp, hoặc khi toàn bộ lưới đã được lấp đầy mà không có chuỗi nào được hình thành Trong trường hợp có sự đồng đội, kết quả của trò chơi sẽ là hòa.
2.1.6 Lưu trữ các đối tượng trong game
Trò chơi Tic-Tac-Toe khởi đầu với một lưới trống và không cần lưu trữ dữ liệu giữa các ván, vì mỗi ván chỉ kết thúc khi một trong hai người chơi thắng hoặc hòa Do đó, việc lưu trữ trạng thái game sau mỗi ván là không cần thiết.
2.1.7 Môi trường phát triển và triển khai
Sử dụng ngôn ngữ lập trình Python
Sử dụng thư viện pygame để phát triển
Giải quyết bài toán
- Cài đặt Python và Pygame trên máy tính
- Khởi tạo các thư mục, file ảnh cho game
- Tạo một cửa sổ game với chiều rộng và chiều cao xác định trước
- Khởi tạo bộ đếm thời gian
2.2.3 Xác định các lớp và đối tượng chính:
- self.machine_cover: Danh sách các ô mà máy đã đánh dấu.
- self.human_cover: Danh sách các ô mà người chơi đã đánh dấu.
- self.prob: Danh sách các ô mà máy có thể đánh dấu tiếp theo.
- self.sign_store: Dictionary lưu trữ các ô và ký hiệu đã được đánh dấu bởi máy hoặc người chơi.
- self.chance_counter: Biến đếm số lượt chơi.
- self.technique: Biến xác định kỹ thuật / chiến thuật mà máy sử dụng để đánh.
- init (self, root): Khởi tạo một trò chơi mới với các biến và cấu trúc dữ liệu ban đầu.
- decorating(self): Thiết lập giao diện người dùng với các nút và các khung Button.
- reset(self): Reset trạng thái của trò chơi khi cần thiết.
- human_play(self, chance): Xử lý nước đi của người chơi.
- machine_play(self): Xử lý nước đi của máy.
- game_over_management(self): Quản lý khi trò chơi kết thúc và hiển thị thông báo thích hợp.
- machine_line_match(self): Kiểm tra xem máy đã chiến thắng hay chưa.
- human_line_match(self): Kiểm tra xem người chơi đã chiến thắng hay chưa.
- Các phương thức khác để quản lý trạng thái trò chơi.
2.2.4 Xử lý sự kiện và di chuyển:
- Nước đi của người chơi:
Sự kiện của người chơi được xử lý thông qua phương thức human_play(self, chance).
Khi người chơi chọn một ô trên bảng (qua việc nhấn vào một Button), nó gọi phương thức này với vị trí của ô đó là tham số chance.
Phương thức này cập nhật trạng thái của bảng và kiểm tra xem trò chơi đã kết thúc chưa.
Sự kiện cho nước đi của máy được xử lý thông qua phương thức machine_play(self).
Sau khi người chơi thực hiện nước đi của mình, máy tính phản ứng thông qua việc gọi phương thức này.
Phương thức này sử dụng một chiến thuật đặc biệt để xác định ô tiếp theo mà máy sẽ chọn, đồng thời cập nhật trạng thái của bảng và kiểm tra tình trạng kết thúc của trò chơi.
- Di chuyển giữa các trạng thái trò chơi:
Các nút Button như "Machine First", "Player First",
"Reset", được sử dụng để điều khiển trạng thái của trò chơi.
Nhấn các nút này để gọi các phương thức như reset() nhằm khởi động lại trò chơi, hoặc để chọn người chơi đầu tiên là máy hoặc người.
- Hiển thị thông báo và kết quả:
Khi trò chơi kết thúc, thông báo kết quả sẽ được hiển thị thông qua cửa sổ thông báo hoặc giao diện người dùng.
- Sử dụng Tkinter để tạo cửa sổ giao diện root.
- Tạo các button để đại diện cho các ô trong bảng Tic Tac Toe.
- Định nghĩa hàm on_button_click() để xử lý sự kiện khi một button được nhấn.
- Gắn các hàm xử lý sự kiện này cho từng button để xác định nước đi của người chơi.
- mainloop(): Vòng lặp chính để giữ ứng dụng mở và đón sự kiện từ người dùng.
- click(): Xử lý sự kiện click chuột, đặt "X" hoặc "O" vào ô trống trên lưới.
CÀI ĐẶT, ĐÁNH GIÁ THỬ NGHIỆM
Thiết kế
3.1.1 Thiết kế dữ liệu a) Biến và cấu trúc dữ liệu quan trọng:
- self.machine_cover: Danh sách lưu các ô mà máy đã đánh dấu.
- self.human_cover: Danh sách lưu các ô mà người chơi đã đánh dấu.
- self.prob: Danh sách lưu các ô mà máy có thể đánh dấu tiếp theo.
- self.sign_store: Dictionary lưu trữ các ô và ký hiệu đã được đánh dấu bởi máy hoặc người chơi.
- self.chance_counter: Biến đếm số lượt chơi.
- self.technique: Biến xác định kỹ thuật / chiến thuật mà máy sử dụng để đánh. b) Giao diện người dùng:
Các nút Button (self.btn_1, self.btn_2, self.btn_9) được sử dụng để hiển thị bảng Tic-Tac-Toe, cho phép người chơi và máy tính thực hiện các nước đi trong trò chơi.
Các nút điều khiển như "Machine First", "Player First" và "Reset" được sử dụng để điều chỉnh quá trình chơi và khôi phục trò chơi về trạng thái ban đầu Những phương thức này giúp quản lý logic và giao diện một cách hiệu quả.
- decorating(): Thiết lập giao diện người dùng với các nút và các khung Button.
- reset(): Reset trạng thái của trò chơi khi cần thiết.
- Các phương thức human_play(chance) và machine_play():
Xử lý nước đi của người chơi và máy tương ứng.
- game_over_management(): Quản lý khi trò chơi kết thúc và hiển thị thông báo thích hợp.
- Các phương thức kiểm tra điều kiện chiến thắng hoặc hòa: machine_line_match() và human_line_match()
Hình 3.2: Giao diện khi bắt đầu game
Hình 3.3: Giao diện khi đang chơi game
- Giao diện khi user thắng
Hình 3.4: Giao diện khi user thắng game
Hình 3.5: Giao diện khi hòa
- Giao diện khi computer thắng
Hình 3.6: Giao diện khi computer thắng
3.2.1 Default setting: from tkinter import * from tkinter import messagebox import random
3.2.2 Class Tic Tac Toe class TIC_TAC_TOE_AI: def init (self root , ):
The basic initialization of the program involves setting up the main window and creating a canvas with a white background, raised relief, and a border of 3 The canvas is designed to fill the available space and expand as needed Key variables are initialized, including lists for machine and human covers, a probability list, a sign store dictionary, a chance counter set to zero, and a technique variable initialized to -1 Additionally, a surrounding store is defined with various nested structures for future use.
8 :(7,9), 9:( , , ,3)} 7 8 6 self.decorating () def decorating(self):# Basic Set-up
Label(self.make_canvas text="Tic-Tac-Toe" , , bg="#FFFFFF" , fg= "#00FF00" , font=( "Lato" , 25,
In this code snippet, multiple buttons are created using the Button class in a graphical user interface (GUI) framework Each button is styled with a specific font, size, background color, and command that triggers a human player action when clicked The buttons are initially set to a disabled state and are placed at designated coordinates on the canvas Additionally, a separate button labeled "Machine First" is included, allowing users to choose the order of play The buttons are organized into a list for easy activation, enhancing user interaction within the application.
The article discusses the creation of a button interface in a graphical user interface (GUI) using Python's Tkinter library It highlights the customization of button properties, such as background color, active background color, foreground color, relief style, and border width The button is designed to initiate a command that allows the user to control the game, specifically enabling the "Player First" option The font style is set to bold Arial, ensuring clarity and emphasis on the button's text.
The game interface includes buttons for resetting and controlling the game flow, with specific configurations for each button's appearance and state The reset function clears all game data, while the game over management function disables buttons and allows for a reset Control is given based on whether the human or machine plays first, with the machine's moves strategically determined by analyzing the human player's last moves The machine employs various techniques to decide its next move, including analyzing surrounding positions and potential threats Each move updates the game state, and conditions are checked for winning or drawing scenarios The game logic ensures an engaging experience by dynamically adjusting strategies based on player actions.
The code snippet checks specific conditions based on the value of `human_last` to determine the placement of a variable called `place_here` If `human_last + 1` equals 3 or 19 and is not already in `self.sign_store.keys()`, it assigns `place_here` to `human_last + 1` Alternatively, if `human_last - 1` equals 1 or 7 and is not in `self.sign_store.keys()`, it sets `place_here` to `human_last - 1` Another condition checks if `human_last - 3` equals 1 or 3 and is not in `self.sign_store.keys()`, assigning `place_here` accordingly If none of these conditions are met, `place_here` defaults to `human_last + 3` The method then calls `self. sign_insert(place_here)` and appends `place_here` to `self.machine_cover` A temporary dictionary `temp_oppo` is created, and the probability associated with `place_here` is appended to `self.prob` If no conditions are satisfied, the code attempts to remove elements from `take_center_surr`, which is derived from `self.surrounding_store[5]`, based on elements in `self.human_cover` and `self.machine_cover`.
In the given code snippet, a condition checks if the value of `human_last` plus 3 equals 7 or 9, or if `human_last` plus 3 exists in the keys of `self.sign_store` If true, it assigns `take_place` to `human_last` minus 3; otherwise, it randomly selects a position from `take_center_surr`, removes it from the list, and inserts it into the sign store while updating the machine cover and surrounding store Additionally, the code iterates through the keys of the `opposite` dictionary, inserting odd keys that are not present in the sign store into it, while also updating the machine cover and probability list.
In the game logic, the system evaluates various conditions based on the player's moves and the current state of the game If certain conditions are met, it appends potential moves to the probability list The algorithm also checks for surrounding elements and updates the game state accordingly When the player's last move is identified, the system decides the next move based on predefined techniques and available options If the probability list is empty, the system defaults to a strategic choice The algorithm ensures that the moves are unique and checks for any winning conditions after each turn Ultimately, the game alternates between human and machine plays, maintaining a structured approach to determine the winner.
"X": found=1 elif self activate_btn [4-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [6-1]['text' ] ==
"X": found=1 elif self activate_btn [7-1]['text' ] == self activate_btn [8-1]['text' ] == self activate_btn [9-1]['text' ] ==
"X": found=1 elif self activate_btn [1-1]['text' ] == self activate_btn [4-1]['text' ] == self activate_btn [7-1]['text' ] ==
"X": found=1 elif self activate_btn [2-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [8-1]['text' ] ==
"X": found=1 elif self activate_btn [3-1]['text' ] == self activate_btn [6-1]['text' ] == self activate_btn [9-1]['text' ] ==
"X": found=1 elif self activate_btn [1-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [9-1]['text' ] ==
"X": found=1 elif self activate_btn [3-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [7-1]['text' ] ==
In the game logic, when a player is found to be the winner, a message box displays "Game Over" with "Computer is the winner," and the game management process is initiated If the chance counter reaches 9, a message box indicates a "Game draw," prompting the game management to conclude The function `human_line_match` checks for matching text in specific buttons to determine if a player has won.
"O": found=1 elif self activate_btn [4-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [6-1]['text' ] ==
"O": found=1 elif self activate_btn [7-1]['text' ] == self activate_btn [8-1]['text' ] == self activate_btn [9-1]['text' ] ==
"O": found=1 elif self activate_btn [1-1]['text' ] == self activate_btn [4-1]['text' ] == self activate_btn [7-1]['text' ] ==
"O": found=1 elif self activate_btn [2-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [8-1]['text' ] ==
"O": found=1 elif self activate_btn [3-1]['text' ] == self activate_btn [6-1]['text' ] == self activate_btn [9-1]['text' ] ==
"O": found=1 elif self activate_btn [1-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [9-1]['text' ] ==
"O": found=1 elif self activate_btn [3-1]['text' ] == self activate_btn [5-1]['text' ] == self activate_btn [7-1]['text' ] ==
In the game logic, if the variable 'found' is equal to 1, a message box will display "Game Over" indicating the player is the winner, and the game over management function will be invoked If the chance counter reaches 9, a message box will show "Game Over" signaling a draw, and again, the game over management function will be called In all other cases, the game continues.
-Các hàm chức năng: if name == " main ": window = Tk () window.title("Tic-Tac-Toe" ) window.config(bg="#141414" ) window.geometry("450x500" ) window.maxsize(450,500 ) window.minsize(450 500 , )
TIC_TAC_TOE_AI(window ) window.mainloop ()
- Giao diện khi bắt đầu
Hình 3.7: Giao diện khi bắt đầu game
Hình 3.8:Giao diện trong game
- Giao diện khi user thắng:
Hình 3.9: Giao diện khi PLAYER thắng
- Giao diện khi computer thắng:
Hình 3.10:Giao diện khi MÁY thắng
Hình 3.11:Giao diện khi hòa
Trong quá trình nghiên cứu và ứng dụng kiến thức từ nhà trường, chúng em đã phát triển một trò chơi giải trí lành mạnh, với hy vọng mở ra cơ hội cho những thể loại game chất lượng hơn trong tương lai Mặc dù có nhiều ý tưởng độc đáo, do hạn chế về kiến thức và thời gian, chúng em chưa thể thực hiện tất cả Tuy nhiên, chúng em đã nỗ lực xây dựng một chương trình hoàn chỉnh và đẹp mắt Trong quá trình thực hiện, không tránh khỏi sai sót, vì vậy chúng em rất mong nhận được sự đóng góp từ thầy cô và các bạn để hoàn thiện sản phẩm tốt nhất.