Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN

Lượt xem 431
56
Tải xuống
(Lịch sử tải xuống)
Số trang: 31 | Loại file: DOC
0

Gửi bình luận

Bình luận

Thông tin tài liệu

Ngày đăng: 22/11/2012, 08:49

Mô tả: Tài liệu tham khảo chuyên ngành tin học Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN LỜI NÓI ĐẦUCùng với sự phát triển nhanh chóng của Internet, Game Online hiện nay đang cũng đang rất thịnh hành và trở thành một phần không thể thiếu của nhiều tầng lớp trong xã hội. Tất nhiên, xét trên một phương diện nào đó có thể nhận thấy nhiều mặt tiêu cực của Game Online nhưng có thể nhận thấy rõ ràng rằng để lập trình được một Game Online, ngoài việc lập trình viên phải có những kiến thức về đồ họa, về thuật toán … thì một phần không thể thiếu đó là kiến thức về mạng và việc truyền thông tin trên mạng. Vì vậy, nếu coi Game Online là công cụ để lập trình viên tìm hiểu và thực hành những kiến thức về mạng thì đây thực sự là một công cụ hữu hiệu.Sau thời gian học tập và nghiên cứu về môn học Mạng và Truyền số liệu, chúng tôi nhận đã quyết định phải viết một ứng dụng nhỏ để áp dụng những gì đã biết về môn học vào thực tiễn.Ứng dụng được cả nhóm lựa chọn là Viết game “Đánh bài tiến lên” dựa trên Socket giới hạn trong mạng LAN.Lý do lựa chọn ứng dụng này:• Thứ nhất, đây là một trò chơi đơn giản, dễ chơi, thuật toán dễ xây dựng nên phù hợp với khoảng thời gian ngắn được cho phép để hoàn thành trò chơi này. Hơn nữa, đây là ứng dụng để thực hành về Mạng và Truyền số liệu nên không cần thiết phải chú trọng vào thuật toán game.• Thứ hai, với trò chơi này đòi hỏi nhiều người chơi nên có thể thực hành được việc xây dựng các Room, việc chat giữa hai hoặc nhiều người với nhau, việc truyền thông điệp point - point hay MultiCast …• Thứ ba: Ứng dụng được viết trên mạng LAN do hạn chế về cơ sở hạ tầng và thời gian.Thực hiện: Sử dụng ngôn ngữ lập trình Visual C# dựa trên nền tảng DotNetFX 1.1Nhóm chúng tôi gồm có 5 người:1. Phan Anh Dũng2. Thân Quốc Lâm3. Nguyễn Hồng Phương4. Ngô Đức Thuận5. Nguyễn Thành TrungĐều là sinh viên lớp CNTT – KSTN – K48.Do thời gian thực hiện ứng dụng rất ngắn nên chương chưa có nhiều thời gian kiểm thử, chắc chắn còn tiềm ẩn nhiều lỗi. Chúng tôi sẽ cố gắng hoàn thiện thêm trong thời gian sắp tới.Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN 1MỤC LỤCLỜI NÓI ĐẦU . 1 Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN . 1 MỤC LỤC 2 1. Giới thiệu về trò chơi “Đánh bài tiến lên” . 3 1.1 Giới thiệu trò chơi . 3 1.2 Luật chơi 3 2. Tìm hiểu về Socket 4 2.1 Connection - Oriented Sockets. 4 A simple TCP Server 4 2.2 Sử dụng C# Streams với TCP . 8 3. Using The C# Sockets Helper Classes: 10 2.3 Socket không đồng bộ . 11 2.3.1 Windows Event Programming: 11 2.3.2 Sử dụng Events và Delegates: 11 2.3.3 The AsyncCallback Class: 12 2.3.4 Sử dụng Thread: . 14 3. Xây dựng chương trình 16 3.1 Thiết kế chương trình 16 3.1.1 Module Socket và quản lý phòng chơi 16 3.1.2 Module thực hiện và kiểm soát luật chơi . 20 3.1.3 Kết hợp giữa hai module 22 3.2 Thực hiện chương trình . 25 4. Sử dụng chương trình . 26 5. Kết luận và hướng phát triển . 30 5.1 Nhận xét . 30 Ưu điểm . 30 Nhược điểm . 30 5.2 Hướng phát triển . 30 Tài liệu tham khảo . 31 21. Giới thiệu về trò chơi “Đánh bài tiến lên”1.1 Giới thiệu trò chơiTrò chơi đánh bài tiến lên là một trò chơi bài đơn giản, dễ chơi. Trò chơi được thực hiện trên bộ bài 52 quân bài. Các quân bài có tên là A (át), 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, lần lượt với mỗi tên quân bài có 4 chất: rô, cơ, bích, nhép. Trong trò chơi đánh bài tiến lên thứ tự xếp hạng của các quân bài là: 3<4<5<6<7<8<9<10<J<Q<K<A<2. Trên bộ bài 52 quân các quân bài có chất rô hoặc cơ có màu đỏ, còn các quân bài có chất bích và nhép có màu đen.Mục tiêu là ai đánh được tất cả các quân bài trên tay xuống trước là người thắng cuộc.1.2 Luật chơiĐầu tiên, bộ bài 52 quân sẽ lần lượt được chia đều cho mỗi người chơi. Người chơi có quân bài 3 bích sẽ được bắt đầu lượt đánh bài đầu tiên và quân bài được đánh phải là quân bài 3 bích hoặc một bộ ghép có chứa 3 bích. Trong các lượt chơi tiếp theo, người chơi có thể bắt đầu với một quân bài hoặc một bộ ghép các quân bài. Một bộ ghép các quân bài có thể là một đôi (2 quân bài cùng giá trị, và cùng màu, ví dụ đôi 7 đỏ (gồm 7 rô và 7 cơ), đôi 8 đen (gồm 8 nhép và 8 bích), một bộ 3 (3 quân bài có cùng giá trị gồm một bộ đôi, và một quân khác màu), một bộ tứ (4 quân bài có cùng giá trị), một bộ dọc gồm từ 3 quân bài trở lên có cùng chất, và có giá trị liên tiếp nhau (ví dụ 3, 4, 5 nhép).Tại mỗi lượt đánh bài, quyền đánh bài sẽ lần lượt được trao cho người tiếp theo theo vòng tròn (cùng chiều kim đồng hồ). Khi đến lượt đánh bài, người chơi có thể chọn một hoặc một số quân bài trên tay để đánh chặn quân bài của người chơi vừa đánh xuống hoặc là bỏ qua (người chơi sẽ mất quyền đánh bài trong lượt chơi này). Để đánh chặn được các quân bài vừa đánh xuống, người chơi phải chọn các quân bài thỏa mãn các yêu cầu sau: Nếu trước đó chỉ có một quân bài được đánh xuống, người chơi phải chọn quân bài cùng chất với quân bài đó và có giá trị lớn hơn, hoặc chọn một quân 2 bất kỳ để đánh chặn. Nếu trước đó là một bộ đôi, người chơi phải chọn một bộ đôi cùng màu (đỏ hoặc đen) và có giá trị lớn hơn, hoặc chọn 2 quân 2 bất kỳ để đánh chặn. Nếu trước đó là một bộ 3, người chơi phải chọn một bộ 3 có một bộ đôi cùng màu, một quân khác màu có cùng chất với bộ 3 được đánh trước đó và phải có giá trị lớn hơn để đánh chặn. Nếu trước đó la một bộ tứ, người chơi phải chọn một bộ tứ có giá trị lớn hơn.3 Nếu trước đó là một bộ dọc, người chơi phải chọn một bộ dọc có cùng chất, có giá trị lớn hơn và có số quân bài bằng số quân bài của bộ dọc trước đó.Người chơi đánh quân bài cuối cùng trong lượt chơi sẽ được quyền bắt đầu lượt chơi tiếp theo. Trừ lượt đánh đầu tiên (quân bài được đánh phải là quân bài 3 bích hoặc một bộ ghép có chứa 3 bích), trong các lượt chơi tiếp theo người chơi có thể bắt đầu với bất kỳ lá bài nào trên tay.Người chơi đầu tiên đánh hết các quân bài đầu tiên sẽ xếp thứ nhất. Hai người chơi đánh đánh hết các quân bài đầu tiên tiếp theo sẽ lần lượt xếp thứ 2 và thứ 3. Người chơi không đánh hết các quân bài là người xếp cuối cùng.2. Tìm hiểu về Socket2.1 Connection - Oriented Sockets. A simple TCP ServerChúng ta phải thực hiện 4 nhiệm vụ trước khi sever có thể truyền dữ liệu với kết nối với client: Tạo 1 socket Kết nối socket tới 1 IPEndPoint cục bộ Đặt socket trong trạng thái lắng nghe (Listen) Chấp nhận kết nối đến socket.Tạo ra Sever:Bước đầu tiên để xây dựng 1 TCP Sever là tạo ra một thể hiện của đối tượng Socket. Các chức năng cần thiết khác cho các thao tác của Sever là việc sử dụng các phương thức của đối tượng Socket.4 nhiệm vụ đó được thực hiện như sau:IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);Socket newsock = Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);newsock.Bind(ipep);newsock.Listen(10);Socket client = newsock.Accept();Đối tượng Socket được tạo bởi phương thức Accept() được sử dụng để truyền dữ liệu theo cả 2 hướng giữa Sever và Remote Client.4Các bước cơ bản được thể hiện trong ví dụ sau:SimpleTcpSrvr.cs using System;using System.Net;using System.Net.Sockets;using System.Text;class SimpleTcpSrvr{ public static void Main() { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050); Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep); newsock.Listen(10); Console.WriteLine("Waiting for a client ."); Socket client = newsock.Accept(); IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint; Console.WriteLine("Connected with {0} at port {1}", clientep.Address, clientep.Port); string welcome = "Welcome to my test server"; data = Encoding.ASCII.GetBytes(welcome); client.Send(data, data.Length, SocketFlags.None); while(true) { data = new byte[1024]; recv = client.Receive(data); if (recv == 0) break; Console.WriteLine( Encoding.ASCII.GetString(data, 0, recv)); client.Send(data, recv, SocketFlags.None); } Console.WriteLine("Disconnected from {0}", clientep.Address); client.Close(); newsock.Close(); }}5Phương thức Receive() và Send() chỉ làm việc với dãy byte. Tất cả dữ liệu được truyền Socket đều phải được chuyển đổi sang chuỗi byte. Trong ví dụ trên ta sử dụng xâu văn bản, phương thức Encoding.ASCII được dùng để chuyển đổi các xâu sang các chuỗi byte và ngược lại.Một đối tượng IPEndPoint được định nghĩa cho Local Sever: IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);Bằng cách sử dụng trường IPAddress.Any, thì Sever sẽ chấp nhận tất cả các yêu cầu kết nối trên tất cả các mạng mà có thể được cấu hình trên hệ thống. Nếu ta muốn chỉ chấp nhận đối với 1 gói các Interface riêng biệt, ta có thể sử dụng địa chỉ IP. IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.6"), 9050);Sau khi xác địn đối tượng IPEndPoint thích hợp, khởi tạo Socket() được gọi để tạo TCP socket. Phương thức Bind() và Listen() được sử dụng để kết nối socket đến đối tưưọng IPEndPoint mới và lắng nghe các kết nối tới.Cuối cùng, phương thức Accept() được sử dụng để chấp nhận các kết nối đến từ client. Phương thức Accept() trả về một đối tượng Socket mới, đối tượng này sẽ được sử dụng trong tấy cả các giao tiếp với client.Sau khi phương thức Accept() chấp nhận kết nối, thông tin địa chỉ IP của client yêu cầu có thể lấy được nhờ thuộc tính RemotEndPoint: IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;Một khi IPEndPoint được tạo ra sử dụng thông tin client từ xa, bạn có thể truy cập nó và sử dụng các thuộc tính Address và Port (địa chỉ và cổng). Đây là kỹ thuật sử dụng cho việc định danh cho các client riêng biệt mà kết nối đến server.Sau khi socket được thiết lập với client, sự kết hợp client/sever đồng bộ truyền dữ liệu. Nếu cả 2 server và client cùng cố gắng nhận dữ liệu cùng 1 luc, hoặc cùng gửi dữ liệu trong cùng 1 thời điển gây ra hiện tượng deadlock. Ví dụ thông điệp Welcom gửi cho client, và sau đó chờ thông điệp từ client: string welcome = "Welcome to my test server"; data = Encoding.ASCII.GetBytes(welcome); client.Send(data, data.Length, SocketFlags.None); while(true) { data = new byte[1024]; recv = client.Receive(data); if (recv == 0) break; 6 Console.WriteLine( Encoding.ASCII.GetString(data, 0, recv)); client.Send(data, recv, SocketFlags.None); }Client muốn giao tiếp với sever phải chuận bị nhận thông điệp ngay khi mà kết nối được tạo ra. Sauk hi nhận dữ liệu, client phải luôn phiên giữa việc gửi và nhận dữ liệu.Phưong thức Receive() thay thế dữ liệu trong buffer dữ liệu, kích thước của vùng dữ liệu đệm được đặt trước. Nếu vùng đệm không được xác lập lại giá trị gốc, thì lần gọi Receive() tiếp theo, vùng đệm chỉ chứa được dữ liệu tối đa bằng lần gọi trước. 72.2 Sử dụng C# Streams với TCPViệc quản lý các thông điệp trong kết nối TCP là thách thức cho các nhà lập trình, .NET Framework cung cấp một số lớp giải quyết vấn đề này. Là lớp NetWorkStream, cung cấp 2 stream interface cho socket là 2 lớp: StreamReader và StreamWriter, được dùng để gửi và nhận thông điệp văn bản sử dụng TCP.NetworkStream Class:Phương thức khởi tạo: Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);NetworkStream ns = new NetworkStream(newsock);Sau khi đối tượng NetworkStream được khởi tạo, có 1 vài thuộc tính và phương thức áp dụng vào đối tượng SocketTable 5.1: NetworkStream Class PropertiesProperty DescriptionCanRead Is true if the NetworkStream supports readingCanSeek Is always false for NetworkStreams CanWrite Is true if the NetworkStream supports writingDataAvailable Is true if there is data available to be readCác phương thức: NetworkStream Class Methods Method DescriptionBeginRead() Starts an asynchronous NetworkStream readBeginWrite() Starts an asynchronous NetworkStream writeClose() Closes the NetworkStream objectCreateObjRef() Creates an object used as a proxy for the NetworkStream EndRead() Finishes an asynchronous NetworkStream readEndWrite() Finishes an asynchronous NetworkStream writeEquals() Determines if two NetworkStreams are the sameFlush() Flushes all data from the NetworkStream GetHashCode() Obtains a hash code for the NetworkStream GetLifetimeService() Retrieves the lifetime service object for the NetworkStream GetType() Retrieves the type of the NetworkStream InitializeLifetimeService() Obtains a lifetime service object to control the 8NetworkStream Class Methods Method Descriptionlifetime policy for the NetworkStream Read() Reads data from the NetworkStream ReadByte() Reads a single byte of data from the NetworkStream ToString() Returns a string representationWrite() Writes data to the NetworkStream WriteByte() Writes a single byte of data to the NetworkStream Sử dụng phương thức Read để đọc khối dữ liệu từ NetworkStream. Đọc chuỗi byte vào buffer, offset là vị trí buffer nơi bắt đầu đặt dữ liệu, và size số byte phải đọc. int Read(byte[] buffer, int offset, int size)Phương thức Read() trả về giá trị integer là số byte đọc được từ NetWorkStream và được đặt trong buffer. 93. Using The C# Sockets Helper Classes:The TcpClientClass:Lớp TcpClient, trong System.Net.Sockets namespace, được thiết kế để dễ dàng viết các ứng dụng TCP client.Các khởi tạo của lớp TcpClient:TcpClient()TcpClient(IPEndPoint localEP)TcpClient(String host, int port)Các phương thức của TcpClient TcpClient Methods Method DescriptionClose() Closes the TCP connectionConnect() Attempts to establish a TCP connection with a remote deviceEquals() Determines if two TcpClient objects are equalGetHashCode() Gets a hash code suitable for use in hash functionsGetStream() Gets a Stream object that can be used to send and receive dataGetType() Gets the Type of the current instanceToString() Converts the current instance to a String object TcpClient Object Properties Property DescriptionLingerState Gets or sets the socket linger timeNoDelay Gets or sets the delay time used for sending or receiving TCP buffers that are not fullReceiveBufferSize Gets or sets the size of the TCP receive bufferReceiveTimeout Gets or sets the receive timeout value of the socketSendBufferSize Gets or sets the size of the TCP send bufferSendTimeout Gets or sets the send timeout value of the socket10 . lỗi. Chúng tôi sẽ cố gắng hoàn thiện thêm trong thời gian sắp tới .Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN 1MỤC LỤCLỜI NÓI ĐẦU . ..................................................................................................................................... 1 Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN

— Xem thêm —

Xem thêm: Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN, Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN, Lập trình Game “Đánh bài tiến lên” chạy trong mạng LAN

Lên đầu trang

Từ khóa liên quan

Đăng ký

Generate time = 0.16600799560547 s. Memory usage = 13.99 MB