基于C#实现的联网象棋对战系统代码
一、系统架构设计
graph TD
A[客户端] -->|TCP连接| B(服务器)
B --> C{游戏逻辑处理}
C --> D[棋盘状态同步]
C --> E[用户指令解析]
D --> F[客户端1]
D --> G[客户端2]
二、核心代码实现
1. 服务器端(TCP通信核心)
using System.Net.Sockets;
using System.Threading;
public class ChessServer {
private TcpListener _listener;
private ConcurrentDictionary<string, ClientHandler> _clients = new();
public void Start(string ip, int port) {
_listener = new TcpListener(IPAddress.Parse(ip), port);
_listener.Start();
Console.WriteLine("服务器已启动...");
while (true) {
var client = _listener.AcceptTcpClient();
var handler = new ClientHandler(client, this);
_clients[client.Client.RemoteEndPoint.ToString()] = handler;
new Thread(handler.Handle).Start();
}
}
public void Broadcast(string message, ClientHandler exclude) {
foreach (var client in _clients.Values) {
if (client != exclude) client.Send(message);
}
}
}
public class ClientHandler {
private TcpClient _client;
private NetworkStream _stream;
private ChessServer _server;
public ClientHandler(TcpClient client, ChessServer server) {
_client = client;
_stream = client.GetStream();
_server = server;
}
public void Handle() {
try {
byte[] buffer = new byte[1024];
while (true) {
int bytesRead = _stream.Read(buffer, 0, buffer.Length);
string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
ProcessCommand(msg);
}
} catch {
_server.Broadcast("玩家断开连接", this);
}
}
private void ProcessCommand(string cmd) {
var parts = cmd.Split(':');
switch (parts[0]) {
case "MOVE":
_server.Broadcast($"MOVE:{parts[1]}", this);
break;
case "REGRET":
_server.Broadcast("REGRET_REQUEST", this);
break;
}
}
public void Send(string message) {
_stream.Write(Encoding.UTF8.GetBytes(message));
}
}
2. 客户端(含界面交互)
using System.Windows.Forms;
public partial class ChessForm : Form {
private TcpClient _client;
private NetworkStream _stream;
private ChessBoardControl _board;
public ChessForm() {
InitializeComponent();
_board = new ChessBoardControl();
this.Controls.Add(_board);
ConnectToServer();
}
private void ConnectToServer() {
_client = new TcpClient();
_client.Connect("127.0.0.1", 8888);
_stream = _client.GetStream();
// 接收线程
new Thread(() => {
byte[] buffer = new byte[1024];
while (true) {
int bytesRead = _stream.Read(buffer, 0, buffer.Length);
string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
this.Invoke((MethodInvoker)delegate {
HandleServerMessage(msg);
});
}
}).Start();
}
private void HandleServerMessage(string msg) {
if (msg.StartsWith("MOVE:")) {
string[] data = msg.Split(',');
Point from = new Point(int.Parse(data[1]), int.Parse(data[2]));
Point to = new Point(int.Parse(data[3]), int.Parse(data[4]));
_board.MovePiece(from, to);
}
}
private void btnMove_Click(object sender, EventArgs e) {
Point from = GetSelectedPiecePosition();
Point to = GetTargetPosition();
_stream.Write(Encoding.UTF8.GetBytes($"MOVE:{from.X},{from.Y},{to.X},{to.Y}"));
}
}
三、关键功能模块
1. 棋盘状态同步机制
public class ChessBoardState {
private int[,] _board = new int[9,10]; // 9列10行
private object _lock = new object();
public void UpdatePosition(int x, int y, int piece) {
lock(_lock) {
_board[x, y] = piece;
}
}
public int GetPiece(int x, int y) {
lock(_lock) {
return _board[x, y];
}
}
}
2. 棋子移动规则验证
public class ChessRuleValidator {
public bool IsValidMove(int fromX, int fromY, int toX, int toY, int[,] board) {
int piece = board[fromX, fromY];
if (piece == 0) return false;
// 车移动验证
if (piece == 1) {
return IsStraightPathClear(fromX, fromY, toX, toY, board);
}
// 马走日验证
else if (piece == 2) {
return IsHorseMoveValid(fromX, fromY, toX, toY, board);
}
// 其他棋子规则...
return false;
}
private bool IsStraightPathClear(int x1, int y1, int x2, int y2, int[,] board) {
// 实现直线路径检查逻辑
}
}
四、多线程与事件处理
1. 异步消息处理
public class MessageQueue {
private ConcurrentQueue<string> _queue = new();
private AutoResetEvent _signal = new(false);
public void Enqueue(string msg) {
_queue.Enqueue(msg);
_signal.Set();
}
public string Dequeue() {
_signal.WaitOne();
return _queue.TryDequeue(out var msg) ? msg : null;
}
}
2. 状态更新事件
public class BoardUpdateEventArgs : EventArgs {
public int FromX { get; }
public int FromY { get; }
public int ToX { get; }
public int ToY { get; }
public BoardUpdateEventArgs(int fromX, int fromY, int toX, int toY) {
FromX = fromX;
FromY = fromY;
ToX = toX;
ToY = toY;
}
}
public class ChessBoardControl : Control {
public event EventHandler<BoardUpdateEventArgs> OnMove;
protected override void OnPaint(PaintEventArgs e) {
base.OnPaint(e);
// 绘制棋盘和棋子
}
public void MovePiece(Point from, Point to) {
// 验证移动合法性
if (ChessRuleValidator.IsValidMove(from.X, from.Y, to.X, to.Y, _board)) {
// 更新棋盘状态
Invalidate();
OnMove?.Invoke(this, new BoardUpdateEventArgs(from.X, from.Y, to.X, to.Y));
}
}
}
五、部署与运行
1. 服务器配置
# 启动服务器
ChessServer.exe --port 8888 --maxplayers 2
2. 客户端连接
// 自动重连逻辑
private void Reconnect() {
while (!_client.Connected) {
try {
_client = new TcpClient();
_client.Connect("127.0.0.1", 8888);
_stream = _client.GetStream();
break;
} catch {
Thread.Sleep(3000);
}
}
}
六、扩展功能建议
-
AI对战模块
集成Minimax算法实现初级AI,参考Alpha-Beta剪枝优化
-
实时聊天系统
添加私有消息和全局频道功能
-
观战模式
实现棋局状态快照和回放功能
-
数据库集成
使用SQL Server存储对战记录和用户数据
-
移动端适配
开发跨平台客户端(WPF/UWP)
参考代码 C# 联网象棋对战源码 www.youwenfan.com/contentcnr/93576.html
七、调试技巧
-
网络调试
使用Wireshark抓包分析TCP通信数据
-
日志记录
public static class Logger { public static void Log(string msg) { File.AppendAllText("server.log", $"{DateTime.Now}: {msg}\n"); } } -
性能监控
使用.NET内置的
System.Diagnostics.Stopwatch测量关键代码段耗时