C# 实现五子棋游戏(一)

说到五子棋,相比大家都不会陌生;在一个棋盘上面,双方各执黑白一棋,首先在棋盘上面完成五个相同颜色的棋子连成一线,那就获胜。

棋盘与棋子

首先,新建一个项目,取名字为:Gomoku。棋盘的话,可以使用C#的内置绘图工具,通过程序去实现;也可以直接使用图片去作为背景,当做棋盘和棋子。这里选择第二种,把素材导入到新建的项目中。直接在项目的根目录下面新建资源文件夹,放入。

接着把放入项目中的资源文件夹里面的素材加入到项目里面:
C# 实现五子棋游戏(一)_第1张图片

选择Resource.resx文件,双击,添加资源,添加现有文件,到项目的目录里面选择已经导入的资源文件夹,确认。Z在Resource.resx文件视窗中,就会出现已经加入到项目的资源文件。

接着到Form窗体中,修改窗体的背景图片,也可以在窗体上面加上一个pictureBox(存放图片的组件),使其填充整个窗体,然后添加图片;这里直接选择第一种(因为之前里面导入了资源):
C# 实现五子棋游戏(一)_第2张图片

最后,棋子使用pictureBox呈现,在这个控件里面呈现图片可以直接修改Image属性,选择是上面刚开始导入的资源(资源存放位置);或者是程序使用代码修改Image属性:pictureBox1.Image=Properties.Resources.blackPiece // 图片资源的存档,注意修改一下pictureBox的几个属性:sizeMode(图片显示的模式,一般为StrechImage,安装原始大小显示),backColor(图片的背景颜色),size(图片大小);实现的效果如下图:
C# 实现五子棋游戏(一)_第3张图片

动态的创建棋子

在第一步部分,是使用pictureBox组件的方式,静态的引入棋子的图片,怎么样使用一个类去随着鼠标的点击动态的创建棋子呢?

首先,在项目中创建一个Piece的棋子类,然后使其继承PictureBox,获得对应的属性和方法;

class Piece:PictureBox
{  
// 构造函数,传入坐标值x,y
       public Piece(int x,int y)
      {

       }
}

接着在Form窗体里面新建一个Piece实例对象。

public Form()
{
     InitializeConponent();
// controls表示这个窗体的组件;add方法是在窗体中添加组件
     this.Controls.Add(new Piece(10,20));
}

C# 实现五子棋游戏(一)_第4张图片
然后在Piece类中的构造方法中,去修改继承的pictureBox默认属性(需要引入System.Drawing命名空间):

public Piece(int x,int y)
{
      this.BackColor = Color.Transparent; // 背景颜色
      this.Location = new Point(x,y); // 位置x,y是一个Point的实例对象
      this.Size = new Size(50,50);// 大小
}

现在就基本的把一个棋子的大小,背景颜色,位置为设置好了,就差棋子的颜色——黑,白;根据前面的继承思想(继承PictureBox),再分别新建黑棋类(BlackPiece)和白旗类(WhitePiece)去继承Piece类:

class BlackPiece:Piece
{
     public BlackPiece(int x,int y):base(x,y)
     {
                this.Image = Properties.Resources.black; // 素材
      }
}

因为黑棋类继承的是棋子的类,棋子类中的构造函数需要传入两个参数,且只有这一个构造函数;所以在继承棋子类时,需要把黑棋接收到的参数传递回给父类,防止没有回传参数,父类不知道需要创建一个什么样的pictureBox对象,从而出现错误。

在Form视窗中,修改代码,创建黑棋对象,而不是棋子对象,类似的可以创建白旗的类。

public Form()
{
     InitializeConponent();
// controls表示这个窗体的组件;add方法是在窗体中添加组件
     this.Controls.Add(new BlackPiece(10,20));
     this.Controls.Add(new WhitePiece(100,200));
}

C# 实现五子棋游戏(一)_第5张图片

最后,最好是把棋子类修改为抽象类:abstract;因为,不需要创建棋子类,这只是一个中间的桥梁,并不需要实例化。

你可能感兴趣的:(C#)