tìm hiểu về cách thức thiết kế nên một game và viết game “Bắn xe tăng” chạy trên Windows phone.CHƯƠNG 1 : WINDOWS PHONE 7, CÔNG NGHỆ SILVERLIGHT VÀ NỀN TẢNG XNA6CHƯƠNG 2 : GIỚI THIỆU BÀI TOÁN ỨNG DỤNG “GAME BẮN XE TĂNGCHƯƠNG 3 : THIẾT KẾ CHƯƠNG TRÌNH
MỞ ĐẦU Research2guidance dự đoán thị trường ứng dụng cho điện thoại di động có tốc độ tăng trưởng nhanh vòng vài năm tới Lợi nhuận tăng gấp lần sau năm, từ 1,95 tỉ USD năm 2009 lên 15,65 tỉ USD năm 2013 Ngồi việc dự đốn mức tăng trưởng lợi nhuận Research2guidance dự đốn số người dùng smartphone năm tới, yếu tố giúp thị trường ứng dụng cho di động tăng trưởng Theo đó, số người dùng smartphone tăng từ 100 triệu người năm 2009 lên tỉ người năm 2013 Điện thoại thông minh phát triển mạnh Việt Nam đánh giá thiên đường nhà phát triển ứng dụng di động Hệ điều hành Windows Phone hệ điều hành có nhiều thú vị với thị trường Việt Nam Thị trường Windows Phone phát triển rộng tiềm Các ứng dụng Windows Phone trọng phát triển mảnh đất màu mỡ cho nhà phát triển ứng dụng cho dòng Smartphone Có điều dễ dành nhận thấy Việt Nam “mỏ” cho thị trường game di động - với 11 triệu thuê bao điện thoại tốc độ tăng trưởng đạt mức cao Đây thực mảnh đất màu mỡ không cho nhà cung cấp game nói riêng mà cho nhà cung cấp dịch vụ nội dung nói chung Điểm đáng ghi nhận nhà cung cấp trò chơi cho điện thoại cố gắng thu hút khách hàng nhiều hình thức khác có việc cung cấp ngày nhiều trò có nội dung hấp dẫn với hình ảnh đẹp âm chất lượng cao Là sinh viên khoa cơng nghệ thơng tin,em mong tìm hiểu,tiếp thu ứng dụng kiến thức CNTT để vận dụng học tập công việc Với giúp đỡ nhiệt tình Hà Thị Thanh,em vận dụng kiến thức học để tìm hiểu cách thức thiết kế nên game viết game “Bắn xe tăng” chạy Windows phone Mặc dù có cố gắng, với tận tình giúp đỡ bảo cô Thanh, song thời gian lượng kiến thức có hạn, cộng với việc khả đọc dịch tài liệu tiếng anh chưa tốt nên em chưa nghiên cứu sâu Em mong nhận nhận xét góp ý với giúp đỡ thầy cô bạn để đồ án em hồn thiện LỜI CẢM ƠN Kính Thưa thầy cô môn Công nghệ phần mềm cô Hà Thị Thanh giáo viên hướng dẫn bạn học khóa Đầu tiên, em xin gửi lời cám ơn chân thành đến tồn thầy Khoa Công Nghệ Thông Tin,bộ môn CNPM Trong nhiều năm qua, thầy cô người thầy cô tận tâm ưu tú giảng dạy Thầy cô giúp em nhiều đường chinh phục miền tri thức vô tận Em xin cám ơn cô Hà Thị Thanh nhận trọng trách vất vả giáo viên hướng dẫn cho em suốt thời gian qua Thành em đạt qua đề án nhờ phần không nhỏ công sức cô Chúc cô nhiều sức khỏe thành công đường cao mà cô lựa chọn Một lần nữa, em xin cám ơn tất người, chúc người dồi sức khỏe Chúc cho khóa học kết thúc tốt đẹp Chúc cho Cơng nghệ thơng tin Việt Nam mau chóng sánh ngang cường quốc năm châu giới Thái Nguyên, tháng 06 năm 2014 LỜI CAM ĐOAN Em xin cam đoan : Những nội dung đồ án em thực hướng dẫn trực tiếp cô Hà Thị Thanh Mọi tham khảo dùng đồ án trích dẫn rõ ràng tên tác giả, tên cơng trình, thời gian, địa điểm công bố Mọi chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, em xin chịu hồn tồn trách nhiệm Sinh viên Ngơ Duy Khánh MỤC LỤC MỞ ĐẦU LỜI CẢM ƠN .2 LỜI CAM ĐOAN CHƯƠNG : WINDOWS PHONE 7, CÔNG NGHỆ SILVERLIGHT VÀ NỀN TẢNG XNA Windows Phone công nghệ Silverlight 1.1 Giới thiệu 1.2 Lịch sử phiên phát triển Windows Phone 1.3 Kiến trúc .10 1.4 Vòng đời phát triển ứng dụng Windows Phone 11 1.5 Giới thiệu công nghệ Silverlight 11 1.5.1 Tổng quan 11 1.5.2 Silverlight ? 12 2.Nền tảng XNA .12 2.1 Tổng quan XNA 12 2.1.1 XNA ? 12 2.1.2 Tại nên sử dụng XNA ? .12 2.2 Kiến trúc XNA 13 2.3 Các thành phần XNA .14 CHƯƠNG : GIỚI THIỆU BÀI TOÁN ỨNG DỤNG “GAME BẮN XE TĂNG” 17 2.1 Phát biểu toán 17 2.1.1 Khảo sát trạng 17 2.1.2 Xác định yêu cầu hệ thống : 18 2.1.3 Cốt truyện trò chơi 20 2.2 Mơ hình Usecase 21 2.2.1 Sơ đồ Use-case 21 2.2.2 Danh sách Actor 22 2.2.3 Danh sách Use-case 22 2.2.4 Đặc tả Use-case 23 CHƯƠNG : THIẾT KẾ CHƯƠNG TRÌNH .33 3.1 Hồ sơ phân tích 33 3.1.1 Sơ đồ lớp 33 3.1.2 Sơ đồ trạng thái: 37 3.2 Thiết kế liệu 39 3.2.1 Mô tả cấu trúc file dùng để lưu trữ 39 3.2.2 Ví dụ nội dung tập tin lưu trữ .39 3.3 Thiết kế kiến trúc .40 3.3.1 Kiến trúc hệ thống .40 3.3.2 Mô tả chi tiết thành phần 40 3.4 Thiết kế giao diện .42 3.4.1 Danh sách hình 42 3.4.2 Mơ tả chi tiết hình 43 3.5 Giới thiệu Thuật tốn tìm đường ngắn A* 47 3.6 Mô tả thư mục: 49 KẾT LUẬN 45 PHỤ LỤC 47 TÀI LIỆU THAM KHẢO 65 DANH MỤC HÌNH VẼ Hình 1.1 Kiến trúc Windows Phone Application Platform 10 Hình 1.2 Vòng đời phát triển ứng dụng Windows Phone 11 Hình 1.3 Cấu trúc XNA .13 Hình 1.4 Pipeline Content 14 Hình 1.5 Hệ trục tọa độ 2D 16 Hình 1.6 Hệ trục toa độ hệ thống 16 Hình 2.1.Hình ảnh đồ game vị trí xếp xe tăng .18 Hình 2.2 Sơ đồ Use case game XE TĂNG 21 Hình 2.4 Sơ đồ Use case “Phát sinh đồ” 24 Hình 2.5 Sơ đồ Use case “Phát sinh xe tăng địch” .25 Hình 2.6 Sơ đồ Use case “Xe tăng địch di chuyển” 26 Hình 2.7 Sơ đồ Use case “Xe tăng địch bắn đạn” .27 Hình 2.8 Sơ đồ Use case “Di chuyển xe tăng mình” 27 Hình 2.9 Sơ đồ Use case “Bắn đạn” 28 Hình 2.10 Sơ đồ Use case “Phá hủy chướng ngại vật” .29 Hình 2.11 Sơ đồ Use case “Bắn chết xe tăng địch” 30 Hình 2.12 Sơ đồ Use case “Xem hướng dẫn” .31 Hình 2.13 Sơ đồ Use case “Thiết lập tùy chọn” 31 Hình 3.1 Sơ đồ lớp game XE TĂNG 33 Hình 3.2 Sơ đồ trạng thái lớp BẢN ĐỒ .37 Hình 3.3 Sơ đồ trạng thái lớp VIÊN ĐẠN 37 Hình 3.4 Sơ đồ trạng thái lớp XE TĂNG 38 Hình 3.5 Sơ đồ trạng thái lớp VẬT PHẨM 38 Hình 3.6 Sơ đồ kiến trúc hệ thống 40 Hình 3.7 Sơ đồ class GUI 40 Hình 3.8 Sơ đồ class BUS 41 Hình 3.9 Sơ đồ class DTO 42 Hình 3.10 Giao diện menu 43 Hình 3.11 Giao diện chơi game 44 Hình 3.12 Giao diện Thơng tin 45 Hình 3.13 Giao diện Tùy Chọn 46 Hình 3.14 Cây thư mục ứng dụng 49 Hình 5.1 Hướng dẫn tạo Project 47 Hình 5.2 Chọn loại ứng dụng .47 Hình 5.3 Giao diện tạo xong Project 48 Hình 5.4 Mơ tả control Image 50 Hình 5.5 Mơ tả control Button 50 Hình 5.6 Miêu tả control TextBlock 51 Hình 5.7 Miêu tả control ProgressBar 51 Hình 5.8 Miêu tả control Slider 52 Hình 5.9 Giao diện ứng dụng .52 CHƯƠNG : WINDOWS PHONE 7, CÔNG NGHỆ SILVERLIGHT VÀ NỀN TẢNG XNA Windows Phone công nghệ Silverlight 1.1 Giới thiệu Windows Phone hệ dòng điện thoại chạy hệ điều hành Microsoft Windows Mobile Windows Phone phát triển dựa phần lõi Windows CE giống Zune HD, phiên trước lại dựa Windows CE Windows Phone bắt đầu mắt thức vào tháng 2/2010 triển lãm Mobile World Congress diễn Barcelona, Tây Ban Nha Đến tháng 10 năm, CEO Steve Ballmer Microsoft mắt 10 thiết bị Windows Phone đến từ HTC, Dell, Samsung, LG Vài tuần sau, máy bắt đầu bán Mỹ Châu Âu Tháng năm, Microsoft tuyên bố hợp tác với số nhà sản xuất khác Acer, Fujitsu ZTE Một cột mốc quan trọng Windows Phone hợp tác Microsoft với Nokia sau hãng điện thoại Phần Lan định khơng tập trung vào điện thoại Symbian Kết hợp tác dòng Nokia Lumia đời kiện Nokia World 2011 Đến CES 2012, Nokia tiếp tục mắt hai máy Lumia (mình đề cập phần sau) Việc tích hợp dịch vụ Microsoft (Bing, Bing Maps, Windows Phone Marketplace,…) lên thiết bị Nokia cho tạo nên lợi cạnh tranh cho Windows Phone với hai đối thủ lớn thời iOS Android Microsoft phát triển Windows Phone dựa hai công nghệ Silverlight XNA: Silverlight: sáng kiến phía client dựa Windows Presentation Foundation (WPF) tạo sức mạnh chưa có cho nhà phát triển website để tạo giao diện người dùng tinh vi với kết hợp control sẵn có, kí tự chất lượng cao, vector graphic, media, animation data binding chạy đa platform đa trình duyệt.WP7 mang sức mạnh Silverlight đến với thiết bị mobile XNA: game platform hỗ trợ thể loại game 2D 3D với kiến trúc game-loop truyền thống.Mặc dù XNA phục vụ chủ yếu cho việc phát triển game console Xbox360 XNA cho phép developer dùng để phát triển PC ZuneHD Tóm gọn lại Microsoft thiết kế Windows Phone với ba tiêu chí chính: Design: End Users Come First (Có thể hiểu trọng cách dễ dùng cho người dùng) PlaftForm: Fun and Easy to build complelting Apps and Games Hardware: Optermized and sandardized 1.2 Lịch sử phiên phát triển Windows Phone 7.0.7004: phiên Windows Phone 7.0.7008: nâng cấp cải thiện vài điểm 7.0.7390: cập nhật với tên mã NoDo, hỗ trợ mạng CDMA, copy paste, tốc độ chạy ứng dụng nhanh hơn, tích hợp Facebook sâu 7.0.7392: sửa lỗi liên quan đến chứng nhận bảo mật 7.0.7403: tiền nâng cấp để chuẩn bị bước sang đợt nâng cấp lên 7.10.7720: Windows Phone 7.5 với tên mã Mango, giới thiệu 2/2011 Các tính thêm vào Internet Explorer hỗ trợ đồ họa chuẩn web tốt hơn, Twitter tích hợp vào People Hub, chạy đa nhiệm cho ứng dụng bên thứ ba cách tạm ngừng chúng 7.10.7740: sửa lỗi Microsoft Exchange Server 2003 cảnh báo hộp thư thoại 7.10.8107: hỗ trợ kết nối LTE, sửa lỗi bàn phím bị biến nhiều vấn đề khác 7.10.8112: cho Lumia 900 HTC Titan II nhà mạng AT&T 7.10.8773: gọi Windows Phone 7.5 Refresh với tên mã Tango Nhiều tính xuất MMS tốt hơn, biểu tượng cho việc dò vị trí, xuất quản lí danh bạ vơ SIM, hỗ trợ điện thoại giá rẻ với 256MB RAM xung nhịp CPU chậm 7.10.8779: sửa lổi, cải thiện nâng cấp 1.3 Kiến trúc Windows Phone Application Platform kiến trúc tạo thành từ bốn thành phần chính: Hình 1.1 Kiến trúc Windows Phone Application Platform Runtimes (Runtimes): Silverlight khung XNA, với Windows tính điện thoại cụ thể, kết hợp để cung cấp môi trường trưởng thành việc xây dựng an toàn, ứng dụng đồ họa phong phú Tools (Công cụ): Visual Studio Expression Blend, công cụ tài liệu liên quan chúng, tạo trải nghiệm phát triển hoàn chỉnh để nhanh chóng tạo ứng dụng, gỡ lỗi, triển khai cập nhật ứng dụng Cloud (Dịch vụ điện tốn đám mây): Windows Azure, Xbox LIVE, thơng báo dịch vụ, dịch vụ định vị, với loạt dịch vụ web khác, cho phép nhà phát triển để chia sẻ liệu qua đám mây lợi ích người tiêu dùng cách cung cấp trải nghiệm liền mạch thiết bị điều họ sử dụng Kết nối với dịch vụ web bên thứ ba hỗ trợ đầy đủ Portal Services (Dịch vụ cổng thông tin): điện thoại Windows Marketplace cung cấp dịch vụ mạnh mẽ cho phép nhà phát triển đăng ký, xác nhận, thị trường ứng dụng họ 10 TextBlock: Là điều khiển cho phép hiển thị khối văn nhỏ thay đổi nội dung chúng Ví dụ: Hình 5.6 Miêu tả control ProgressBar: TextBlock Là điều khiển hiển thị thông số cho biết tiến độ tiến trình, thơng thường sử dụng chương trình thực thi cơng việc tiêu tốn nhiều thời gian thực Ví dụ: Hình 5.7 Miêu tả control ProgressBar Slider: Là điều khiển cho phép người dùng tương tác với cách kéo trượt để thay đổi giá trị Ví dụ: 51 Hình 5.8 Miêu tả control Slider Demo ứng dụng xây dựng theo mơ hình layer: Hình 5.9 Giao diện ứng dụng 52 Lớp CDTO.cs: namespace PhoneApp1 { publicclassCDTO { //tên sinh viên privatestring TenSV; publicstring TenSV1 { get { return TenSV; } set { TenSV = value; } } //mã số SV privatestring MSSV; publicstring MSSV1 { get { return MSSV; } set { MSSV = value; } } public CDTO() { TenSV = ""; MSSV = ""; } } } Lớp CDAO.cs: namespace PhoneApp1 { publicclassCDAO { CDTO thongtin=newCDTO(); //Hàm lưu thông tin publicvoid Luu(string ten,string mssv) { IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication(); IsolatedStorageFileStream stream = iso.CreateFile("thongtin"); StreamWriter writer = newStreamWriter(stream); writer.WriteLine(ten); writer.WriteLine(mssv); writer.Close(); } //Hàm đọc thông tin publicCDTO Doc() { CDTO docfile = newCDTO(); IsolatedStorageFile iso = IsolatedStorageFile.GetUserStoreForApplication(); if(iso.FileExists("thongtin")){ IsolatedStorageFileStream stream = iso.OpenFile("thongtin", FileMode.Open); StreamReader sw = newStreamReader(stream); docfile.TenSV1 = sw.ReadLine(); docfile.MSSV1 = sw.ReadLine(); sw.Close(); 53 } return docfile; } } } Lớp CBUS.cs: namespace PhoneApp1 { publicclassCBUS { CDTO thongtin=newCDTO(); // Hàm kiểm tra thông tin nhập vào có hợp lệ ko publicbool KiemTra(string mssv) { // kiểm tra mã số không lớn kí tự if (mssv.Length > 8) returnfalse; returntrue; } } } Lớp MainPage.xaml: Lớp MainPage.xaml.cs: namespace PhoneApp1 { publicpartialclassMainPage : PhoneApplicationPage { CBUS bus = newCBUS(); CDTO thongtin = newCDTO(); CDAO dao = newCDAO(); public MainPage() { InitializeComponent(); 54 } // Điều khiển nút lưu privatevoid luu_MouseEnter(object sender, MouseEventArgs e) { if (bus.KiemTra(MSSV.Text) == true) dao.Luu(TenSV.Text,MSSV.Text); else MessageBox.Show("Nhập thơng tin khơng xác"); } // Điều khiển nút nhập lại privatevoid nhaplai_MouseEnter(object sender, MouseEventArgs e) { TenSV.Text =""; MSSV.Text = ""; } // Điều khiển nút thoát privatevoid thoat_MouseEnter(object sender, MouseEventArgs e) { new Microsoft.Xna.Framework.Game().Exit(); } // Điều khiển nút load privatevoid load_MouseEnter(object sender, MouseEventArgs e) { thongtin = dao.Doc(); TenSV.Text = thongtin.TenSV1; MSSV.Text = thongtin.MSSV1; } } } Lớp MainWindow.xaml: 55 Lớp MainWindow.xaml.cs: namespace MapDesigner { /// /// Interaction logic for MainWindow.xaml /// publicpartialclassMainWindow : Window { int[,] Map; Image[,] Tile; string[] Resources; int mapTile, dong, cot; public MainWindow() { InitializeComponent(); Resources = newstring[7] { "", "Tiles/HoNuoc.png", "Tiles/GachDa.png", "Tiles/GachThuong.png", "Tiles/Co.png", "", "Tiles/GachNen.png" }; mapTile = 0; CompositionTarget.Rendering+=newEventHandler(UpDate); } void UpDate(object sender, EventArgs e) { if (Map != null) { int dongs = (int)Mouse.GetPosition(cvMap).Y / 25, cots = (int)Mouse.GetPosition(cvMap).X / 25; if (Mouse.LeftButton == MouseButtonState.Pressed) if (Mouse.DirectlyOver == cvMap) Map[dongs, cots] = mapTile; if (Mouse.RightButton == MouseButtonState.Pressed) if (Mouse.DirectlyOver == Tile[dongs, cots]) Map[dongs, cots] = 0; } try { if (rdHoNuoc.IsChecked.Value) mapTile = int.Parse(txtHoNuoc.Text); elseif (rdGachDa.IsChecked.Value) mapTile = int.Parse(txtGachDa.Text); elseif (rdGachThuong.IsChecked.Value) mapTile = int.Parse(txtGachThuong.Text); elseif (rdCo.IsChecked.Value) 56 mapTile = int.Parse(txtCo.Text); elseif (rdGachNen.IsChecked.Value) mapTile = int.Parse(txtGachNen.Text); } catch { } if (Map != null) for (int i = 0; i < dong; i++) for (int j = 0; j < cot; j++) { if (Map[i, j] == 0) Tile[i, j].Visibility = Visibility.Collapsed; else { Tile[i, j].Visibility = Visibility.Visible; Tile[i, j].Source = newBitmapImage(newUri(Resources[Map[i, j]], UriKind.RelativeOrAbsolute)); } } } privatevoid cmdBatDau_Click(object sender, RoutedEventArgs e) { try { dong = int.Parse(txtHeight.Text); cot = int.Parse(txtWidth.Text); Map = newint[dong, cot]; Tile = newImage[dong, cot]; for (int i = 0; i < dong; i++) for (int j = 0; j < cot; j++) { Map[i, j] = 0; Tile[i, j] = newImage(); Tile[i, j].Width = 25; Tile[i, j].Height = 25; cvMap.Children.Add(Tile[i, j]); Canvas.SetLeft(Tile[i, j], j * 25); Canvas.SetTop(Tile[i, j], i * 25); Tile[i, j].Visibility = Visibility.Collapsed; } cvMap.Width = cot * 25; cvMap.Height = dong * 25; } catch (Exception Ex) { MessageBox.Show(Ex.Message); } } privatevoid cmdCancel_Click(object sender, RoutedEventArgs e) { Close(); } privatevoid cmdClear_Click(object sender, RoutedEventArgs e) { for (int i = 0; i < dong; i++) for (int j = 0; j < cot; j++) Map[i, j] = 0; } privatevoid cmdSave_Click(object sender, RoutedEventArgs e) 57 { if (Map != null) { Save saveDialog = newSave(); saveDialog.ShowDialog(); } else MessageBox.Show("Map khong co gi, khong the luu!"); } privatevoid Window_Activated(object sender, EventArgs e) { if (Global.Luu && !string.IsNullOrEmpty(Global.FileName) && ! string.IsNullOrWhiteSpace(Global.FileName)) { string fileLoc = Global.FileName + ".txt"; if (!File.Exists(fileLoc)) using (FileStream fs = File.Create(fileLoc)) { fs.Close(); using (StreamWriter sw = newStreamWriter(fileLoc)) { for (int i = 0; i < dong; i++) { for (int j = 0; j < cot; j++) sw.Write(Map[i, j].ToString()); sw.WriteLine(); } sw.Close(); } } else using (StreamWriter sw = newStreamWriter(fileLoc)) { for (int i = 0; i < dong; i++) { for (int j = 0; j < cot; j++) sw.Write(Map[i, j].ToString()); sw.WriteLine(); } sw.Close(); } Global.FileName = string.Empty; Global.Luu = false; MessageBox.Show("Luu cong!"); } } } } 58 Ứng dụng thuật toán A* vào “Game bắn xe tăng”: Lớp CInfoNode.cs : namespace SiXnaBanXeTank.DTO { /// /// Lớp node (Nút), sử dụng danh sách liên kết /// publicclassCInfoNode { /// /// Khoảng cách từ đỉnh xét đến đỉnh bắt đầu /// publicfloat G { get; set; } /// /// Khoảng cách từ đỉnh xét đến đỉnh kết thúc /// publicfloat H { get; set; } /// /// Tổng G với H /// publicfloat F { get; set; } /// /// Tọa độ đỉnh xét /// publicVector2 ViTri { get; set; } /// /// Nút chứa thông tin đỉnh cha /// publicCInfoNode DinhCha { get; set; } /// /// Nút chứa thông tin đỉnh /// publicCInfoNode DinhTiepTheo { get; set; } /// /// Phương thức khởi tạo /// public CInfoNode() { this.G = this.H = this.F = 0; this.ViTri = Vector2.Zero; this.DinhCha = null; this.DinhTiepTheo = null; } /// /// Phương thức khởi tạo /// ///Tọa độ đỉnh xét public CInfoNode(Vector2 viTri) { this.G = this.H = this.F = 0; this.ViTri = viTri; this.DinhCha = null; this.DinhTiepTheo = null; } /// /// Phương thức khởi tạo /// ///Tọa độ đỉnh xét 59 ///Nút chứa thông tin đỉnh cha public CInfoNode(Vector2 viTri, CInfoNode dinhCha) { this.G = this.H = this.F = 0; this.ViTri = viTri; this.DinhCha = dinhCha; this.DinhTiepTheo = null; } } } Lớp CBusAstar.cs : namespace SiXnaBanXeTank.BUS { /// /// Thuật tốn tìm đường ngắn nhất: A* /// publicclassCBusAstar { CBusList _listChuaDuyet, //Danh sách đỉnh chưa duyệt _listDaDuyet; //Danh sách đỉnh duyệt Vector2[] _viTriDinhKe; //Mảng đỉnh kề với đỉnh xét int _phe; //0: xe tank ta, 1: xe tank địch /// /// Phương thức khởi tạo /// public CBusAstar(int phe) { _listChuaDuyet = newCBusList(); _listDaDuyet = newCBusList(); _viTriDinhKe = newVector2[4] { newVector2(-1f, 0f), //Đỉnh kề bên trái đỉnh xét newVector2(0f, -1f), //Đỉnh kề bên đỉnh xét newVector2(1f, 0f), //Đỉnh kề bên phải đỉnh xét newVector2(0f, 1f) //Đỉnh kề bên đỉnh xét }; _phe = phe; } /// /// Phương thức tính khoảng cách đỉnh (tính theo chu vi hình chữ nhật) /// ///Tọa độ đỉnh xét (tính theo dòng/cột) ///Tọa độ đỉnh đích (tính theo dòng/cột) ///Khoảng cách đỉnh. float KhoangCach(Vector2 dinhDangXet, Vector2 dinhDich) { returnMath.Abs(dinhDangXet.X - dinhDich.X) + Math.Abs(dinhDangXet.Y - dinhDich.Y) - 1; } /// /// Phương thức kiểm tra tra tọa độ đỉnh xét có nằm phạm vi đồ hay không /// ///Tọa độ đỉnh xét ///True (Hợp lệ), false (Không hợp lệ) bool viTriHopLe(Vector2 viTri) { return (viTri.X * CInfoBanDo.RongTile) >= && 60 ((viTri.X + 1) * CInfoBanDo.RongTile) = && ((viTri.Y + 1) * CInfoBanDo.CaoTile) node.F) cnode = node; } } /// /// Phương thức trả đường ngắn /// ///Danh sách đỉnh duyệt ///Danh sách đỉnh duyệt List DuongDi(CBusList list) { List _duongDi = newList(); CInfoNode nodeHienTai = list.Tail; //Duyệt ngược danh sách chứa đỉnh duyệt thêm vào danh sách đỉnh (Đi từ điểm bắt đầu đến đỉnh kết thúc) - Đường while (nodeHienTai != null) { _duongDi.Add(nodeHienTai.ViTri); nodeHienTai = nodeHienTai.DinhCha; } return _duongDi; } /// 62 /// Phương thức tìm đường ngắn với thuật toán A* /// ///Đỉnh bắt đầu ///Đỉnh kết thúc ///Danh sách đỉnh duyệt (Đường ngắn nhất). publicList AStar(Vector2 dinhBatDau, Vector2 dinhKetThuc) { CInfoNode nodeBatDau = newCInfoNode(dinhBatDau), //Khai báo khởi tạo nút chứa đỉnh bắt đầu nodeKetThuc = newCInfoNode(dinhKetThuc); //Khai báo khởi tạo nút chứa đỉnh kết thúc CInfoNode diemDangXet; //Nút chứa đỉnh xét CInfoNode[] cacDinhKe; xét //Mảng đỉnh kề với đỉnh Vector2 diemDung = dinhBatDau; thúc trình tìm đường kết thúc //Nếu điểm dừng = điểm kết _listChuaDuyet = newCBusList(); //Khởi tạo danh sách đỉnh chưa duyệt _listDaDuyet = newCBusList(); //Khởi tạo danh sách đỉnh duyệt //Làm danh sách đỉnh chưa duyệt danh sách đỉnh duyệt if (_listChuaDuyet.Head != null || _listDaDuyet.Head != null) { _listChuaDuyet.Clear(); _listDaDuyet.Clear(); } //Nếu đỉnh đầu đỉnh cuối khơng tìm đường trả danh sách rỗng if (dinhBatDau == dinhKetThuc) returnnewList(); //Thêm đỉnh bắt đầu vào danh sách đỉnh chưa duyệt _listChuaDuyet.ThemCuoi(nodeBatDau); //Nếu điểm dừng chưa phải điểm kết thúc tiếp tục tìm đường while (diemDung != dinhKetThuc) { //Nếu danh sách đỉnh chưa duyệt rỗng (Nghĩa tất đỉnh tìm được duyệt if (_listChuaDuyet.Head == null) break; //Tìm đỉnh có giá trị F nhỏ diemDangXet = NodeMin(_listChuaDuyet); //Cập nhật lại điểm dừng = điểm xét diemDung = diemDangXet.ViTri; //Lấy điểm xét khỏi danh sách đỉnh chưa duyệt _listChuaDuyet.Remove(diemDangXet); //Thêm điểm xét vào danh sách đỉnh duyệt _listDaDuyet.ThemCuoi(diemDangXet); //Lấy thông tin đỉnh kề với đỉnh xét cacDinhKe = DinhKe(diemDangXet, nodeBatDau, nodeKetThuc); //Thêm đỉnh kề với đỉnh xét vào danh sách đỉnh chưa duyệt for (int i = 0; i < cacDinhKe.Length; i++) if (cacDinhKe[i] != null) if (!TonTai(cacDinhKe[i], _listDaDuyet)) if (!TonTai(cacDinhKe[i], _listChuaDuyet)) _listChuaDuyet.ThemCuoi(cacDinhKe[i]); //Nếu đỉnh kề chưa có danh sách đỉnh chưa duyệt thêm vào danh sách else 63 CapNhatList(cacDinhKe[i], _listChuaDuyet); //Nếu đỉnh kề có danh sách đỉnh chưa duyệt bỏ qua đỉnh kề tìm đỉnh kề có F nhỏ đỉnh lại } //Nếu khơng tìm đường trả danh sách rỗng if (_listChuaDuyet.Head == null) returnnewList(); //Trả danh sách đỉnh duyệt (Đường ngắn nhất) return DuongDi(_listDaDuyet); } } } 64 TÀI LIỆU THAM KHẢO Tiếng Việt: CHARLES PETZOLD , “Programming Windows Phone 7”, Microsoft Press, 2010 DOMINIC BETTS, “Windows Phone Developer Guide”, Microsoft, 2010 ALEXANDRE SANTOS, “Beginning XNA 3.0 Game Programming”, APRESS, 2009 Website : Trang web chia sẻ tài liệu SCRIBD (URL: www.scribd.com/doc/76241394/TIM-HI%E1%BB%82U-CONG-NGH%E1%BB%86SILVERLIGHT) Trang web tin tức Tinh Tế (URL: www.tinhte.vn/threads/498852/) Trang web tin tức Thông Tin Công Nghệ (URL: http://www.thongtincongnghe.com/article/17257) Trang web tin tức VNREVIEW (URL: vnreview.vn/tin-tuc-kinhdoanh/-/view_content/content/79143/tong-quan-windows-phone-i) Trang web MSDN Microsoft (URL: msdn.microsoft.com/enus/library/ff402531%28v=VS.92%29.aspx) ... chóng sánh ngang cường quốc năm châu giới Thái Nguyên, tháng 06 năm 2014 LỜI CAM ĐOAN Em xin cam đoan : Những nội dung đồ án em thực hướng dẫn trực tiếp cô Hà Thị Thanh Mọi tham khảo dùng đồ án trích... 16 Hình 2.1.Hình ảnh đồ game vị trí xếp xe tăng .18 Hình 2.2 Sơ đồ Use case game XE TĂNG 21 Hình 2.4 Sơ đồ Use case “Phát sinh đồ 24 Hình 2.5 Sơ đồ Use case “Phát sinh xe... chọn” 31 Hình 3.1 Sơ đồ lớp game XE TĂNG 33 Hình 3.2 Sơ đồ trạng thái lớp BẢN ĐỒ .37 Hình 3.3 Sơ đồ trạng thái lớp VIÊN ĐẠN 37 Hình 3.4 Sơ đồ trạng thái lớp XE TĂNG