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

本文介绍了一款五子棋游戏的开发过程,包括棋盘绘制、棋子落子逻辑及胜负判断等关键技术实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

落子比较简单,只需要根据鼠标在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. namespaceFivePiece{
  2. ///<summary>
  3. ///棋子
  4. ///</summary>
  5. classPiece{
  6. publicstaticintSide=28;//边长
  7. publicColorColor;//棋子颜色
  8. publicintX;
  9. publicintY;
  10. }
  11. }

棋盘类:

Code:
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. usingSystem.Windows.Forms;
  5. usingSystem.Drawing;
  6. namespaceFivePiece{
  7. ///<summary>
  8. ///棋盘
  9. ///</summary>
  10. classChessBoard{
  11. publicintLines=19;//线条书
  12. publicintLineSpace=30;//线间距
  13. publicintMargin=30/2;//边距(线间距/2)
  14. publicPictureBoxPicCtrl;//棋盘容器控件
  15. ///<summary>
  16. ///绘制棋盘
  17. ///</summary>
  18. publicvoidDrawBoard(){
  19. Bitmapbmp=newBitmap(PicCtrl.Width,PicCtrl.Height);
  20. Graphicsg=Graphics.FromImage(bmp);
  21. //绘制背景颜色
  22. SolidBrushbrush=newSolidBrush(Color.Gold);
  23. g.FillRectangle(brush,Margin,Margin,
  24. (Lines-1)*LineSpace,(Lines-1)*LineSpace);
  25. PenlinePen=newPen(Color.Black,1);//画线笔
  26. //Lines条横线
  27. for(inti=0;i<Lines;i++){
  28. Pointstart=newPoint(Margin,i*LineSpace+Margin);
  29. Pointend=newPoint(start.X+(Lines-1)*LineSpace,start.Y);
  30. g.DrawLine(linePen,start,end);
  31. }
  32. //Lines条竖线
  33. for(inti=0;i<Lines;i++){
  34. Pointstart=newPoint(i*LineSpace+Margin,Margin);
  35. Pointend=newPoint(start.X,start.Y+(Lines-1)*LineSpace);
  36. g.DrawLine(linePen,start,end);
  37. }
  38. PicCtrl.BackgroundImage=bmp;
  39. }
  40. ///<summary>
  41. ///绘制棋子
  42. ///</summary>
  43. ///<paramname="c">棋子颜色</param>
  44. ///<paramname="x">x轴线坐标</param>
  45. ///<paramname="y">y轴线坐标</param>
  46. publicvoidDrawPiece(Colorc,intx,inty){
  47. Bitmapbmp=newBitmap(PicCtrl.BackgroundImage);
  48. Graphicsg=Graphics.FromImage(bmp);
  49. Rectanglerect=newRectangle(
  50. x*LineSpace+Margin-Piece.Side/2,
  51. y*LineSpace+Margin-Piece.Side/2,
  52. Piece.Side,Piece.Side);
  53. SolidBrushbrush=newSolidBrush(c);
  54. g.FillEllipse(brush,rect);
  55. PicCtrl.BackgroundImage=bmp;
  56. }
  57. ///<summary>
  58. ///重绘
  59. ///</summary>
  60. ///<paramname="step"></param>
  61. publicvoidRedraw(Piece[]step){
  62. DrawBoard();
  63. foreach(Piecepinstep){
  64. if(p!=null){
  65. DrawPiece(p.Color,p.X,p.Y);
  66. }
  67. }
  68. }
  69. }
  70. }

游戏类:

Code:
  1. usingSystem;
  2. usingSystem.Collections.Generic;
  3. usingSystem.Text;
  4. usingSystem.Drawing;
  5. namespaceFivePiece{
  6. ///<summary>
  7. ///游戏类
  8. ///</summary>
  9. classGame{
  10. //棋盘
  11. publicChessBoardChessBoard=newChessBoard();
  12. //下一个落子颜色
  13. publicColorNextColor=Color.White;
  14. //落子步骤
  15. publicPiece[]Steps;
  16. //步骤数
  17. publicintStepCount;
  18. //游戏是否结束
  19. publicboolGameOver=false;
  20. //落子标记
  21. int[,]pieces;
  22. //构造方法
  23. publicGame(){
  24. pieces=newint[ChessBoard.Lines,ChessBoard.Lines];
  25. Steps=newPiece[ChessBoard.Lines*ChessBoard.Lines];
  26. }
  27. ///<summary>
  28. ///落子
  29. ///</summary>
  30. ///<paramname="mLocation">鼠标位置</param>
  31. publicvoidDownPiece(PointmLocation){
  32. intx=(mLocation.X-ChessBoard.Margin+ChessBoard.LineSpace/2)/ChessBoard.LineSpace;
  33. inty=(mLocation.Y-ChessBoard.Margin+ChessBoard.LineSpace/2)/ChessBoard.LineSpace;
  34. //判断此处是否可以落子
  35. if(pieces[x,y]==0){
  36. ChessBoard.DrawPiece(NextColor,x,y);
  37. pieces[x,y]=NextColor==Color.White?1:2;
  38. Steps[StepCount]=newPiece();
  39. Steps[StepCount].X=x;
  40. Steps[StepCount].Y=y;
  41. Steps[StepCount].Color=NextColor;
  42. NextColor=NextColor==Color.White?Color.Black:Color.White;
  43. //判断是否胜利
  44. if(IsWin(Steps[StepCount])){
  45. GameOver=true;
  46. }
  47. StepCount++;
  48. }
  49. }
  50. ///<summary>
  51. ///悔棋
  52. ///</summary>
  53. publicvoidRegretPiece(){
  54. if(StepCount==0)return;
  55. //落子标识设为0
  56. pieces[Steps[StepCount-1].X,Steps[StepCount-1].Y]=0;
  57. //改变当前颜色
  58. NextColor=NextColor==Color.White?Color.Black:Color.White;
  59. Steps[StepCount-1]=null;
  60. StepCount--;
  61. ChessBoard.Redraw(Steps);
  62. }
  63. ///<summary>
  64. ///判断是否五子连心
  65. ///</summary>
  66. ///<paramname="p"></param>
  67. ///<returns></returns>
  68. privateboolIsWin(Piecep){
  69. intx=p.X;
  70. inty=p.Y;
  71. boolwin=IsFive(x,y,0,1,p.Color);//纵向
  72. win|=IsFive(x,y,1,1,p.Color);//右下斜
  73. win|=IsFive(x,y,1,0,p.Color);//横向
  74. win|=IsFive(x,y,1,-1,p.Color);//左上斜
  75. returnwin;
  76. }
  77. privateboolIsFive(intx,inty,intoffsetX,intoffsetY,Colorc){
  78. intcount=1;
  79. intsearchX=x+offsetX;
  80. intsearchY=y+offsetY;
  81. boolstop=false;
  82. while(searchX>=0&&searchX<ChessBoard.Lines&&
  83. searchY>=0&&searchY<ChessBoard.Lines&&
  84. !stop){
  85. intintColor=c==Color.White?1:2;
  86. if(pieces[searchX,searchY]==intColor){
  87. count++;
  88. searchX+=offsetX;
  89. searchY+=offsetY;
  90. }else{
  91. stop=true;
  92. }
  93. }
  94. stop=false;
  95. searchX=x-offsetX;
  96. searchY=y-offsetY;
  97. while(searchX>=0&&searchX<ChessBoard.Lines&&
  98. searchY>=0&&searchY<ChessBoard.Lines&&
  99. !stop){
  100. intintColor=c==Color.White?1:2;
  101. if(pieces[searchX,searchY]==intColor){
  102. count++;
  103. searchX-=offsetX;
  104. searchY-=offsetY;
  105. }else{
  106. stop=true;
  107. }
  108. }
  109. returncount==5;
  110. }
  111. }
  112. }

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值