1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tạo trò chơi tháp hà nội sử dụng stack Đồ án kết thúc môn học

23 0 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tạo Trò Chơi Tháp Hà Nội Sử Dụng Stack Đồ Án Kết Thúc Môn Học
Tác giả Huỳnh Thiên Hạo - 23162021, Cao Đăng Huy - 23162028, Võ Gia Huân - 23162027
Người hướng dẫn ThS. Lê Minh Tân
Trường học Trường Đại Học Sư Phạm Kỹ Thuật TP.HCM
Chuyên ngành Công Nghệ Thông Tin
Thể loại Đồ án
Năm xuất bản 2023 - 2027
Thành phố TP.HCM
Định dạng
Số trang 23
Dung lượng 1,68 MB

Nội dung

Việc xây dựng trò chơi Tháp Hà Nội trong lập trình không chỉ giúp hiểu rõ về cấu trúc dữ liệu stack ma con nâng cao khả năng phân tích, thiết kế thuật toán.. ĐÓI TƯỢNG, PHẠM VI NGHIÊN CỨ

Trang 1

TRUONG DAI HOC SU PHAM KY THUAT TP.HCM

KHOA CONG NGHE THONG TIN

BO MON CAU TRUC DU LIEU VA GIAI THUAT

Trang 2

LOLCAM ON Trước hết, em xin gửi lời cảm ơn chân thành và sâu sắc nhất đến

Thầy Lê Minh Tân vì đã tận tình hướng dẫn, chỉ bảo nhóm chúng

em trong suốt quá trình thực hiện đồ án Nhờ sự chỉ dẫn quy bau

và sự động viên của thầy, đã tiếp thêm động lực cho chúng em kịp thời hoàn thành được đồ án nay

Em cũng xin gửi lời cảm ơn đến Ban giám hiệu và các thay cô trong Khoa Công Nghệ Thông Tin đã tạo điều kiện và cung cấp

nguồn tài liệu, kiến thức cần thiết để nhóm em có thể thực hiện đồ

an mot cách thuận lợi, suôn sẻ

Em xin cảm ơn các bạn bè trong lớp đã hỗ trợ, chia sẻ kinh nghiệm

và giúp đỡ nhóm em trong quá trình nghiên cứu và hoàn thiện đồ an

kết thúc môn học

Trang 3

KE HOACH THUC HIEN

(Ghi rõ từng thời gian tiến hành các công việc của luận văn, thời gian thí nghiệm, thăm quan hiện trường, )

Người viết đề cương

Y kiên của giáo viên hướng dẫn

(ký và ghi rõ họ tên)

Trang 4

MUC LUC

1 Phan MO DAU

1.1 Tính cấp thiết của đề tài

1.2 Mục đích của đề tài

1.3 Cách tiếp cận và phương pháp nghiên cứu

- _ Đối tượng nghiên cứu

Trang 5

PHAN 1: MO DAU

1 TINH CAP THIET CUA DE TAI

Trò chơi Tháp Hà Nội là một trò chơi toán học cô điền, lâu đời và nỗi tiếng với tính thử thách về tư duy logic và khả năng giải quyết vấn đề Trò chơi này đòi hỏi người chơi di chuyển các đĩa từ cột này sang cột khác theo quy tắc kích thước đĩa trên phải bé hơn kích thước đĩa đưới, giúp phát triển kỹ năng tư duy thuật toán và quản lý dữ liệu Việc xây dựng trò chơi Tháp Hà Nội trong lập trình không chỉ giúp hiểu rõ về cấu trúc dữ liệu stack ma con nâng cao khả năng phân tích, thiết kế thuật toán Đề tài này có ý nghĩa cấp thiết đối với sinh

viên để củng cô kiến thức về cấu trúc dữ liệu, đồng thời hỗ trợ phát triển các ứng dụng logic

liên quan đến quản lý bộ nhớ và thứ tự xử lý đữ liệu

2 ĐÓI TƯỢNG, PHẠM VI NGHIÊN CỨU

Đối tượng nghiên cứu: Đối tượng của nghiên cứu là thuật toán và cấu trúc dữ liệu stack, cùng với các phương pháp áp dụng stack vảo việc triển khai và giải quyết bải toán Tháp Hà

Nội

Phạm vi nghiên cứu: Đề tài sẽ tập trung vảo việc lập trình trò chơi Tháp Hà Nội bằng ngôn ngữ C++, sử dụng cấu trúc đữ liệu stack Phạm vi nghiên cứu sẽ bao gồm cả các thuật toán cơ bản đề đi chuyền đĩa siữa các cột và thuật toán tối ưu cho các chức năng khác của trò chơi

3 PHAN TICH HUONG NGHIEN CUU LIEN QUAN

Trong lĩnh vực khoa học máy tính, stack là một cấu trúc đữ liệu quan trọng, hoạt động theo nguyên tắc "LIFO" (Last In, First Out) hoặc “FILO” (First in, Last out) Stack thường được dùng trong các ứng dụng yêu cầu quản lý thứ tự thực hiện như lưu trữ biến, xử ly đệ quy, và quản lý bộ nhớ Trong trò chơi Tháp Hà Nội, stack giúp lưu trữ các đĩa theo thứ tự từ lớn đến nhỏ, phù hợp với yêu cầu bài toán Đề tài này sẽ nghiên cứu cách áp dụng stack dé giải quyết bài toán, từ đó mở rộng kiến thức và kỹ năng về các ứng dụng thực tiễn của stack

trong phát triển trò chơi và giải thuật

Trang 6

4 KET QUA DU KIEN

Sau khi hoàn thành nghiên cứu, đề tài dự kiến đạt được các kết quả sau:

Xây dung trò chơi Tháp Hà Nội bằng ngôn ngữ C+~ với giao điện Console, øiúp người dùng

dễ đàng thao tác và nắm rõ cách hoạt động của trò chơi

Triển khai và tối ưu hóa thuật toán giải quyết bài toán Tháp Hà Nội tự động sử dụng cấu trúc stack

Tích hợp các tính năng tính điểm và hiển thị thời gian thyc để đánh giá hiệu quả và thành tích của người chơi

Cung cấp tài liệu hướng dẫn sử dụng và mã nguồn chỉ tiết để phục vụ cho các lập trình viên

và người nghiên cứu khác, hỗ trợ họ trong việc phát triển các ứng dụng liên quan đến stack và thuật toán giải bài toán logic

Trang 7

PHAN 2: NOI DUNG

1 LY THUYET THU 1: STACK

1.1 Giải thích kiểu dữ liệu Stack (Ngăn xếp)

Bước 1: Trạng thái ban đầu của ngăn xếp bao gồm các phần tử lần lượt từ dưới lên là

A, B, và C Phần tử trên cùng là C và được đánh dấu bằng top

Bước 2: Pushing D, ở bước nảy ta thực hiện thao tác "push" phần tử D vào ngăn xếp Phần tử D sẽ được thêm vào vị trí trên củng, và con trỏ top sẽ được cập nhật để chỉ phần tử D Bây giờ, ngăn xếp có thứ tự từ đưới lên là A, B, C, và D

Bước 3: Popping , ở bước này ta thực hiện thao tác "pop", nghĩa là lây phần tử D ra khỏi ngăn xếp Sau khi "pop" phần tử D, con trỏ top sẽ quay về chỉ phần tử C, va phan

tử D không còn trone ngăn xếp nữa Hiện tại, ngăn xếp trở về trạng thái ban đầu với cac phan tu A, B, va C

Trang 8

1.2 Ung dung stack vao dé tai

1.2.1 Ly do chon stack

Việc sử dụng cấu trúc dữ liệu ngăn xếp Stack trong trò chơi Tháp Hà Nội là một lựa chọn lý tưởng bởi vì stack có thê quản lý số đĩa ở mỗi cột đễ dàng hơn và cơ chế hoạt động của stack (Last in, ñrst out) cũng phù hợp với quy tắc di chuyển đĩa của trò chơi

1.2.2 Nguyên lý hoạt động của stack ở các cột

Mỗi cột trong tháp Hà Nội tương ứng với một ngăn xếp (stack) độc lập, các đĩa được đặt lên các stack theo thứ tự từ lớn đến nhỏ với đĩa lớn nhất ở dưới và đĩa nhỏ nhất ở trên cùng Ngăn xếp “source” chứa tất cả các đĩa ban đầu, “temp” là cột giữa,

“target” la cét dich Mỗi thao tác di chuyền đĩa siữa các cột thực chất là các thao tác push và pop trên các ngăn xếp nảy

Ví dụ: Khi di chuyên một đĩa từ cột A sang cột B thi dia ở đỉnh cột A là đĩa nhỏ nhất được lấy ra (pop) khỏi cột A và được đưa vào (push) cột B trở thành đĩa đỉnh ở cột B Thực hiện tương tự giữa cột A và C, cột B và cột C cho đến khi các đĩa ở cột A di chuyền hết đến cột C

1.2.3 Tối ưu hoá thuật toán

Để tối ưu hoá thuật toán, việc sử dụng thuật toán đệ quy kết hợp với stack là một cách tiếp cận hiệu quả vì thuật toán đệ quy giúp chia bài toán lớn thành các bài toán con nhỏ hơn, dễ giải quyết Đồng thời việc kết hợp thuật toán đệ quy cùng với các thao tác push và pop trên stack giúp tối ưu hóa thời gian thực thi, đặc biệt khi số lượng đĩa lớn

1.3 Phân tích và triển khai Stack trong game Tháp Hà Nội

1.3.1 Triển khai code

Để xây dựng trò chơi Tháp Hà Nội dùng Stack, ta định nghĩa một cấu trúc Stack với các phương thức cần thiết để quản lý các đĩa trên từng cột

Cấu trúc Stack bao gồm các thuộc tính:

MAX: số lượng đĩa tối đa có thể lưu trữ

top: chỉ số của phần tử đầu trong stack

count: số lượng phần tử hiện tại trone stack

Trang 9

a: mảng lưu trữ các đĩa

Các phương thức quan trọng trong Stack:

isEmpty(): kiếm tra stack có rồng hay không, trả về true nếu rỗng

isFull(): kiém tra stack có đầy hay không, tra vé true néu day

push(int value): thém mét dia vao stack, tra về true nếu thêm thành công, false nếu stack day

pop(int* n): lấy một đĩa khỏi stack, lưu giá trị của đĩa vào biến n, tra vé true néu lay

thành công, false nếu stack rỗng

peek(): lấy giá trị đĩa trên cùng mà không xóa khỏi stack

getLength(): tra về số lượng đĩa hiện tại trong stack

getData(): tra về chuỗi chứa các đĩa trong stack, phục vụ cho việc hiển thị trên giao diện

Phần xử lý game nằm trong hàm towerOfHanoi, sử dụng thuật toán đệ quy để di chuyền đĩa giữa các cột Hàm nảy gọi đệ quy dé di chuyền các đĩa nhỏ hơn từ cột nguồn qua cột tạm, sau đó di chuyền đĩa lớn nhất từ cột nguồn sang cột đích, và cuối củng di chuyền các đĩa nhỏ từ cột tạm qua cột đích

1.3.2 Phân tích thuật toản đệ quy va stack

Thuật toán Tháp Hà Nội dựa trên ý tưởng đệ quy, chia bài toán lớn thành các bài toán nhỏ hơn Nếu số lượng đĩa là n, bài toán được chia làm ba bước:

Bước I1: Di chuyên n-1 đĩa từ cột nguồn (source) sang cột tạm (temp) bằng cột đích (target)

Bước 2: Di chuyên đĩa lớn nhất (đĩa thứ n) từ cột nguồn sang cột đích

Bước 3: DI chuyền n-l đĩa từ cột tạm sane cột đích bằng cột nguồn

Stack giúp triển khai thuật toán nảy dễ dàng hơn nhờ nguyên lý LIFO (Last ¡n, First out) Khi đĩa được di chuyên giữa các cột, thao tác pop và push của stack sẽ giúp thực hiện các di chuyền theo đúng thứ tự và bảo toàn tính chính xác của bài toán

Trang 10

1.3.3 Danh gid tinh hiệu qua

Việc su dung stack cho phép quan lý các đĩa một cách rõ ràng và hiệu quả, tuân thủ chặt chẽ nguyên tắc "LIFO" để dam bảo không có đĩa nào bị xếp sai vị trí Mỗi thao tác push và pop đều có độ phức tạp thời gian O(1), đảm bảo hiệu quả khi thao tác với số lượng đĩa lớn Về thuật toán, độ phức tạp của thuật toán Tháp Hà Nội là O(2^n), do số lần di chuyền tăng theo cấp số nhân với mỗi đĩa thêm vào Điều này làm cho bài toán trở nên phức tạp với n lớn Tuy nhiên, việc sử dụng stack vẫn giúp td chức và quản lý các thao tác này một cách dễ hiểu, đơn giản và trực quan

Với sự kết hợp giữa thuật toán đệ quy và cấu trúc stack, chương trình Tháp Hà Nội được xây dựng không chỉ tối ưu về logic, thuật toán mà còn dễ sửa lỗi, nâng cấp cho

các tính năng mới của trò chơi trong tương lai

2 LI THUYET THU 2: DOUBLE LINKED LIST

2.1 Giai thich double linked list

2.1.1 Định nghĩa

Danh sách liên kết đôi (Doubly Linked List) là một biến thể của danh sách liên kết đơn (Sinply Linked List), trong đó hoạt động duyệt qua các nút có thể được thực

kết đơn Mỗi nút trong danh sách chứa ba thành phần cơ bản gồm: Value (giá trị đữ liệu), Next (con trỏ tới nút tiếp theo) và Prev (con trỏ tới nút trước nó)

2.1.2 Đặc điểm

Danh sách liên kết đôi có hai con trỏ đặc biệt được go la Head va Tail

Con tro Head tro đến nút đầu tiên còn con trỏ Tail thi trỏ đến nút cuối cùng

Mỗi nút mang một trường dữ liệu và hai trường được goi lần lượt là Next và Prev

Mỗi nút được liên kết với phần tử kế tiếp bởi sử dụng con trỏ Next

Mỗi nút được liên kết với phần tử phía trước bởi sử dụng con trỏ Prev

Nút cuối cùng luôn trỏ Next tới NULL để đánh dấu là phần tử cuối của danh sách

Nút đầu tiên luôn trỏ Prev tới NULL để đánh dấu là phần tử đầu của danh sách

Trang 11

2.2 Ung dung Double Linked List vao dé tai

2.2.1, Ly do chon Double Linked List

Trong trò chơi Tháp Hà Nội, việc quản lý danh sách người chơi (Player) là một phần quan trọng để lưu trữ, sắp xếp và truy xuất các thông tin như tên người chơi, số lượng đĩa đã di chuyền, số bước di chuyền, thời gian hoàn thành, va điểm số Double Linked List là một cầu trúc dữ liệu phù hợp để thực hiện các thao tác nảy, giúp quản lý danh sách dễ dàng, hiệu quả và linh hoạt hơn Ngoài ra việc có con trỏ Prev và Next giúp đễ dàng duyệt danh sách theo cả hai chiều, thuận lợi cho việc sắp xếp và tìm kiếm

2.2.2 Cấu trúc Double Linked List ứng dụng vào quản lý danh sách người chơi

Cấu trúc DoubleListPlayer được triển khai với hai con trỏ đặc biệt head và tail, lần lượt tro dén phan tir dau tiên và phần tử cuối cùng của danh sách người chơi Mỗi nút trong danh sách bao gồm một cấu trúc Player, lưu các thông tin về người chơi, và các con trỏ prev và next giúp di chuyên qua lại giữa các nút trong danh sách Từ đó

thực hiện các chức năng khác như thêm người chơi, sắp xếp thứ hạng, tìm kiếm thông

tin người chơi, lưu trữ và đọc dữ liệu file

2.3 Nguyên lý hoạt động của Doubly Linked List trong quản lý danh sách người chơi 2.3.1 Cau trúc Node

struct Player { string name;

Trang 12

Mỗi Node trong danh sách chứa đữ liệu của người choi (Player) (tén, số đĩa, số bước, thời gian, điểm) Con trỏ Prev đến node trước đó còn con trỏ Next đến node tiếp theo

2.3.2 Quản lý danh sách

struct DoubleListPlayer { Node* head = NULL;

Node* tail = NULL;

khởi tạo các con trỏ prev và next là NULL

2.3.4 Thêm người chơi mới

void addPlayer(Player player) { Node* p = createNodeDoubly(player);

if (head == NULL) {

Trang 14

Đầu tiên tạo một con trỏ p trỏ tới head nếu p khác rỗng thì đuyệt qua toàn bộ

danh sách cho đến khi p NULL thi dừng Tiếp theo lưu thông tin của người chơi

(name,disks,moves,time,score) vao file txt Sau d6 di chuyén con trỏ p sang node tiép theo trong danh sach, điều này giúp duyệt qua từng node cho đến khi bằng NULL

p->data = q->data;

Trang 15

Quy trình sắp xếp: Đầu tiên gán một con trỏ p đến head, tạo một vòng lặp ngoải duyệt

qua từng node trong danh sách, từ head cho đến node gần cuối Vòng lặp dừng khi p là

nođe cuối cùng, vì ở node cuối không cần so sánh thêm Tiếp theo gán con trỏ q ngay sau p rồi thực hiện vòng lặp từ q cho đến phần tử cuối cùng của danh sách Điều này

giúp đảm bảo p luôn được so sánh với các phần tử đứng sau nó Tiếp đến là các điều

kiện so sánh: Nếu p có số đĩa ít hơn q hoặc nếu p có số đĩa bằng q thì ta xét đến điều kiện tiếp theo là số điểm Xong phần điều kiện thì ta hoán đổi bằng cách gán dữ liệu p cho bién tam (temp), sau do gan dit ligu cua q cho dit liéu p va cudi cing gan temp cho dir ligu cua q

2.3.7 Tim kiếm người chơi

Trang 16

Duyệt từ đầu danh sách So sánh tên người chơi cần tìm với từng người chơi trong

danh sách Nếu tìm thấy thì check bằng True

2.4 Đánh giá tính hiéu qua cua Doubly Linked List

Voi viéc su dung Doubly Linked List vao trong viéc quan ly danh sách người chơi là hop ly vi cau trúc nảy có thể thao tác thêm/xoá nhanh chóng và dễ dàng cập nhập, duy trì

danh sách Đồng thời cấu trúc này còn tôi ưu truy xuất khi tìm kiếm hay sắp xếp thông tin

người chơi Tóm lại việc áp dụng cấu trúc dữ liệu liên kết kép (Doubly Linked List) vào quản lý danh sách người chơi là một sự lựa chọn phủ hợp và lý tướng vì nó đáp ứng tốt các yêu cầu về lưu trữ và xử lý thông tin trong game đồng thời còn dễ dàng mở rộng và

phát triển thêm các tính năng mới

L{ THUYET THU 3: BUBBLE SORT

Ngày đăng: 07/01/2025, 16:17

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN