最近利用业余时间写了一个简单的五子棋游戏,没有利用深层次的面向对象技术,自学一年,代码和程序设计有不妥之处,还望大神指出,先看下实现的功能,三个button按钮,黑棋和白棋选择先出,和重置。

其他的不多说了,直接上全部代码(通过测试)。计算输赢的时候,左斜和右斜用了数学y=kx+b的线性函数计算。

private Image myImage;

///

/// 初始化背景数组

/// int[x,y] x为行 y为列

///

private int[,] bgGround = new int[11, 11]; /*{

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0},

{0,0,0,0,0,0,0,0,0,0,0}

};*/

private int CurrentX;//当前bgGround的x行

private int CurrentY;//当前bgGround的y列

private bool IsWhite = false;//判断白棋还是黑棋先

private bool IsOver = false;//记录游戏是否结束

private void Form1_Load(object sender, EventArgs e)

{

myImage = new Bitmap(panel1.Width, panel1.Height);

}

protected override void OnPaint(PaintEventArgs e)

{

Draw();

base.OnPaint(e);

}

///

/// 画棋盘

///

private void Draw()

{

Graphics g = Graphics.FromImage(myImage);

g.Clear(this.BackColor);

g.FillRectangle(Brushes.White,new Rectangle(new Point(10,10),new Size(400,400)));

//循环次数应比背景bgGround行、列少1

for (int i = 0; i < 10; i++)

{

for (int j = 0; j < 10; j++)

{

g.DrawRectangle(new Pen(Brushes.Black), i * 40 + 10, j * 40 + 10, 40, 40);

}

}

Graphics gg = panel1.CreateGraphics();

gg.DrawImage(myImage, 0, 0);

}

private void panel1_MouseClick(object sender, MouseEventArgs e)

{

if (IsOver)

{

return;

}

Graphics g = panel1.CreateGraphics();

//设置当鼠标点击坐标在某一落棋点坐标想x,y的+-10的范围内即可落子

int x = (e.X - 10) % 40;

int y = (e.Y - 10) % 40;

if (x > 30)

{

x = (e.X - 10) / 40 + 1;

}

else

{

x = (e.X - 10) / 40;

}

if (y > 30)

{

y = (e.Y - 10) / 40 + 1;

}

else

{

y = (e.Y - 10) / 40;

}

if (bgGround[x, y] == 0)

{

if (IsWhite)

{

DrawChess(g, x, y, new Pen(Brushes.White), Brushes.White, 1);

IsWhite = false;

JudgeResult(1);

}

else

{

DrawChess(g, x, y, new Pen(Brushes.Black), Brushes.Black, 2);

IsWhite = true;

JudgeResult(2);

}

}

}

///

/// 判断输赢

///

/// 1为白棋 2为黑棋

private void JudgeResult(int flag)

{

int x = CurrentX;

int y = CurrentY;

int MinXNum = 0;

int MaxXNum = 0;

int count = 0;

if (x > 4)

{

MinXNum = x - 4;

if (x + 4 > 10)

{

MaxXNum = 10;

}

else

{

MaxXNum = x + 4;

}

}

else

{

MaxXNum = x + 4;

}

int MinYNum = 0;

int MaxYNum = 0;

if (y > 4)

{

MinYNum = y - 4;

if (y + 4 > 10)

{

MaxYNum = 10;

}

else

{

MaxYNum = y + 4;

}

}

else

{

MaxYNum = y + 4;

}

#region //横向

for (int i = MinXNum; i < MaxXNum+1; i++)

{

if (bgGround[i, y] == flag)

{

count++;

if (count > 4)

goto Label;

}

else

{

count = 0;

if (i > MaxXNum - 4)

break;

}

}

#endregion

#region //竖向

for (int i = MinYNum; i < MaxYNum+1; i++)

{

if (bgGround[x, i] == flag)

count++;

else

{

count = 0;

if (i > MaxYNum - 4)

break;

}

if (count > 4)

goto Label;

}

#endregion

//左斜

for (int i = MinXNum; i < MaxXNum+1; i++)

{

if (CurrentX + CurrentY - i < 0)

break;

if (CurrentX + CurrentY - i <= 10)

{

if (bgGround[i, CurrentX + CurrentY - i] == flag)

{

count++;

}

else

{

count = 0;

if (i > MaxYNum - 4)

break;

}

}

if (count > 4)

goto Label;

}

//右斜

for (int i = MinXNum; i < MaxXNum+1; i++)

{

if (i < CurrentX - CurrentY)

break;

if (i + CurrentY - CurrentX > 10)

break;

if (bgGround[i, i + CurrentY - CurrentX] == flag)

{

count++;

}

else

{

count = 0;

if (i > MaxYNum - 4)

break;

}

if (count > 4)

goto Label;

}

Label:

if (flag == 1 && count > 4)

{

IsOver = true;

MessageBox.Show("白棋赢,游戏结束");

return;

}

else if (flag == 2 && count > 4)

{

IsOver = true;

MessageBox.Show("黑棋赢,游戏结束");

return;

}

else

{

IsOver = false;

}

}

///

/// 画棋子

///

///

/// bgGround中x位置

/// bgGround中y位置

/// 画笔

/// 棋子颜色

/// 1为白棋 2为黑棋

private void DrawChess(Graphics g, int x, int y, Pen p, Brush brush, int flag)

{

CurrentX = x; CurrentY = y;

bgGround[x, y] = flag;

g.DrawEllipse(p, x * 40, y * 40, 20, 20);

g.FillEllipse(brush, x * 40, y * 40, 20, 20);

}

///btn_Chess_Click是黑棋先和白棋先按钮的共同事件,设置白棋先button的tag值为1,黑棋先button的tag值为2

///

/// 判断哪个先下 设置button控件的tag值

///

///

///

private void btn_Chess_Click(object sender, EventArgs e)

{

Button btn = sender as Button;

string tag = btn.Tag.ToString();

if (tag.Equals("1"))//白棋先

{

IsWhite = true;

}

else//黑棋先 tag=2

{

IsWhite = false;

}

}

///

/// 重置

///

///

///

private void btn_reset_Click(object sender, EventArgs e)

{

IsOver = false;

Draw();

bgGround = new int[11, 11];

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

五子棋下法C#语言,C#实现简单的五子棋游戏相关推荐

  1. c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

  2. 一个简单的c 游戏编程语言,编程达人 c语言写一个简单的小游戏-推箱子

    在学习C语言之后,写了一个简单的小游戏来锻炼自己的代码以及C语言知识的掌握能力. 推箱子作为手机上最常见的简单游戏,其代码也相对简单,想法也比较简单,下面为其代码和运行图. /************ ...

  3. 完整版! 大一新手C语言数据结构实现简单贪吃蛇游戏

    大一新手C语言数据结构实现简单贪吃蛇游戏含源代码 贪吃蛇 1.前言简述 2.编写语言及工具 3.游戏的头文件代码(.h) 3.1map.h 3.2snake.h 3.3Food.h 4.游戏的源文件代 ...

  4. 【C语言】实现简单的五子棋

    用c语言实现简单的五子棋 (2019年10月文档) ps:那时候刚刚学会用走迷宫就自己从零开始实现了下五子棋,这里下棋的思路现在想起来也特别新奇,并不是简单的输入坐标下棋,我一开始就琢磨出了wasd去 ...

  5. C语言设计的简单2048小游戏

    //***************************************************************************// //****************** ...

  6. 用C语言实现一个简单的扫雷游戏

    初学者学习了一些c语言基础用法以后需要尝试实战练习,扫雷小游戏就十分适合.因为他能用到很多以前学习的知识,用来巩固再好不过了 废话不多说 开干 我们首先要有一个清晰的思路 和其他游戏一样我们打开游戏第 ...

  7. 用C语言写一个简单的小游戏——猜数字

    我们该如何设计这个程序? 1.首先应该打印一个菜单,让玩家选择玩游戏或者退出游戏 2.当玩家选择玩游戏,我们让电脑生成一个1~100的随机数,让玩家去猜 3.如果玩家猜的数比电脑生成的数大,我们提示猜 ...

  8. c语言编程实现简单三子棋游戏

    分别创建test.c   game.c 两个源文件,以及game.h头文件   这里的三子棋游戏是指棋盘为3*3,玩家与电脑之间的对决,先将各自的棋下为一排(横/竖/斜)者获胜,电脑所    下位置是 ...

  9. 用C语言做很简单的飞机游戏

    首先,可以通过第一步的,通过空格和换行来显示出飞机. #include <stdio.h> #include <stdlib.h>int main() {int pox,poy ...

最新文章

  1. [感动]看来的故事:小孩和鱼
  2. java清除浏览器记录_Javascript脚本之清除浏览器历史数据
  3. 读取中文目录(python)
  4. 如何判断Marketing Cloud里OData服务调用成功了
  5. http --- 公开密钥加密(非对称加密)的几个概念
  6. linux中显示目录名,在linux下显示中文目录和文件名
  7. 实时仪表板的Postgres通知
  8. 安装Matlab2016a中文破解版教程
  9. paraview用户指南
  10. android qq 登录 qq号,手机QQ异常登录怎么办 QQ帐号无法登录解决办法
  11. linux的cpu使用率100%?
  12. 福昕扫描王将取代扫描仪,OCR文字识别应用办公标配
  13. 全网推广有哪些推广方式?
  14. Java反射之Method对象详解
  15. 计算机小学期实践报告,小学期计算机实践报告
  16. qt QTableWidgetItem设置文字样式
  17. 锐捷交换机系统版本升级11.X平台
  18. oxidized配置(docker版)
  19. 读后感《孤独的张小龙,在商业中走出孤独》
  20. 全基因组测序 从头测序(de novo sequencing) 重测序(re-sequencing)

热门文章

  1. 文件上传/下载接口(超简单的教程来了)
  2. 推荐几个人免费好用的ftp上传工具
  3. 多彩型工作汇报年终总结PPT模板
  4. C++实现对象行为型-迭代器模式
  5. HTML精美大转盘源码
  6. iOS 深入理解列表卡顿原理和滑动优化方案
  7. 判刑形状模型_离散形状建模示规范表面模型.doc
  8. SAP EWM后台表
  9. excel小写转大写公式_英文首字母大写,你还在手动切换大小写输入吗?
  10. java设置项目为library_如何从Eclipse设置java.library.path