zoukankan      html  css  js  c++  java
  • C#聊天+五子棋

    此系统只是为了让自己多了解一下有关底层通信协议的相关知识。


    聊天功能是通过Socket利用Tcp协议来实现。

    聊天服务端:chatServer

    聊天客户端:chatClient

    ---聊天,是通过聊天服务端监听,一旦有客户连接上此服务端,那么聊天服务端就保存这个客户端的Socket实例,并存放在一个IDictionnary内(全部的在线用户),然后将已经存在的用户信息发送给此聊天客户端(客户端显示在线列表),再将此客户端的信息发送给所有已经存在的客户端用户(及时更新客户端在线用户列表)。与此同时,在服务端为每个连接上服务器的客户端Socket实例,创建一个线程去监听客户端发来的信息。

    五子棋游戏是通过Socket封装的TcpClient类来实现。

    游戏服务端:每个聊天客户端都可以充当游戏服务端(邀请者=游戏服务端)

    游戏客户端:那就是接收邀请的用户了

    --五子棋游戏,首先通过聊天的功能发送邀请给指定用户(作为游戏服务端开始监听),用户如果接受邀请,那么就创建连接。之后利用游戏建立的通信来发送五子棋的坐标。

    个人觉得需要注意的方面:
    1、操作不同线程的控件。
      解决方式:利用委托或者直接声明线程间的控件可以互用。参考:http://www.cnblogs.com/cadlife/articles/2425820.html

    2、画棋盘方面,例:当窗体程序最小化,再打开时,棋盘会自动重绘。
      解决方式:重绘棋盘的同时,再让其重绘棋子即可。(期待有好的方法)

    3、判断胜利

    View Code
            /// <summary>
            /// 判断是否胜利
            /// </summary>
            /// <returns>是否有人胜利,1红棋胜利、2黑棋胜利、0无人胜利</returns>
            public int whetherSuccess()
            {
                #region 横向
                for (int i = 0; i <= 10; i++)
                {
                    for (int j = 0; j <= 6; j++)
                    {
                        if (array[j, i] == array[j + 1, i] && array[j + 1, i] == array[j + 2, i] && array[j + 2, i] == array[j + 3, i] && array[j + 3, i] == array[j + 4, i] && array[j + 4, i] == 1)
                        {
                            //红色胜利
                            return 1;
                        }
                        if (array[j, i] == array[j + 1, i] && array[j + 1, i] == array[j + 2, i] && array[j + 2, i] == array[j + 3, i] && array[j + 3, i] == array[j + 4, i] && array[j + 4, i] == 2)
                        {
                            //黑色胜利
                            return 2;
                        }
                    }
                }
                #endregion
    
                #region 纵向
                for (int i = 0; i <= 10; i++)
                {
                    for (int j = 0; j <= 6; j++)
                    {
                        if (array[i, j] == array[i, j + 1] && array[i, j + 1] == array[i, j + 2] && array[i, j + 2] == array[i, j + 3] && array[i, j + 3] == array[i, j + 4] && array[i, j + 4] == 1)
                        {
                            //红色胜利
                            return 1;
                        }
                        if (array[i, j] == array[i, j + 1] && array[i, j + 1] == array[i, j + 2] && array[i, j + 2] == array[i, j + 3] && array[i, j + 3] == array[i, j + 4] && array[i, j + 4] == 2)
                        {
                            //黑色胜利
                            return 2;
                        }
                    }
                }
                #endregion
    
                #region 左上-右下
                for (int i = 6; i <= 0; i--)
                {
                    for (int j = 0; j <= 6 - i; j++)
                    {
                        bool left = array[j, i + j] == array[j + 1, i + j + 1] && array[j + 1, i + j + 1] == array[j + 2, i + j + 2] && array[j + 2, i + j + 2] == array[j + 3, i + j + 3] && array[j + 3, i + j + 3] == array[j + 4, i + j + 4];
                        bool right = array[i + j, j] == array[i + j + 1, j + 1] && array[i + j + 1, j + 1] == array[i + j + 2, j + 2] && array[i + j + 2, j + 2] == array[i + j + 3, j + 3] && array[i + j + 3, j + 3] == array[i + j + 4, j + 4];
    
                        int nRet = left == true && array[j, i + j] != 0 ? array[j, i + j] : right == true && array[i + j, j] != 0 ? array[i + j, j] : 0;
                        if (nRet != 0)
                            return nRet;
    
                    }
                }
                #endregion
    
                #region 右上-左下
                for (int i = 4; i <= 10; i++)
                {
                    for (int j = 0; j <= i - 4; j++)
                    {
                        bool left = array[i - j, j] == array[i - j - 1, j + 1] && array[i - j - 1, j + 1] == array[i - j - 2, j + 2] && array[i - j - 2, j + 2] == array[i - j - 3, j + 3] && array[i - j - 3, j + 3] == array[i - j - 4, j + 4];
                        bool right = array[10 - j, 10 - i + j] == array[10 - j - 1, 10 - i + j + 1] && array[10 - j - 1, 10 - i + j + 1] == array[10 - j - 2, 10 - i + j + 2] && array[10 - j - 2, 10 - i + j + 2] == array[10 - j - 3, 10 - i + j + 3] && array[10 - j - 3, 10 - i + j + 3] == array[10 - j - 4, 10 - i + j + 4];
                        int nRet = left == true && array[i - j, j] != 0 ? array[i - j, j] : right == true && array[10 - j, 10 - i + j] != 0 ? array[10 - j, 10 - i + j] : 0;
                        if (nRet != 0)
                            return nRet;
                    }
                }
                #endregion
                return 0;//未分出胜负
    
            }

    4、资源的释放。

       源码下载  存在问题之处请指正....

  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/wupeiqi/p/3053170.html
Copyright © 2011-2022 走看看