1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Đồ án Cấu trúc dữ liệu và thuật toán - Trò chơi NIM

25 2,3K 13
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

Định dạng
Số trang 25
Dung lượng 271 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Nó là cơ sở vững chắc để chúng ta giải quyết một số bàitoán, đồng thời cung cấp cho chúng ta hiểu biết về các giải thuật tác động lên dữliệu, cũng như cách tổ chức dữ liệu để giải quyết

Trang 1

Ngày nay, Công nghệ thông tin đã trở thành một ngành khoa học cực kỳ quan trọng trong cuộc sống hiện đại, đóng góp to lớn vào việc nâng cao nâng suất, hiệu quả công việc cho các ngành nghề khác Có thể nói, mọi ngành khoa học khác đềucần đến sự trợ giúp của máy vi tính Do đó, việc học tập và nghiên cứu về tin học cũng trở nên hết sức cần thiết và tất yếu đối với mọi người

Học kỳ vừa qua, chúng em dã được tiếp cận và tìm hiểu về môn Cấu trúc dữ liệu và thuật toán Đây là một môn học quan trọng đối với các sinh viên khoa

Công nghệ thông tin Nó là cơ sở vững chắc để chúng ta giải quyết một số bàitoán, đồng thời cung cấp cho chúng ta hiểu biết về các giải thuật tác động lên dữliệu, cũng như cách tổ chức dữ liệu để giải quyết các bài toán sao cho hiệu quả vàtối ưu

Trong học kỳ này, chúng em đã được giao thực hiện Đồ án Cấu trúc dữ liệu

và thuật toán để tìm hiểu sâu thêm về môn học này và ứng dụng vào các bài toán

cụ thể Và đề tài chúng em thực hiện là: “Trò chơi NIM”.

Trong quá trình thực hiện đồ án chắc chắn khó tránh khỏi các sai sót, vậy rấtmong sự đóng góp ý kiến của các thầy, cô giáo trong khoa Và chúng em xin chân

thành gửi lời cảm ơn chân thành đến các thầy, cô trong khoa, đặc biệt là thầy Lê Quý Lộc đã tận tình hướng dẫn, tạo điều kiện cho chúng em hoàn thành đề tài.

Chúng em xin chân thành cảm ơn !

Giảng viên hướng dẫn: Lê Quý Lộc

Sinh viên thực hiện : Nguyễn Phú Duy Cao Đình Hạ Long Lớp : 06T4

Trang 2

Article I Giới thiệu đề tài:

Đề 15:

Trò chơi NIM: Có n đống sỏi, mỗi đống có một số viên sỏi Hai người chơi

luân phiên nhau chơi như sau: Đến lượt người nào, người đó tùy chọn một đốngsỏi để bốc, và bốc ra một số viên sỏi (ít nhất 1 viên hoặc nhiều nhất là hết các viênsỏi trong đống đã chọn) Ai bốc cuối cùng là thua Lập chương trình tổ chức chơigiữa người và máy tính theo các yêu cầu:

a Số đống sỏi lúc đầu được nhập từ bàn phím

b Số lượng viên sỏi trong mỗi đống được sinh ngẫu nhiên

c Máy sẽ gieo xu để xác định người hay máy đi trước

d Có thông báo số lượng trong mỗi đống trước và sau mỗi lượt đi

e Thông báo kết quả cuối cùng

Article II Cấu trúc dữ liệu:

Với yêu cầu đề tài như trên, cấu trúc dữ liệu được sử dụng là Danh sách liênkết đơn như sau:

typedef stone_pile *list;

list root = NULL;

Trong đó có các trường:

- stone : kiểu số nguyên, để chỉ số sỏi có trong mỗi đống sỏi

- next : con trỏ kiểu stone_pile, để lưu địa chỉ của đống sỏi kế tiếp

- list : là kiểu con trỏ dùng để chỉ đến 1 phần tử kiểu stone_pile

- root : là con trỏ kiểu list chỉ đến đống sỏi đầu tiên

Trang 3

Article III Thuật toán cài đặt:

Trò chơi NIM là 1 trò chơi theo lượt giữa 2 đấu thủ,trong đó lượt đi đầu tiên được xác định bằng cách gieo đồng xu hoặc gieo xúc xắc Trò chơi gồm có 2 thể thức chơi:

1 Normal game: người bốc viên sỏi cuối cùng là người chiến thắng

2 Misère game: người bốc viên sỏi cuối cùng là người thua

( Source: http://en.wikipedia.org/wiki/Nim_Game )

Vì vậy, đề tài này sẽ được thực hiện theo thể thức Misère game Nhưng trước tiên chúng ta sẽ đề cập tới thể thức Normal game.

III.1 Thuật toán Normal game:

1 Một số nguyên tắc của thuật toán:

Nếu thế thắng chung cuộc có tính chất T thì ai gặp phải thế đó sẽ thua, do đó

ta phải tìm mọi cách "nhường " thế có tính chất T cho đối phương

Tính chất T nói trên được gọi là bất biến của trò chơi Khi chung cuộc mọi

đống sỏi đều hết cho nên S = 0

Giả sử ta có n đống sỏi Gọi ai là số sỏi trong đống thứ i; i=1…n

Ta lấy tổng loại trừ của các ai

S= a1  a2   an

Ta sẽ chứng minh rằng bất biến (tính chất T) của trò chơi NIM chính là S = 0

Ta sẽ sử dụng một số tính chất sau đây của phép XOR:

Tính chất 1: a  b = 0 khi và chỉ khi a = b (suy từ định nghĩa)

Tính chất 2: a  b = b  a (Tính giao hoán)

Tính chất 3: (a  b)  c = a  (b  c) (Tính kết hợp)

Tính chất 4: a  0 = a

Chú thích:  là kí hiệu phép XOR

Trang 4

Ta thừa nhận định lý sau:

Định lý: Nếu S<>0 thì tồn tại một ai thỏa mãn a i S < a i

Ta minh họa định lý trên qua ví dụ sau Giả sử n = 3 và

Vậy a3 chính là số tìm được theo định lý trên

Nhận xét: Nếu S = 0 và có ít nhất một đống sỏi với số sỏi khác 0 thì với mọi cách

đi ta luôn luôn có tổng loại trừ của các đống sỏi là một số khác 0.

Chứng minh nhận xét trên:

Thật vậy, không làm mất tính tổng quát ta giả sử rằng đống sỏi được chọn đểbốc là a1

Giả sử rằng sau khi bốc đống a1 ta còn lại b1 viên sỏi

Có thế coi việc bốc sỏi là thay đống a1 bằng b1, vì a1  a1= 0 nên tổng loạitrừ thu được sau khi bốc sẽ là:

Trang 5

2 Thuật toán Normal game:

Thủ tục NIM - Trò chơi NIM với m đống sỏi gồm các bước sau:

1 Kiểm tra giá trị hợp lệ của m

2 Khởi trị;

2a Sinh ngẫu nhiên các giá trị ai>=1, i=1 n

2b Gieo xu để xác định ai đi trước, người hay máy

3 Chơi theo sơ đồ sau:

4 Thông báo kết quả thắng - thua giữa người và máy

Trong đó thủ tục Maydi được triển khai theo sơ đồ đối thủ thông minh trình bàysau đây Nước đi của đối thủ thông minh khi đó sẽ bao gồm hai bước sau:

1 Tính S = a1  a2  a3   an

2 Nếu S <> 0: thực hiện các bước sau:

2a Duyệt các đống sỏi để tìm đống ai thỏa điều kiện (ai  S)< ai

2b Bốc ai - (ai  S) viên từ đống ai tìm được Số sỏi còn lại của đống này

sẽ là ( ai  S)

Nếu S = 0: chọn đống lớn để bốc 1 viên cốt làm cho đối phương khó pháthiện nguy cơ thua của ta

III.2 Thuật toán Misère game:

Trước khi nêu ra thuật toán chúng ta xét 1 ví dụ minh hoạ sau:

Giả sử có 3 đống sỏi với số sỏi lần lượt là 3, 4 và 5 viên sỏi Với thể thức

người bốc cuối cùng là thua (Misère game) thì chiến thuật để thắng là:

Trang 6

A B C Nim-sum

0 2 1 0112=310 Trong chiến thuật Normal game tôi sẽ lấy 1 viên từ đống B để

có 1 số chẵn các đống có 1 viên sỏi Nhưng trong chiến thuật

Misère game tôi sẽ lấy 2 viên từ đống B để có 1 số lẻ các đống có 1 viên sỏi

0 0 1 0012=110 Bạn lấy 1 viên từ đống C, và bạn thua

theo thuật toán Normal game

Until Trường hợp đặc biệt

2 Trường hợp đặc biệt: có 1 số đống sỏi chỉ có 1 viên và 1 đống có nhiều hơn 1 viên

2a Kiểm tra số đống sỏi hiện tại

Trang 7

Article IV Chương trình :

Chương trình được cài đặt bằng ngôn ngữ C, được biên dịch bằng trìnhbiên dịch Borland C 5.02

//Khai bao cac bien toan cuc

const int maxpile = 10; // so dong lon nhat co the tao ra

const int maxstone = 30; //so soi lon nhat trong 1 dong

const int khungcl = 10; //mau cua bang

const int socl = 14 ; //mau cua so

const int zerocl = 12; //mau cua so 0

int status; //luot di, =0->may di||A di, =1->nguoi di||B di

int piles_at_fisrt, piles_at_pre; //so dong ban dau va so dong hien tai

//Khai bao cau truc du lieu

struct stone_pile {

int stone; // stone = soi

stone_pile *next;

};

typedef stone_pile *list;

list root = NULL;

Trang 8

temp = new stone_pile; //tao dong dau tien

temp->stone = random(maxstone)+1; //de tranh tao ra dong co 0 vien soi

Trang 9

void display_table(list root)

gotoxy(x1, y); cprintf("%2d", i);

gotoxy(x2, y); cprintf("%2d", cur->stone);

Trang 10

scanf("%d",&k);

} while (k<=0 || k > piles_at_fisrt || check_stone(root, k)= =0);

for(i=1;i<k; i++) tmp = tmp->next;

int special_case(list root) //kiem tra truong hop dac biet

//neu dung tra ve vi tri dong co soi >1 ; neu sai tra ve 0

{

int i=0, i1=0; //bien dem so dong 1

int pos; // bien chi vi tri dong soi hien tai

Trang 11

if (i1= = (piles_at_pre-1)) return pos;

i=special_case(root); //vi tri cua dong co nhieu vien soi

for(int j=1; j< i; j++) tmp = tmp->next;

if(piles_at_pre%2) //neu so dong soi hien tai la le?

take = tmp->stone -1; // thi de lai 1 vien trong dong do

else //neu so dong hien tai la chan

take = tmp->stone; // thi boc het dong do

Trang 12

}take = tmp->stone - (tmp->stone ^ s);

Trang 13

write(" Xin cho may gieo xuc xac: ",2);

for(i=0; i<5; i++)

if (status) write(" (=.=) Ban duoc di truoc!!!",11);

else write(" (^_^) Computer di truoc!!!",14);

Trang 15

if (status) write(" B duoc di truoc",14);

else write(" A duoc di truoc",11);

if (status= =0) write("Luot cua A :",11);

else write("Luot cua B :",14);

if (status = =0) // nguoi A thang

write(" Congratulation! Player A win!!!",11);

else write(" Congratulation! Player B win!!!",14);

Trang 17

cprintf("\n1 One player"); printf("\n\t\t");

cprintf("\n2 Two players"); printf("\n\t\t");

cprintf("\n3 Guide"); printf("\n\t\t");

cprintf("\n0 Exit game"); printf("\n\t\t");

printf("\n\t Choose: "); scanf("%d",&k);

write("\n1 Misere mode ",11); printf("\n\t\t"); //11 = lightcyan

write("\n2 Normal mode ",11); printf("\n\t\t");

write("\n0 Back",11); printf("\n\t\t");

printf("\n\t Choose: "); scanf("%d",&t);

Trang 19

Article V Kết quả:

1 Màn hình chào:

2 Màn hình chọn:

Trang 20

3 Màn hình chọn thể thức:

4 Nhập số đống sỏi:

Trang 21

5 Đợi máy xác định ai được đi trước:

6 Bắt đầu chơi:

Trang 22

7 Lượt máy đi:

8 Kết thúc:

Trang 23

9 Hướng dẫn:

Trang 24

Nhận xét, đánh giá:

Section V.1 Ưu điểm:

- Chương trình chạy ổn định, tương đối nhanh, không mắc lỗi

- Chương trình có giao diện thân thiện với người dùng, gần với một trò chơihơn là một bài toán, nên người sử dụng sẽ có hứng thú với chương trình

Section V.2 Khuyết điểm:

- Bố cục của chương trình còn tương đối lộn xộn, hơi rườm rà

- Chưa xây dựng được giao diện người dùng sử dụng chuột trên màn hình ởchế độ đồ họa, chỉ mới thực hiện lệnh trên màn hình ở chế độ văn bản

LỜI KẾT:

Trong quá trình thực hiện đồ án, chúng em đã rút được nhiều kinh nghiệm

bổ ích cho chuyên ngành của mình, đặc biệt là kỹ năng làm việc theo nhóm Côngviệc chỉ được thực hiên tốt nhất khi có sự cố gắng của cả tập thể Ngoài ra, sau khithực hiện xong đồ án này thì kiến thức lập trình của chúng em cũng được củng cố

và bổ sung nhiều

Với khả năng còn hạn chế của mình, nên đồ án của chúng em chắc cònnhiều thiếu sót Rất mong được sự góp ý chân thành của quý thầy, cô Chúng emxin chân thành cảm ơn !

***  ***

Trang 25

MỤC LỤC

1

I Giới thiệu đề tài 2

II Cấu trúc dữ liệu 2

III Thuật toán cài đặt 3

III.1 Thuật toán Normal game 3

1 Một số nguyên tắc của thuật toán 3

2 Thuật toán Normal game 5

III.2 Thuật toán Misère game 5

IV Chương trình 7

V Kết quả 19

Nhận xét, đánh giá 24

1 Ưu điểm 24

2 Khuyết điểm 24

LỜI KẾT 24

MỤC LỤC 25

Ngày đăng: 17/03/2017, 20:20

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w