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

Lập trình game bằng ngôn ngữ lập trình c theo phương pháp hướng đối tượng

46 4 0

Đ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 đề Lập trình game bằng ngôn ngữ lập trình c theo phương pháp hướng đối tượng
Tác giả Nguyễn Thị Yến
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Lập trình game
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 46
Dung lượng 427,28 KB

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

Nội dung

Người đi trướcquân đen sẽ đánh đầu\n tiên vào tâm bàn cờ.\n- Nếu bên nào xếp được 5 quân theo \n đường thẳng, ngang, chéo \n-và không bị \nchặn ở 2 đầu thì bên đó dành thắng lợi"; tmChuC

Trang 1

LỜI MỞ ĐẦU

Đây là tài liệu dùng để biểu diễn cơ bản vấn đề “lập trình game

bằng ngôn ngữ lập trình C# theo phương pháp hướng đối tượng ” do sinh

viên Nguyễn Thị Yến thiết kế và lập trình Tài liệu này giúp ta có cái nhìn cơ

bản về ngôn ngữ lập trình hướng đối tượng nói chung và ngôn ngữ C# nóiriêng

Do thời gian có hạn nên đồ án đã không thể hoàn thành hết nhữngchức năng đã định như ban đầu đặt ra Tuy nhiên, những chức năng chưahoàn thiện sẽ sớm được bổ sung và hoàn thiện trong thời gian sớm nhất cóthể

Trong thời gian thực hiên, đồ án sẽ không tránh khỏi có những sai sót,mong quý thầy cô và các bạn thông cảm và có những góp ý quý báu nhằmhoàn thiện sản phẩm hơn

Xin chân thành cảm ơn!

Nguyễn Thị Yến

Trang 2

NỘI DUNG VẤN ĐỀ

Trong xu thế phát triển công nghệ thông tin như vũ bão hiện nay đặcbiệt là ngành công nghệ phần mềm thì ngày càng đòi hỏi trình độ cao trong kĩthuật lập trình Chính vì vậy mà ngôn ngữ lập trình hướng thủ tục cổ điển đãkhông thể đáp ứng nhu cầu của thời đại đặt ra Ngay khi đó, một phương pháplập trình mới được ra đời theo nguyên lí Alan-kay được ra đời nhằm giải

quyết nhu cầu bức thiết đó: “Phương pháp lập trình hướng đối tượng”

Đồ án này được thiết kế trên nền tảng ngôn ngữ lập trình hướng đốitượng C#, do Microsoft đề ra dựa trên mục đích tạo ra một ngôn ngữ lập trình

hướng đối tượng: đơn giản, hiện đại, ít từ khóa, mạnh mẽ và mềm dẻo,

hướng module và trở nên phổ biến hơn

Chính vì vậy nó sẽ tránh khỏi các vấn đề khi thiết kế bằng phươngpháp lập trình hướng thủ tục cổ điển:

 Mã chương trình dễ đọc, dễ hiểu, cô đọng

 Chương trình được tổ chức thành các class, được nối ghép với nhau

tạo thành một thể thống nhất

 Mỗi class lại bao gồm nhiều Method đảm nhận các vai trò khác nhau

trong chương trình

 chương trình có tính mềm dẻo cao

 có khả năng tái sử dụng tài nguyên

Trang 3

NỘI DUNG VẤN ĐỀ

I Project tittle: lập trình trò chơi cờ caro bằng phương pháp lập trình

hướng đối tượng

II Giới thiệu tổng quát: đây là một game mô tả trò chơi caro có thể chơi

online trên Internet hoặc offline trên máy tính của bạn Nó được lậptrình bằng ngôn ngữ C# theo phương pháp lập trình hướng đối tượng

III Các chức năng chính cần thiết:

1 Luật chơi cơ bản:

 Hai bên sẽ thay phiên nhau đánh cờ

 Người đi trước(quân đen) sẽ đánh đầu tiên vào tâm bàn cờ

 Nếu bên nào sếp được 5 quân theo đường thẳng, ngang, chéo vàkhông bị chặn ở 2 đầu thì bên đó dành thắng lợi

2 Bắt đầu:

a giải thích: để bắt đầu chơi thì bạn phải click mouse và nhấn vào

button Start , trò chơi sẽ chính thức được bắt đầu

3 Các chế độ chơi:

Trong trò chơi này thì có 2 chế độ chơi:

 Chơi với máy: Player vs Comp

 Chơi với bạn bè: Player vs Player

Nếu bạn muốn chơi ở chế độ nào thì click mouse vào button đó

IV Các bước kĩ thuật

1 Tạo giao diện cho trò chơi:

a Tạo 1 menu (menustrip): gồm các thư mục, bên trong các thư mụcchứa các thao tác

 File : new, open, save…

 Help: help, custom, about…

Trang 4

 Exit:

b Tạo 1 groupbox là 1 Container trong C# giúp hiển thị luật chơi trong

khi chơi, các button chọn chế độ chơi, chơi, thoát Thay đổi text,font, background, forecolor… của các groupbox, button theo tùy ý

Trang 5

2 phân tích thiết kế các lớp

a lớp ô cờ:

class O_Co {

const int chieudai;

const int chieurong;

int sohuu;

void Ve_oco(graphic g, int sohuu) }

giải thích:

Trang 6

 1 ô cờ sẽ có các thuộc tính chiều dài chiều rộng là các biến Const và

biến sở hữu Khi biến sở hữu bằng 1 thì ô cờ là của máy, biến sở hữu bằng 2 thì ô cờ là của người chơi

 Và method (phương thức) là Ve-oco sử dụng trong GDI+ của C#

b Lớp bàn cờ:

Class Ban_Co {

int sodong;

int socot;

Void Vebanco(graphic g, O_Co[][] mangoco)

Void Vequanco(graphic g, int dong, int cot,image img, o_co[][] mangoco[]) }

Trang 7

Vebanco ( được gọi từ lớp trên ),

XacDinhOCo ( với các biến tọa độ x,y ) choivoinguoi ( xử lý khi người chơi chọn chế

độ player vs player ),

choivoimay (xử lý khi người chơi chọn chế độ

chơi player vs comp )

XuLyThangThua (duyệt thắng thua khi chơi)

3 Lập trình xử lý đồ họa

a Tạo hiệu ứng

 Tạo nhãn Label: để hiện thị các chuỗi chữ trong trò chơi

private void Form1_Load (object sender, EventArgs e) {

lblchuoichu.Text = "-Hai bên sẽ thay phiên nhau đánh cờ Người đi trước(quân đen) sẽ đánh đầu\n tiên vào tâm bàn cờ.\n- Nếu bên nào xếp được 5 quân theo \n đường thẳng, ngang, chéo

\n-và không bị \nchặn ở 2 đầu thì bên đó dành thắng lợi";

tmChuChay.Enabled = true;

}

 Đối tượng Time: để tạo hiệu ứng chữ chạy trong trò chơi

Trang 8

private void tmChuChay_Tick(object sender, EventArgs e)

{

lblchuoichu.Location=newPoint(lblchuoichu.Location.X, lblchuoichu.Location.Y-1);

if (lblchuoichu.Location.Y + lblchuoichu.Height < 0) lblchuoichu.Location = new Point( lblchuoichu.Location.X, groupBox1.Height);

}

Giải thích:

 Qua sự kiện Tick thì qua 1 thời gian nhất định chuỗi chữ được

tạo sẽ nhảy từ tọa độ ban đầu sang 1 tọa độ mới (cụ thể ở đây: chuỗi chữ sẽ nhảy lên 1 dọc theo trục tọa độ Y)

 Cho tới khi chuỗi chữ đó chạy hết chiều dài của groupbox1 thì

lại bắt đầu chạy từ dưới lên

 Cứ liên tục lặp lại như thế

Trang 9

public const int _ChieuRong = 25;

public const int _ChieuCao = 25;

private int _Dong;

public int Dong

{

set {_ Dong = value; } get { return _Dong; } }

private int _Cot;

public int Cot

{

set { _Cot = value; } get { return _Cot; } }

private Point _ViTri;

public Point ViTri

{

set { _ViTri = value; } get { return _ViTri; } }

private int _SoHuu;

public int SoHuu

{

set {_SoHuu = value; } get { return _SoHuu; } }

Trang 10

}

Giải thích:

Trong lớp này ta khởi tạo lớp O-Co với các ô cờ có chiều rộng và

chiều dài là 25, và với các thuộc tính _Dong, _Cot, _ViTri, _SoHuu (ở đâythuộc tính sở hửu có thể hiểu rằng nếu là 1 thì là người chơi thứ 1 đi, nếu là 2thì là người chơi thứ 2 đi, nếu là 0 thì không thuộc sở hữu của bất kì ngườichơi nào)

Ta sử dụng các phương thức khởi tạo set, get để khởi tạo cho các thuộctính của lớp đó

 Lớp BanCo:

class Ban_Co {

private int_ SoDong;

private int _SoCot;

public int SoDong

Trang 11

g.DrawLine(GameCaro.pen, 0, j * O_Co.chieucao, _SoCot * O_Co.chieurong, j * O_Co.chieucao);

} }

}

Giải thích:

Trong lớp này ta cũng khởi tạo bàn cờ với các thuộc tính _Sodong,

_Socot và phương thức khởi tạo bàn cờ truyền tham số soDong, soCot

Đặc biệt, trong lớp Ban_Co này ta cần lưu ý tới các phương thứcVeBanCo và VeQuanCo

Phương thức VeBanCo sẽ được truyền đối tượng Graphics khi đó sẽgọi tới phương thức DrawLine của đối tượng đó đễ kẻ các đường thẳng dọc

và ngang từ tọa độ x tới tọa độ y nào đó

Trang 12

 Lớp GameCaro:

class GameCaro

{

public static Pen pen;

private Ban_Co _Banco;

Trang 13

Trong lớp này ta lập trình cho sự kiện paint của panel pnlBanCo bằng

cách gọi tới phương thức VeBanCo của lớp gameCaro

4 Lập trình xử lí trò chơi

Trang 14

int Cot = MouseX / O_Co._ChieuRong;

int Dong = MouseY / O_Co._ChieuCao;

if (_MangOCo[Dong, Cot].SoHuu != 0) return false;

Trang 15

}

Giải thích:

Tạo phương thức DanhCo để xác định tọa độ mà người chơi nhấn vào

và sau đó vẽ quân cờ bằng phương thức VeQuanCo thông qua phương thức

vẽ FillEllips của đối tượng Graphics

Ta xử lí lượt đi của các lượt người chơi:

 Nếu lượt đi là 1 tương ứng người thứ 1 chơi, quân cờ là cờ

màu xanh, và ngược lại nếu lượt đi là 2 thì lượt đi là lượt đi của người thứ 2, quân cờ sẽ lại quân cờ màu đỏ

 Nếu vị trí mà người chơi định đi đã được đánh thì trả về giái

trị là false (tức là không được đánh vào vị trị đó)

Và khi ta sẽ lưu lại các nước đã đi vào Stack bằng cách khởi tạolist_CacNuocDaDi và phương thức VeLaiQuanCo, trong đó C# hỗ trợphương thức List<>

public void StartPlayerVsPlayer(Graphics g)

{

_SanSang=true;

list_CacNuocDaDi= new List<O_Co>();

KhoiTaoMangOCo();

Trang 16

Ở trên ta lập trình cho chế độ chơi Player vs Player

Khi game cờ caro đã sẵn sang (tức _SanSang=true) thì tiến hành khởitạo lại danh sách các nước đã đi , khởi tạo mới lại mảng ô cờ và vẽ lại bàn cờ

}

}

Trang 17

Nếu cờ caro đang ở trạng thái sẵn sàng, và chơi ở chế độ 2(chơi với máytính) thì ta sẽ gọi tới phương thức khởi động máy tính để bắt đầu chơi và tiếnhành kiểm tra chiến thắng cho máy tính

Còn trong sự kiện click với menutooltrip PlayerVsPlayer thì khi bắt đầulại hoặc bắt đầu mới thì ta sẽ xóa màu các quân cờ, xóa các dòng kẻ chỉ để lạimàu nền của panel

Trang 18

Trong phương thức này cũng có các trường hợp mà không thể chiến thắng

TH1: quân cờ hiên tại đang ở dòng > (số dòng bàn cờ trừ đi5) khi đó

không thể đi để có 5 quân cờ liên tiếp cùng màu nhau được

TH2: người chơi có 5 quân cờ cùng màu nhau và liên tiếp nhau nhưng bị

chặn 2 đầu thì không thể thắng được

Trang 19

Tương tự như duyệt theo chiều dọc

private bool DuyetCheoXuoi(int currDong, int currCot, int currSoHuu) {

if (currDong > _Banco.SoDong - 5 || currCot> _Banco.SoCot-5) return false;

int Dem;

for (Dem = 1; Dem < 5; Dem++)

Trang 20

private bool DuyetCheoNguoc(int currDong, int currCot, int currSoHuu)

Trang 21

Tương tự với duyệt theo chéo xuôi

public void KetThucTroChoi()

Trang 22

_ketThuc = oco.SoHuu == 1 ? KETTHUC.Player1 : KETTHUC.Player2;

Trang 23

Giải thích: trong phương thức này ta sẽ xét các trường hợp để kết thúc

cờ:

TH1: nếu đi tất cả các ô trong bàn cờ mà chưa tìm được trên hàng

ngang, dọc, chéo ngược, chéo xuôi nào có 5 quân cờ liền nhau cùng màu nhauthì cờ hòa

TH2: xét tất cả các nước đã đi theo hàng ngang, hàng dọc, chéo

ngược, chéo xuôi có 5 quân cờ liền nhau cùng màu nhau, khi đó 5 quân cờ đóthuộc sở hữu của người chơi nào thì người đó thắng cuộc và kết thúc trò chơi

Khi người chơi 1 (bạn )thắng sẽ hiện ra message thông báo tương ứng

Khi người chơi 2 thắng hay máy thắng tức là bạn đã thua.

V Giới thiệu về trí tuệ nhân tạo cho máy trong trò chơi

1 Sơ lược về trí tuệ nhân tạo:

Trí tuệ nhân tạo hay trí thông minh nhân tạo( được viết tắt từ: ArtificialIntelligence hay Machine Intelligence, thường được viết tắt là AI ) là trí tuệđược biểu diễn bởi bất cứ một hệ thống nhân tạo nào đó

Trí tuệ nhân tạo được chia ra thành 2 trường hai tư duy: trường pháitruyền thống và trường phái trí tuệ tính toán

2 Trí tuệ nhân tạo trong trò chơi

Game cờ caro là 1 loại hình GameBoard, trong trò chơi luôn tồn tại haihướng đi song song: tấn công và phòng ngự

Các nước đi trong trò chơi luôn đòi hỏi phải đạt được trạng thái cuốicùng là giành chiến thắng hoặc đạt được thế cờ tốt nhất

 Cần tìm được hàm đánh giá nước cờ thứ I để đánh giá nước cờ có thế

cờ “tốt” nhất

3 Lập trình trí tuệ nhân tạo cho máy trong trò chơi

Trang 24

a Sơ đồ cấu trúc cây:

Tại điểm A, ta có các nước có thể đánh : B, C

Tính trước các nước có thể đi khác: D,E tương ứng với B; F,G,H tươngứng với nước C

Tiếp tục tính trước các nước I tương ứng với E, và các nước

M,N tương ứng với I nước J, K tương ứng với G, và L tương ứng với H

Có quá nhiều nước đi phải tính ???

Tương ứng với mỗi nước đi ta cần duyệt các hướng của mỗi

nước: lần lượt duyệt các hướng của nước đi đó và tìm ra nước đi

có lợi cho cả việc tấn công và phòng thủ

Dùng hai mảng để lưu trữ cả điểm tấn công và phòng thủ:

Trang 25

Tìm kiếm nước đi:

Trong cờ caro, sau mỗi nước cờ thì các đối thủ sẽ chọn các ô cờ còntrống để đi, do đó, sau mỗi ô trống thì số ô trống còn lại sẽ giảm Như vậyviệc tìm kiếm mỗi nước đi cho trạng thái có sẵn chỉ là việc tìm kiếm trênnhững ô trống còn lại, đồng thời, không gian tìm kiếm sẽ bị thu hẹp theo sốnước đã đi

Không gian chọn nước đi từ mỗi trạng thái ban đầu là hữu hạn, nhưngkhông gian tìm kiếm 1 nước đi dẫn đến chiến thắng là rất lớn Do đó ta khôngthể vét sạch không gian tìm kiếm nước đi này mà ta phải giới hạn không giantìm kiếm

Một không gian tìm kiếm có thể hiện theo 1 cây đa phân được gọi là mộtcây tìm kiếm hay một cây trò chơi

Dựa vào cây trò chơi ta đã định nghĩa ở trên thì ta có, viếc tìm kiêmnước đi là việc chọn 1 nút ở trên cây trò chơi (mức 1) sao cho nước đi đó làtốt nhất theo thông thường thì 1 nước đi được đánh giá là tốt hay không thìphục thuộc vào khả năng chiến thắng sau nước đi đó có cao hay không Do

đó, muốn chọn 1 nước đi tốt nhất thì chỉ dựa vào thế cờ hiện tại thì chưa đủ,phải căn cứ thêm vào những thông tin thế cờ sau khi chọn nước cờ đó

Chiến lược minimax để tìm kiếm nước đi trong cờ caro:

Ta chọn:

Max tương ứng với quân cờ màu xanh

Min tương ứng với quân cờ màu đỏ

Trạng thái kết thúc là 3 hàng ngang, dọc, chéo xuất hiện cùng 1 quân cờtức là nếu cùng xuất hiện quân màu xanh thì Max thắng, còn nếu cùng xuấthiện quân màu đỏ thì Min thắng còn nếu các quân cờ cùng được đi và cùng

Trang 26

xuất hiện thì điểm thắng của cờ màu xanh là -1, điểm thắng của quân cờ màu

đỏ là 1, và nếu hòa thì điểm là 0

Từ trạng thái bàn cờ hiện tại thì ta có thể phân tích các nước đi của trạngthái bàn cờ tiếp theo, nếu đên trạng thái bàn cờ tiếp theo ta tiến hành lượnggiá cây trò chơi bằng cách vét cạn các trạng thái tiếp theo cho tới trạng tháichiến thắng cuối cùng (note lá cuối cùng) thì ta có thể tính điểm note lá nhưsau :

Nếu ở trạng thái chiến thắng ta gặp đó là lượt đi của quân cờ màu xanhthì điểm của trạng thái đó là -1

Nếu ở trạng thái chiến thắng ta gặp đó là lượt đi của quân cờ màu đỏ thìđiểm trạng thái là 1

Nếu ở đó hòa nhau thì điểm trạng thái là 0

Sau đó tính ngược lại giá trị của cây trò chơi bằng cách:

Nếu nút đó thuộc lớp Max thì ta gán giá trị lớn nhất của các note con chonote đó

Nếu nút đó thuộc lớp Min thì ta lại gán gái trị nhỏ nhất trong các notecon cho note đó

Sau khi lượng giá hết cây trò chơi thì ta tiến hành chọn nước đi bằngcách:

Nếu lớp tiếp theo là lớp Max thì ta chọn nước đi có giá trị lớn nhất Nếu lớp tiếp theo là Min thì ta chọn nước đi có giá trị là nhỏ nhất

Ví dụ:

Trang 27

Ưu điểm: tìm được mọi nước đi tiếp theo sau đó chọn nước đi tốt nhất

do giải thuật có tính chất vét cạn nên không bỏ sót trạng thái nào

Nhược điểm: giải thuật tìm kiếm nước đi minimax còn vấp phải 1 vấn đề

bùng nổ(mức hàm mũ) các khả năng cần xét của các nước đi -> không phùhợp với các bài toán trò chơi thực tế Vì vậy, chúng ta phải tỉa đi(cắt bỏ-không xét đến) các nhánh của cây trò chơi

Phương pháp cắt tỉa (α-β) Alpha-beta pruning:

Nếu 1 nhánh nào đó không thể cải thiện các giá trị (hàm tiện ích) màchúng ta đang sẵn có thì chúng ta sẽ loại bỏ các nhánh đó đi

Việc cắt bỏ các nhánh tìm kiếm (tồi )đó đi thì sẽ không ảnh hưởng tớikết quả cuối cùng Khi đó, α là giá trị của nước đi tốt nhất đối với Max(giá trịtối đa) đối với nhánh tìm kiếm đó Nếu v là giá trị tồi hơn α thì Max sẽ bỏ quanước đi ứng với v-> cắt tỉa nhánh tìm kiếm v

Trang 28

Tương tự ta có β được định nghĩa tương tự với Min

Kĩ thuật lượng giá trong trò chơi:

Ở phần trên ta có nhắc tới việc tiến hành lượng giá cho cây trò chơi

Kĩ thuật lượng giá là một kĩ thuật quan trọng trong trò chơi Kĩ thuật này

sẽ giúp cho điểm trạng thái của bàn cờ để từ đó xây dựng cây trò chơi Việccây dựng hàm lượng giá hợp lý, chính xác sẽ giúp cho hệ thống có thể đánhgiá về trạng thái bàn cờ và có nước đi thông minh hơn để giành chiến thắng Đối với bài toán trò chơi cờ caro thì ta có thể sử dụng hàm lượng đánhgiá tính “tốt, xấu” của mỗi nước cờ tại 1 thời điểm những ô cờ nào ở gần ô cờ

đã được đánh trước đó thì sẽ có điểm cao hơn Nhưng ô càng xa thì càng được

ít điểm hơn Tuy nhiên đây chỉ là 1 Heuristic, ta phải có thêm các Heuristickhác nữa ví dụ như là ở vùng có 2,3,4 quân cờ liên tiếp thì sẽ được cộng 1 sốđiểm thưởng nào đó dựa vào trọng số các quân cờ(các vùng có trọng số càngcao thì càng được cộng nhiều điểm thưởng)

Sau mỗi nước đi thì hệ thống sẽ kiểm tra bàn cờ và tìm ra các thế cờ rồitùy vào độ lợi thế đã định sẵn trước để tính điểm

Ví dụ ta có các trường hợp để tính điểm như sau:

{0, 1, 1, 1, 1}, {1, 0, 1, 1, 1}, {1, 1, 0, 1, 1},8

* TH2: Trường hợp thuận lợi (+585 điểm){0, 0, 1, 1, 1, 0}, {0, 1, 0, 1, 1, 0}, {1, 0, 1, 0, 1, 0, 1}

{0, 1, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 1, 1},{0, 1, 1, 0, 1}, {0, 0, 1, 1, 1}, {1, 0, 1, 1, 0},{1, 0, 0, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 0, 1, 1},

Ngày đăng: 18/09/2023, 16:55

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

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

w