基于C#实现的联网象棋对战系统代码

基于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);
        }
    }
}

六、扩展功能建议

  1. AI对战模块

    集成Minimax算法实现初级AI,参考Alpha-Beta剪枝优化

  2. 实时聊天系统

    添加私有消息和全局频道功能

  3. 观战模式

    实现棋局状态快照和回放功能

  4. 数据库集成

    使用SQL Server存储对战记录和用户数据

  5. 移动端适配

    开发跨平台客户端(WPF/UWP)

参考代码 C# 联网象棋对战源码 www.youwenfan.com/contentcnr/93576.html

七、调试技巧

  1. 网络调试

    使用Wireshark抓包分析TCP通信数据

  2. 日志记录

    public static class Logger {
        public static void Log(string msg) {
            File.AppendAllText("server.log", $"{DateTime.Now}: {msg}\n");
        }
    }
    
  3. 性能监控

    使用.NET内置的System.Diagnostics.Stopwatch测量关键代码段耗时

 

专注于matlab/simulink,电子电路,编程