五子棋游戏-2(落子与悔棋)

落子比较简单,只需要根据鼠标在PictureBox上的位置做一定的处理,就能判断该子落在第几行第几列的交叉点上。

但是你会发现:为什么鼠标落在左下角的时候会点到左边的位置上去?而应该是如果落在棋子的范围内任意一点的话都应该落在一个点上。
解决方法:在当前鼠标位置+LineSpace 的一半距离然后整除,判断是否在位置里面。
int x = (mLocation.X - ChessBoard.Margin + ChessBoard.LineSpace / 2) / ChessBoard.LineSpace;
int y = (mLocation.Y - ChessBoard.Margin + ChessBoard.LineSpace / 2) / ChessBoard.LineSpace;

落子后要更改下一个子的颜色
Public color nextcolor=color.white;
Chessboard.drawpiece(nextcolor,x,y);
Nextcolor=nextcolor==color.white?color.black:color.white;

还要解决的问题是,已有子上点击一下,又在此处落子了,覆盖问题!
解决方法:用一个二维数组标识落子情况,落子前检查该标识是否可以落子

最后是悔棋的方案,只要用一个集合记录所有落子情况即可。

棋子类:

Code:
  1. namespace FivePiece {   
  2.     ///    
  3.     /// 棋子   
  4.     ///    
  5.     class Piece {   
  6.         public static int Side = 28;//边长   
  7.         public Color Color;         //棋子颜色   
  8.         public int X;   
  9.         public int Y;   
  10.     }   
  11. }  

 棋盘类:
 

Code:
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. using System.Windows.Forms;   
  5. using System.Drawing;   
  6.   
  7. namespace FivePiece {   
  8.     ///    
  9.     /// 棋盘   
  10.     ///    
  11.     class ChessBoard {   
  12.   
  13.         public int Lines = 19;      //线条书   
  14.         public int LineSpace = 30;  //线间距   
  15.         public int Margin = 30 / 2; //边距(线间距/2)   
  16.         public PictureBox PicCtrl;  //棋盘容器控件   
  17.   
  18.         ///    
  19.         /// 绘制棋盘   
  20.         ///    
  21.         public void DrawBoard() {   
  22.             Bitmap bmp = new Bitmap(PicCtrl.Width, PicCtrl.Height);   
  23.             Graphics g = Graphics.FromImage(bmp);   
  24.   
  25.             //绘制背景颜色   
  26.             SolidBrush brush = new SolidBrush(Color.Gold);   
  27.             g.FillRectangle(brush, Margin, Margin,   
  28.                 (Lines - 1) * LineSpace, (Lines - 1) * LineSpace);   
  29.   
  30.             Pen linePen = new Pen(Color.Black, 1);//画线笔   
  31.             //Lines条横线   
  32.             for(int i = 0; i < Lines; i++) {   
  33.                 Point start = new Point(Margin, i * LineSpace + Margin);   
  34.                 Point end = new Point(start.X+(Lines-1)*LineSpace, start.Y);   
  35.                 g.DrawLine(linePen, start, end);   
  36.             }   
  37.             //Lines条竖线   
  38.             for(int i = 0; i < Lines; i++) {   
  39.                 Point start = new Point(i * LineSpace + Margin, Margin);   
  40.                 Point end = new Point(start.X, start.Y + (Lines - 1) * LineSpace);   
  41.                 g.DrawLine(linePen, start, end);   
  42.             }   
  43.   
  44.             PicCtrl.BackgroundImage = bmp;   
  45.         }   
  46.   
  47.         ///    
  48.         /// 绘制棋子   
  49.         ///    
  50.         /// 棋子颜色   
  51.         /// x轴线坐标   
  52.         /// y轴线坐标   
  53.         public void DrawPiece(Color c, int x, int y) {   
  54.             Bitmap bmp = new Bitmap(PicCtrl.BackgroundImage);   
  55.             Graphics g = Graphics.FromImage(bmp);   
  56.   
  57.             Rectangle rect = new Rectangle(   
  58.                 x * LineSpace + Margin - Piece.Side / 2,   
  59.                 y * LineSpace + Margin - Piece.Side / 2,   
  60.                 Piece.Side, Piece.Side);   
  61.             SolidBrush brush = new SolidBrush(c);   
  62.             g.FillEllipse(brush, rect);   
  63.   
  64.             PicCtrl.BackgroundImage = bmp;   
  65.         }   
  66.            
  67.         ///    
  68.         /// 重绘   
  69.         ///    
  70.         ///    
  71.         public void Redraw(Piece[] step) {   
  72.             DrawBoard();   
  73.   
  74.             foreach(Piece p in step) {   
  75.                 if(p != null) {   
  76.                     DrawPiece(p.Color, p.X, p.Y);   
  77.                 }   
  78.             }   
  79.         }   
  80.     }   
  81. }   

游戏类:
 

Code:
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Text;   
  4. using System.Drawing;   
  5.   
  6. namespace FivePiece {   
  7.     ///    
  8.     /// 游戏类   
  9.     ///    
  10.     class Game {   
  11.         //棋盘   
  12.         public ChessBoard ChessBoard = new ChessBoard();   
  13.         //下一个落子颜色   
  14.         public Color NextColor = Color.White;   
  15.         //落子步骤   
  16.         public Piece[] Steps;   
  17.         //步骤数   
  18.         public int StepCount;   
  19.         //游戏是否结束   
  20.         public bool GameOver = false;   
  21.         //落子标记   
  22.         int[,] pieces;   
  23.   
  24.            
  25.   
  26.         //构造方法   
  27.         public Game() {   
  28.             pieces = new int[ChessBoard.Lines, ChessBoard.Lines];   
  29.             Steps = new Piece[ChessBoard.Lines * ChessBoard.Lines];   
  30.         }   
  31.   
  32.         ///    
  33.         /// 落子   
  34.         ///    
  35.         /// 鼠标位置   
  36.         public void DownPiece(Point mLocation) {   
  37.             int x = (mLocation.X - ChessBoard.Margin + ChessBoard.LineSpace / 2) / ChessBoard.LineSpace;   
  38.             int y = (mLocation.Y - ChessBoard.Margin + ChessBoard.LineSpace / 2) / ChessBoard.LineSpace;   
  39.   
  40.             //判断此处是否可以落子   
  41.             if(pieces[x, y] == 0) {   
  42.                 ChessBoard.DrawPiece(NextColor, x, y);   
  43.                 pieces[x, y] = NextColor == Color.White ? 1 : 2;   
  44.                    
  45.   
  46.                 Steps[StepCount] = new Piece();   
  47.                 Steps[StepCount].X = x;   
  48.                 Steps[StepCount].Y = y;   
  49.                 Steps[StepCount].Color = NextColor;   
  50.                    
  51.                    
  52.                 NextColor = NextColor == Color.White ? Color.Black : Color.White;   
  53.                 //判断是否胜利   
  54.                 if(IsWin(Steps[StepCount])) {   
  55.                     GameOver = true;   
  56.                 }   
  57.                 StepCount++;   
  58.             }   
  59.         }   
  60.            
  61.         ///    
  62.         /// 悔棋   
  63.         ///    
  64.         public void RegretPiece() {   
  65.             if(StepCount == 0) return;   
  66.   
  67.             //落子标识设为0   
  68.             pieces[Steps[StepCount - 1].X, Steps[StepCount - 1].Y] = 0;   
  69.             //改变当前颜色   
  70.             NextColor = NextColor == Color.White ? Color.Black : Color.White;   
  71.   
  72.             Steps[StepCount - 1] = null;   
  73.             StepCount--;   
  74.   
  75.             ChessBoard.Redraw(Steps);   
  76.         }   
  77.            
  78.         ///    
  79.         /// 判断是否五子连心   
  80.         ///    
  81.         ///    
  82.         ///    
  83.         private bool IsWin(Piece p) {   
  84.             int x = p.X;   
  85.             int y = p.Y;   
  86.             bool win = IsFive(x, y, 0, 1, p.Color); //纵向   
  87.             win |= IsFive(x, y, 1, 1, p.Color);     //右下斜   
  88.             win |= IsFive(x, y, 1, 0, p.Color);     //横向   
  89.             win |= IsFive(x, y, 1, -1, p.Color);    //左上斜   
  90.             return win;   
  91.         }   
  92.   
  93.         private bool IsFive(int x, int y, int offsetX, int offsetY, Color c) {   
  94.             int count = 1;   
  95.             int searchX = x + offsetX;   
  96.             int searchY = y + offsetY;   
  97.             bool stop = false;   
  98.             while(searchX >= 0 && searchX < ChessBoard.Lines &&   
  99.                 searchY >= 0 && searchY < ChessBoard.Lines &&   
  100.                 !stop) {   
  101.                 int intColor = c == Color.White ? 1 : 2;   
  102.                 if(pieces[searchX, searchY] == intColor) {   
  103.                     count++;   
  104.                     searchX += offsetX;   
  105.                     searchY += offsetY;   
  106.                 } else {   
  107.                     stop = true;   
  108.                 }   
  109.             }   
  110.             stop = false;   
  111.             searchX = x - offsetX;   
  112.             searchY = y - offsetY;   
  113.             while(searchX >= 0 && searchX < ChessBoard.Lines &&   
  114.                 searchY >= 0 && searchY < ChessBoard.Lines &&   
  115.                 !stop) {   
  116.                 int intColor = c == Color.White ? 1 : 2;   
  117.                 if(pieces[searchX, searchY] == intColor) {   
  118.                     count++;   
  119.                     searchX -= offsetX;   
  120.                     searchY -= offsetY;   
  121.                 } else {   
  122.                     stop = true;   
  123.                 }   
  124.             }   
  125.             return count == 5;   
  126.         }   
  127.     }   
  128. }   

 视频内容请见http://www.itcast.net/course/detail/1989

<<如果您想和我交流,请点击和我成为好友>>

你可能感兴趣的:(五子棋游戏-2(落子与悔棋))