在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 联网象棋对战源码

C# 联网象棋对战源码

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.65M
  • 下载次数:53
  • 浏览次数:335
  • 发布时间:2017-12-09
  • 实例类别:C#语言基础
  • 发 布 人:漠上心河
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 象棋

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Drawing.Drawing2D;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace DTTest
{
    public partial class Form1 : Form
    {
        private string localPath = Application.StartupPath;
        private Image deskImg;
        private CHIChess chi;
        private ArrayList chessList;
        private ChiDesk desk;
        private GraphicsPath oldPath;
        private GraphicsPath newPath;
        private bool isMove = false;
        private ArrayList history;
        private int[][] curMap;
        private CHIChess eatedChess;
        private UdpClient client;
        private bool canMove = false;
        public string remoteIP;
        public bool isOwner = true;
        private Abouts bout;

        private IAsyncResult result;
        private ListenMsg lmsg;

        public Form1(string remoteip,bool isOwner)
        {
            InitializeComponent();
            this.remoteIP = remoteip;
            this.isOwner = isOwner;

            deskImg=Image.FromFile(localPath   "\\imgs\\desk.bmp");
            this.deskBox.Size = deskImg.Size;
            this.Size = new Size(deskImg.Width   9, deskImg.Height   60);
            this.MaximumSize = this.Size;
            this.MinimumSize = this.Size;
            desk = new ChiDesk();
            chessList = new ArrayList();
            #region
            //chi = new CHIChess();
            //chi.location = new Point(68,79);
            //chi.ChiType = CHITypes.JU;
            //chi.curImg = this.getCHiChessImg(chi.ChiType);
            #endregion
            curMap = desk.GetMaps(); ;
            this.LoadChesses(curMap);

            client = new UdpClient(new IPEndPoint(Dns.GetHostByName(Dns.GetHostName()).AddressList[0], 1234));

            lmsg = new ListenMsg(this.listenMsg);
            this.result = lmsg.BeginInvoke(null,null);
                        
        }

        private void LoadChesses(int[][] map)
        {
            if (history != null) history= null;
            history = new ArrayList();
            if (chessList != null) chessList.Clear();
            oldPath = null;
            newPath = null;
            for (int row = 0; row < 10; row  )
            {
                for (int col = 0; col < 9; col  )
                {
                    if (map[row][col] != 0)
                    {
                        CHIChess chiche = new CHIChess();
                        chiche.ChiType = desk.GetTypeByID(map[row][col]);
                        chiche.SetIndexs(new Indexs(col,row));
                        chiche.curImg = this.getCHiChessImg(chiche.ChiType);
                        chiche.CreatePath();
                        chessList.Add(chiche);
                    }
                }
            }
            this.canMove = this.isOwner;
            this.deskBox.Invalidate();
        }

        private void deskBox_Paint(object sender,PaintEventArgs e)
        {
            e.Graphics.DrawImageUnscaled(deskImg,new Point(0,0));
            foreach(CHIChess onechess in chessList)
            {
                if (onechess != chi)
                {
                    onechess.CreateSelf(e.Graphics);
                    //e.Graphics.DrawPath(Pens.Red, onechess.chiPath);
                }
            }

            if (newPath != null&&oldPath != null)
            {
                e.Graphics.DrawPath(new Pen(Color.Red, 2), newPath);
                e.Graphics.DrawPath(new Pen(Color.Green,2), oldPath);
            }
            if (chi != null)
            {
                chi.CreateSelf(e.Graphics);
                //e.Graphics.DrawPath(Pens.Red,chi.chiPath);
            }
        }

        public Image getCHiChessImg(CHITypes chitype)
        {
            Image chiImg = null;
            if (isOwner == true)//正方
            {
                switch (chitype)
                {
                    case CHITypes.JIANG: chiImg = Image.FromFile(localPath   "\\imgs\\111.png"); break;
                    case CHITypes.SHI: chiImg = Image.FromFile(localPath   "\\imgs\\222.png"); break;
                    case CHITypes.XIANG: chiImg = Image.FromFile(localPath   "\\imgs\\333.png"); break;
                    case CHITypes.MA: chiImg = Image.FromFile(localPath   "\\imgs\\444.png"); break;
                    case CHITypes.JU: chiImg = Image.FromFile(localPath   "\\imgs\\555.png"); break;
                    case CHITypes.PAO: chiImg = Image.FromFile(localPath   "\\imgs\\666.png"); break;
                    case CHITypes.ZU: chiImg = Image.FromFile(localPath   "\\imgs\\777.png"); break;

                    case CHITypes.JIANG2: chiImg = Image.FromFile(localPath   "\\imgs\\1.png"); break;
                    case CHITypes.SHI2: chiImg = Image.FromFile(localPath   "\\imgs\\2.png"); break;
                    case CHITypes.XIANG2: chiImg = Image.FromFile(localPath   "\\imgs\\3.png"); break;
                    case CHITypes.MA2: chiImg = Image.FromFile(localPath   "\\imgs\\4.png"); break;
                    case CHITypes.JU2: chiImg = Image.FromFile(localPath   "\\imgs\\5.png"); break;
                    case CHITypes.PAO2: chiImg = Image.FromFile(localPath   "\\imgs\\6.png"); break;
                    case CHITypes.ZU2: chiImg = Image.FromFile(localPath   "\\imgs\\7.png"); break;
                }
            }
            else
            {
                switch (chitype)
                {
                    case CHITypes.JIANG: chiImg = Image.FromFile(localPath   "\\imgs\\1.png"); break;
                    case CHITypes.SHI: chiImg = Image.FromFile(localPath   "\\imgs\\2.png"); break;
                    case CHITypes.XIANG: chiImg = Image.FromFile(localPath   "\\imgs\\3.png"); break;
                    case CHITypes.MA: chiImg = Image.FromFile(localPath   "\\imgs\\4.png"); break;
                    case CHITypes.JU: chiImg = Image.FromFile(localPath   "\\imgs\\5.png"); break;
                    case CHITypes.PAO: chiImg = Image.FromFile(localPath   "\\imgs\\6.png"); break;
                    case CHITypes.ZU: chiImg = Image.FromFile(localPath   "\\imgs\\7.png"); break;

                    case CHITypes.JIANG2: chiImg = Image.FromFile(localPath   "\\imgs\\111.png"); break;
                    case CHITypes.SHI2: chiImg = Image.FromFile(localPath   "\\imgs\\222.png"); break;
                    case CHITypes.XIANG2: chiImg = Image.FromFile(localPath   "\\imgs\\333.png"); break;
                    case CHITypes.MA2: chiImg = Image.FromFile(localPath   "\\imgs\\444.png"); break;
                    case CHITypes.JU2: chiImg = Image.FromFile(localPath   "\\imgs\\555.png"); break;
                    case CHITypes.PAO2: chiImg = Image.FromFile(localPath   "\\imgs\\666.png"); break;
                    case CHITypes.ZU2: chiImg = Image.FromFile(localPath   "\\imgs\\777.png"); break;
                }
            }
            return chiImg;
        }


        private void deskBox_MouseDown(object sender,MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                Point curpoint = e.Location;
                findSel fs = new findSel(this.findSel);
                fs.Invoke(e.Location);
                this.deskBox.Invalidate();
            }
        }

        private void findSel(Point e)
        {
            bool isfind = false;
            foreach (CHIChess onechess in chessList)
            {
                if (onechess.chiPath.IsVisible(e)&&Convert.ToInt16(onechess.ChiType)>=8&&canMove==true)
                {
                    chi = onechess;
                    isfind = true;
                    break;
                }
            }
        }

        private void deskBox_MouseMove(object sender,MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left&&chi!=null)
            {
                chi.location = e.Location;
                isMove = true;
                this.deskBox.Invalidate();
            }
        }

        private void deskBox_MouseUp(object sender,MouseEventArgs e)
        {
            this.MoveChess(e.Location);
        }

        private void MoveChess(Point p)
        {
            if (chi != null)
            {
                bool isnew = this.findNewPath(p,curMap);
                chi.CreatePath();
                if (isnew == true)
                {
                    newPath = (GraphicsPath)chi.chiPath.Clone();
                    this.SendMoveInfo();
                }
                chi = null;
                this.deskBox.Invalidate();
            }
        }

        private bool findNewPath(Point p,int[][] map)
        {
            Indexs oldIndex = chi.MyIndex;
            bool findnew = false;
            for (int row = 0; row < 10; row  )
            {
                for (int col = 0; col < 9; col  )
                {
                    //if(map[row][col]==0)
                    //{
                      GraphicsPath gpath = new GraphicsPath();
                      if (row < 5)
                      {
                          gpath.AddRectangle(new Rectangle(68   col* 39-20,38 row* 39-20,40,40));
                      }
                      else
                      {
                          gpath.AddRectangle(new Rectangle(68  col* 39-20,43 row* 39-20,40,40));
                      }
                      if (gpath.IsVisible(chi.location))
                      {
                          if (checkCanPass(chi.MyIndex, new Indexs(col, row), chi.ChiType, curMap))//能通过
                          {
                              if (chi.ChiType != CHITypes.PAO2 && chi.ChiType != CHITypes.PAO)//吃子
                              {
                                  if(map[row][col]!=0&&!EatChess(new Indexs(col,row)))
                                  {
                                      break;
                                  }
                              }
                              CHIChess chiclone1=chi.cloneSelf();
                              HistoryRecorder recoder = new HistoryRecorder(chiclone1,chiclone1.MyIndex, new Indexs(col, row));
                              if (eatedChess != null)
                              {
                                  recoder.eatCHI = this.eatedChess.cloneSelf();
                              }
                              eatedChess = null;
                              history.Add(recoder);

                              oldPath =(GraphicsPath)chi.chiPath.Clone();
                              map[chi.MyIndex.Y][chi.MyIndex.X] = 0;
                              chi.SetIndexs(new Indexs(col, row));
                              map[row][col] = desk.GetIDByType(chi.ChiType);
                              
                              findnew = true;
                          }
                          break;
                      }
                    //}
                }
            }
            if (!findnew) chi.SetIndexs(oldIndex);
            return findnew;
        }

        private bool checkCanPass(Indexs oldIndex, Indexs newIndexs,CHITypes types,int[][] map)
        {
            bool passed = true;
            //判断两边的将是否碰面了
            if (oldIndex.X >= 3 && oldIndex.X <= 5)
            {
                bool haslaotou = false;
                Indexs laotou1 = new Indexs(-1, -1);
                Indexs laotou2 = new Indexs(-1, -1);
                for (int y = 0; y <= 2; y  )
                {
                    if (map[y][oldIndex.X] == 5)
                    {
                        laotou1.X = oldIndex.X;
                        laotou1.Y = y;
                        break;
                    }
                }
                for (int y = 7; y <= 9; y  )
                {
                    if (map[y][oldIndex.X] == 12)
                    {
                        laotou2.X = oldIndex.X;
                        laotou2.Y = y;
                    }
                }
                if (laotou1.Y != -1 && laotou2.Y != -1 && laotou1.X==laotou2.X)//两个老头在同一条线上面
                {
                    int zicount = 0;
                    if (laotou2.Y > laotou1.Y)
                    {
                        for (int y = laotou1.Y 1; y <laotou2.Y; y  )
                        {
                            if ((map[y][oldIndex.X] != 0 && map[y][oldIndex.X] != map[oldIndex.Y][oldIndex.X]) 
                                ||oldIndex.X==newIndexs.X)//找到了隔点
                            {
                                zicount  ;
                                break;
                            }
                        }
                    }
                    

                    if (zicount<=0)
                    {
                        return false;
                    }
                }
            }

            if (types == CHITypes.JU || types == CHITypes.JU2)
            {
                if (newIndexs.X == oldIndex.X&&newIndexs.Y!=oldIndex.Y)//纵向移动
                {
                    if (oldIndex.Y < newIndexs.Y)
                    {
                        for (int y = oldIndex.Y 1;y<newIndexs.Y; y  )
                        {
                            if (map[y][oldIndex.X] != 0)//路径中间有障碍物
                            {
                                passed = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        for (int y=newIndexs.Y   1; y <oldIndex.Y; y  )
                        {
                            if (map[y][oldIndex.X] != 0)//路径中间有障碍物
                            {
                                passed = false;
                                break;
                            }
                        }
                    }
                    return passed;
                }
                else if (newIndexs.Y == oldIndex.Y&&newIndexs.X!=oldIndex.X)//横向移动
                {
                    if (oldIndex.X<newIndexs.X)
                    {
                        for (int x = oldIndex.X   1; x < newIndexs.X; x  )
                        {
                            if (map[oldIndex.Y][x] != 0)
                            {
                                passed = false;
                                break;
                            }
                        }
                    }
                    else
                    {
                        for (int x = newIndexs.X   1; x < oldIndex.X; x  )
                        {
                            if (map[oldIndex.Y][x] != 0)
                            {
                                passed = false;
                                break;
                            }
                        }
                    }
                }
                else
                {
                    return false;
                }
            }
            if (types == CHITypes.MA || types == CHITypes.MA2)
            {
                passed = false;
                if (newIndexs.X == oldIndex.X - 1 && newIndexs.Y == oldIndex.Y - 2&&map[oldIndex.Y-1][oldIndex.X]==0)
                {
                    return true;
                }
                if (newIndexs.X == oldIndex.X   1 && newIndexs.Y == oldIndex.Y - 2 && map[oldIndex.Y - 1][oldIndex.X] == 0)
                {
                    return true;
                }
                if (newIndexs.X == oldIndex.X - 1 && newIndexs.Y == oldIndex.Y   2 && map[oldIndex.Y 1][oldIndex.X] == 0)
                {
                    return true;
                }
                if (newIndexs.X == oldIndex.X   1 && newIndexs.Y==oldIndex.Y   2 && map[oldIndex.Y 1][oldIndex.X] == 0)
                {
                    return true;
                }
                if (newIndexs.X == oldIndex.X - 2 && newIndexs.Y == oldIndex.Y - 1 && map[oldIndex.Y][oldIndex.X - 1] == 0)
                {
                    return true;
                }
                if (newIndexs.X == oldIndex.X - 2 && newIndexs.Y == oldIndex.Y   1 && map[oldIndex.Y][oldIndex.X - 1] == 0)
                {
                    return true;
                }
                if (newIndexs.X == oldIndex.X 2 && newIndexs.Y==oldIndex.Y - 1 && map[oldIndex.Y][oldIndex.X  1] == 0)
                {
                    return true;
                }
                if (newIndexs.X == oldIndex.X 2 && newIndexs.Y == oldIndex.Y   1 && map[oldIndex.Y][oldIndex.X 1] == 0)
                {
                    return true;
                }
                return passed;
            }
            if (types == CHITypes.XIANG || types == CHITypes.XIANG2)
            {
                passed = false;
                if (types == CHITypes.XIANG&&newIndexs.Y<=4)
                {
                    if (newIndexs.X == oldIndex.X - 2 && newIndexs.Y == oldIndex.Y - 2 && map[oldIndex.Y - 1][oldIndex.X - 1] == 0)
                    {
                        return true;
                    }
                    if (newIndexs.X == oldIndex.X   2 && newIndexs.Y == oldIndex.Y - 2 && map[oldIndex.Y - 1][oldIndex.X   1] == 0)
                    {
                        return true;
                    }
                    if (newIndexs.X == oldIndex.X - 2 && newIndexs.Y == oldIndex.Y   2 && map[oldIndex.Y   1][oldIndex.X - 1] == 0)
                    {
                        return true;
                    }
                    if (newIndexs.X == oldIndex.X   2 && newIndexs.Y == oldIndex.Y   2 && map[oldIndex.Y   1][oldIndex.X   1] == 0)
                    {
                        return true;
                    }
                    return passed;
                }
                if(types==CHITypes.XIANG2&&newIndexs.Y>=5)
                {
                    if (newIndexs.X == oldIndex.X - 2 && newIndexs.Y == oldIndex.Y - 2 && map[oldIndex.Y - 1][oldIndex.X - 1] == 0)
                    {
                        return true;
                    }
                    if (newIndexs.X == oldIndex.X   2 && newIndexs.Y == oldIndex.Y - 2 && map[oldIndex.Y - 1][oldIndex.X   1] == 0)
                    {
                        return true;
                    }
                    if (newIndexs.X == oldIndex.X - 2 && newIndexs.Y == oldIndex.Y   2 && map[oldIndex.Y   1][oldIndex.X - 1] == 0)
                    {
                        return true;
                    }
                    if (newIndexs.X == oldIndex.X   2 && newIndexs.Y == oldIndex.Y   2 && map[oldIndex.Y   1][oldIndex.X   1] == 0)
                    {
                        return true;
                    }
                }
                return passed;
            }
            if (types == CHITypes.SHI || types == CHITypes.SHI2)
            {
                passed = false;
                if (Math.Abs(newIndexs.X-oldIndex.X)==1&&Math.Abs(newIndexs.Y-oldIndex.Y)==1)
                {
                    if (newIndexs.X >= 3 && newIndexs.X <= 5)
                    {
                        if((newIndexs.Y>=0&&newIndexs.Y<=2)||(newIndexs.Y>=7&&newIndexs.Y<=9))
                        {
                          return true;
                        }
                    }
                }
                return passed;
            }
            if (types == CHITypes.JIANG || types == CHITypes.JIANG2)
            {
                passed = false;
                if ((Math.Abs(newIndexs.X - oldIndex.X) == 1 && newIndexs.Y== oldIndex.Y)||
                    Math.Abs(newIndexs.Y - oldIndex.Y) == 1 && newIndexs.X == oldIndex.X)
                {
                    if (newIndexs.X >= 3 && newIndexs.X <= 5)
                    {
                        if ((newIndexs.Y >= 0 && newIndexs.Y <= 2) || (newIndexs.Y >= 7 && newIndexs.Y <= 9))
                        {
                            return true;
                        }
                    }
                }
                return passed;
            }
            if (types == CHITypes.PAO || types == CHITypes.PAO2)
            {
                int chessCount = 0;
                if (newIndexs.X == oldIndex.X && newIndexs.Y != oldIndex.Y)//纵向移动
                {
                    if (oldIndex.Y < newIndexs.Y)
                    {
                        for (int y = oldIndex.Y   1; y < newIndexs.Y; y  )
                        {
                            if (map[y][oldIndex.X] != 0)//路径中间有障碍物
                            {
                                chessCount  ;
                            }
                        }
                    }
                    else
                    {
                        for (int y = newIndexs.Y   1; y < oldIndex.Y; y  )
                        {
                            if (map[y][oldIndex.X] != 0)//路径中间有障碍物
                            {
                                chessCount  ;
                            }
                        }
                    }
                    if (chessCount == 0 && map[newIndexs.Y][newIndexs.X] == 0)//空走
                    {
                        return true;
                    }
                    if (chessCount == 1 && map[newIndexs.Y][newIndexs.X] != 0)//吃子走
                    {
                        if (EatChess(newIndexs))
                        {
                            return true;
                        }
                    }
                    return false;
                }
                else if (newIndexs.Y == oldIndex.Y && newIndexs.X != oldIndex.X)//横向移动
                {
                    if (oldIndex.X < newIndexs.X)
                    {
                        for (int x = oldIndex.X   1; x < newIndexs.X; x  )
                        {
                            if (map[oldIndex.Y][x] != 0)
                            {
                                chessCount  ;
                            }
                        }
                    }
                    else
                    {
                        for (int x = newIndexs.X   1; x < oldIndex.X; x  )
                        {
                            if (map[oldIndex.Y][x] != 0)
                            {
                                chessCount  ;
                            }
                        }
                    }

                    if (chessCount == 0&&map[newIndexs.Y][newIndexs.X]==0)//空走
                    {
                        return true;
                    }
                    if (chessCount == 1 && map[newIndexs.Y][newIndexs.X] != 0)//吃子走
                    {
                        if (EatChess(newIndexs))
                        {
                            return true;
                        }
                    }
                    return false;
                }
                else
                {
                    return false;
                }
            }
            if (types == CHITypes.ZU || types == CHITypes.ZU2)
            {
                passed = false;
                if (types == CHITypes.ZU)
                {
                    if (oldIndex.Y <= 4)
                    {
                        if (newIndexs.Y - oldIndex.Y ==1&&newIndexs.X==oldIndex.X)
                        {
                            return true;
                        }
                    }
                    else
                    {
                        if (!(newIndexs.X != oldIndex.X && newIndexs.Y != oldIndex.Y))
                        {
                            if(newIndexs.Y - oldIndex.Y==1)
                            {
                              return true;
                            }
                            if(Math.Abs(newIndexs.X-oldIndex.X)==1)
                            {
                                return true;
                            }
                        }
                    }
                    return passed;
                }
                if (types == CHITypes.ZU2)
                {
                    if (oldIndex.Y>=5)
                    {
                        if (newIndexs.Y - oldIndex.Y ==-1 && newIndexs.X == oldIndex.X)
                        {
                            return true;
                        }
                    }
                    else
                    {
                        if (!(newIndexs.X != oldIndex.X && newIndexs.Y != oldIndex.Y))
                        {
                            if (newIndexs.Y - oldIndex.Y == -1)
                            {
                                return true;
                            }
                            if(Math.Abs(newIndexs.X - oldIndex.X) == 1)
                            {
                                return true;
                            }
                        }
                    }
                }
                return passed;
            }
             return passed;
        }

        private bool EatChess(Indexs newchessIndex)
        {
            bool eatOk = false;
            object[] objs = chessList.ToArray();
            for (int i = 0; i < objs.Length; i  )
            {
                CHIChess onechess = (CHIChess)objs[i];
                if (onechess.MyIndex.X == newchessIndex.X && onechess.MyIndex.Y == newchessIndex.Y && onechess != chi)//找到了吃的子
                {
                    if ((chi.ChiType.ToString().IndexOf("2")!=-1&&onechess.ChiType.ToString().IndexOf("2")==-1)||
                        (chi.ChiType.ToString().IndexOf("2")==-1 && onechess.ChiType.ToString().IndexOf("2")!=-1))//只能吃对方的子
                    {
                        eatedChess = onechess.cloneSelf();
                        chessList.Remove(onechess);
                        eatOk = true;
                    }
                    break;
                }
            }
            return eatOk;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //if (history != null && history.Count > 0)
            //{
            //    UdpClient uclient = new UdpClient();
            //    uclient.Connect(IPAddress.Parse(this.textBox1.Text),2345);
            //    HistoryRecorder hisrecoder = (HistoryRecorder)history.ToArray()[history.Count - 1];
            //    byte[] bts = null;
            //    if (hisrecoder.eatCHI != null)
            //    {
            //        bts = Encoding.UTF8.GetBytes(desk.GetIDByType(hisrecoder.hisCHI.ChiType)
            //              "|"   hisrecoder.fromIndex.X   ","   hisrecoder.fromIndex.Y   "|"  
            //            hisrecoder.toIndex.X   ","   hisrecoder.toIndex.Y   "|"   desk.GetIDByType(hisrecoder.eatCHI.ChiType));
            //    }
            //    else
            //    {
            //        bts = Encoding.UTF8.GetBytes(desk.GetIDByType(hisrecoder.hisCHI.ChiType)
            //          "|"   hisrecoder.fromIndex.X   ","   hisrecoder.fromIndex.Y   "|"  
            //        hisrecoder.toIndex.X   ","   hisrecoder.toIndex.Y   "|0");
            //    }
            //    uclient.Send(bts, bts.Length);
            //}
        }

        private void SendMsg(byte[] msg)
        {
            UdpClient uclient = new UdpClient();
            uclient.Connect(IPAddress.Parse(remoteIP), 1234);
            uclient.Send(msg,msg.Length);
        }
        private void SendMoveInfo()
        {
            if (history != null && history.Count > 0)
            {
                HistoryRecorder hisrecoder = (HistoryRecorder)history.ToArray()[history.Count - 1];
                byte[] bts = null;
                if (hisrecoder.eatCHI != null)
                {
                    bts = Encoding.UTF8.GetBytes(desk.GetIDByType(hisrecoder.hisCHI.ChiType)
                          "|"   hisrecoder.fromIndex.X   ","   hisrecoder.fromIndex.Y   "|"  
                        hisrecoder.toIndex.X   ","   hisrecoder.toIndex.Y   "|"   desk.GetIDByType(hisrecoder.eatCHI.ChiType));
                }
                else
                {
                    bts = Encoding.UTF8.GetBytes(desk.GetIDByType(hisrecoder.hisCHI.ChiType)
                      "|"   hisrecoder.fromIndex.X   ","   hisrecoder.fromIndex.Y   "|"  
                    hisrecoder.toIndex.X   ","   hisrecoder.toIndex.Y   "|0");
                }
                this.canMove = false;
                this.SendMsg(bts);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
        }

        private void listenMsg()
        {
            while (true)
            {
                IPEndPoint remote = new IPEndPoint(Dns.GetHostByName(Dns.GetHostName()).AddressList[0], 1234);
                byte[] bts = this.client.Receive(ref remote);

                if (bts.Length >=10&&Encoding.UTF8.GetString(bts).Contains("|"))
                {
                    TransferObject msgobj = DecodeMsg(Encoding.UTF8.GetString(bts));

                    foreach (CHIChess ochess in chessList)
                    {
                        if (ochess.MyIndex.X == msgobj.fromIndex.X &&
                            ochess.MyIndex.Y == msgobj.fromIndex.Y &&
                            ochess.ChiType == desk.GetTypeByID(msgobj.hischiID))
                        {
                            chi = ochess; break;
                        }
                    }
                    if (chi != null)
                    {
                        chi.SetIndexs(msgobj.fromIndex);

                        if (msgobj.toIndexs.Y < 5)
                        {
                            chi.location = new Point(68   msgobj.toIndexs.X * 39, 38   msgobj.toIndexs.Y * 39);
                        }
                        else
                        {
                            chi.location = new Point(68   msgobj.toIndexs.X * 39, 43   msgobj.toIndexs.Y * 39);
                        }
                        this.MoveChess(chi.location);
                        this.canMove = true;
                    }
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "hui".Trim())
                {
                    this.deskBox.Enabled = false;
                    if (MessageBox.Show("对方要求悔棋,你是否同意?", "悔棋",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        ToHistory();
                        this.SendMsg(Encoding.UTF8.GetBytes("huiyes"));//同意了
                    }
                    else
                    {
                        this.SendMsg(Encoding.UTF8.GetBytes("huino"));//不同意
                    }
                    this.deskBox.Enabled = true;
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "new".Trim())
                {
                    this.deskBox.Enabled = false;
                    if (MessageBox.Show("对方要求重新开始,你是否同意?", "重新开始",
                        MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        this.SendMsg(Encoding.UTF8.GetBytes("newyes".Trim()));//同意重新开始
                        curMap = desk.GetMaps();
                        this.LoadChesses(curMap);
                    }
                    else
                    {
                        this.SendMsg(Encoding.UTF8.GetBytes("newno".Trim()));//不同意重新开始
                    }
                    this.deskBox.Enabled = true;
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "newyes".Trim())//对方同意了重新开始
                {
                    curMap = desk.GetMaps();
                    this.LoadChesses(curMap);
                    continue;
                }
                if (Encoding.UTF8.GetString(bts).Trim() == "newno".Trim())//对方不同意重新开始
                {
                    this.deskBox.Enabled = false;
                    MessageBox.Show("对方不同意重新开始!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.deskBox.Enabled = true;
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "renshu".Trim())//对方已经认输了, 重新开始
                {
                    this.deskBox.Enabled = false;
                    MessageBox.Show("恭喜你,对方已经认输了!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    curMap = desk.GetMaps();
                    this.LoadChesses(curMap);
                    this.deskBox.Enabled = true;
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "qiuhe".Trim())//对方求和了
                {
                    this.deskBox.Enabled = false;
                    if (MessageBox.Show("对方求和,你是否同意?", "求和",
                     MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)//同意求和,重新开始
                    {
                        curMap = desk.GetMaps();
                        this.LoadChesses(curMap);
                        this.SendMsg(Encoding.UTF8.GetBytes("qiuheyes".Trim()));//同意求和
                    }
                    else
                    {
                        this.SendMsg(Encoding.UTF8.GetBytes("qiuheno".Trim()));//不同意求和
                    }
                    this.deskBox.Enabled = true;
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "qiuheyes".Trim())//对方同意了你的求和,重新开始
                {
                    curMap = desk.GetMaps();
                    this.LoadChesses(curMap);
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "qiuheno".Trim())//对方同意了你的求和,重新开始
                {
                    this.deskBox.Enabled = false;
                    MessageBox.Show("对方不同意你的求和!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.deskBox.Enabled = true;
                    continue;
                }

                if (Encoding.UTF8.GetString(bts).Trim() == "huiyes".Trim())
                {
                    ToHistory();
                    //this.deskBox.Enabled = true;
                    continue;
                }
                if (Encoding.UTF8.GetString(bts).Trim() == "huino".Trim())
                {
                    this.deskBox.Enabled = false;
                    MessageBox.Show("对方不同意你的悔棋!","信息",MessageBoxButtons.OK,MessageBoxIcon.Information);
                    this.deskBox.Enabled = true;
                    continue;
                }

                
                if (Encoding.UTF8.GetString(bts).Trim() == "fclose".Trim())
                {
                    this.deskBox.Enabled = false;
                    this.Close();
                    MessageBox.Show("对方已经下线!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);                    
                    continue;
                }

            }
        }

        private TransferObject DecodeMsg(string msgstr)
        {
            string[] str = msgstr.Split(new char[] { '|' });
            TransferObject tobj = new TransferObject();
            if (str.Length > 0)
            {
                tobj.hischiID = Math.Abs(Convert.ToInt16(str[0]) - 7);
                string[] fromStr = str[1].Split(new char[] { ',' });
                tobj.fromIndex.X = Convert.ToInt16(fromStr[0]);
                tobj.fromIndex.Y = Math.Abs(9 - Convert.ToInt16(fromStr[1]));
                string[] toStr = str[2].Split(new char[] { ',' });
                tobj.toIndexs.X = Convert.ToInt16(toStr[0]);
                tobj.toIndexs.Y = Math.Abs(9 - Convert.ToInt16(toStr[1]));
                tobj.eatchiID = Math.Abs(Convert.ToInt16(str[3]) - 7);
            }
            return tobj;
        }

        private void lastToolStripMenuItem_Click(object sender, EventArgs e)//还原历史记录
        {
            if (history != null && history.Count > 0)
            {
                this.SendMsg(Encoding.UTF8.GetBytes("hui"));//发送悔棋的信息
                this.deskBox.Enabled = false;
            }
            else
            {
                MessageBox.Show("没有棋可悔!", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void ToHistory()
        {
            if (history != null && history.Count > 0)
            {
                bool ishisOk = false;
                object[] hisobjs = history.ToArray();
                HistoryRecorder hisrecorder = (HistoryRecorder)hisobjs[hisobjs.Length - 1];//查找链表最后一条记录

                object[] objs = chessList.ToArray();
                for (int i = 0; i < objs.Length; i  )
                {
                    CHIChess chichess = (CHIChess)objs[i];
                    if (chichess.MyIndex.X == hisrecorder.toIndex.X &&
                        chichess.MyIndex.Y == hisrecorder.toIndex.Y)
                    {
                        chessList.Remove(chichess);//删除现在的
                        chessList.Add(hisrecorder.hisCHI.cloneSelf());//添加原来的
                        if (hisobjs.Length - 2 >= 0)
                        {
                            CHIChess chichess1 = (CHIChess)((HistoryRecorder)hisobjs[hisobjs.Length - 2]).hisCHI;
                            oldPath = (GraphicsPath)chichess1.chiPath.Clone();
                        }
                        newPath = (GraphicsPath)hisrecorder.hisCHI.chiPath.Clone();
                        curMap[hisrecorder.fromIndex.Y][hisrecorder.fromIndex.X] = desk.GetIDByType(chichess.ChiType);
                        curMap[hisrecorder.toIndex.Y][hisrecorder.toIndex.X] = 0;
                        ishisOk = true;
                        break;
                    }
                }

                if (hisrecorder.eatCHI != null)
                {
                    CHIChess cloneCHI = hisrecorder.eatCHI.cloneSelf();
                    chessList.Add(cloneCHI);
                    curMap[hisrecorder.eatCHI.MyIndex.Y][hisrecorder.eatCHI.MyIndex.X] = desk.GetIDByType(cloneCHI.ChiType);
                }
                if (ishisOk)
                {
                    if (this.canMove == true)
                    {
                        this.canMove = false;
                    }
                    else
                    {
                        this.canMove = true;
                    }
                    history.Remove(hisrecorder);
                }
                this.deskBox.Invalidate();
            }
        }

        private void newStartToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SendMsg(Encoding.UTF8.GetBytes("new"));
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void remoteToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            SendMsg(Encoding.UTF8.GetBytes("fclose"));
            client.Close();
            client = null;
            this.DialogResult = DialogResult.OK;
            //try
            //{
            //    lmsg.EndInvoke(this.result);
            //}
            //catch
            //{
            //}
        }

        private void aboutgame_Click(object sender, EventArgs e)
        {
            if (bout == null)
            {
                bout = new Abouts();
                bout.Show();
            }
        }

        private void 认输ToolStripMenuItem_Click(object sender, EventArgs e)//认输了
        {
            SendMsg(Encoding.UTF8.GetBytes("renshu"));
            curMap = desk.GetMaps();
            this.LoadChesses(curMap);
        }

        private void 求和ToolStripMenuItem_Click(object sender, EventArgs e)//求和了
        {
            SendMsg(Encoding.UTF8.GetBytes("qiuhe"));
        }
    }
    public delegate void ListenMsg();
    public delegate void findSel(Point e);
}


标签: 象棋

实例下载地址

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警