栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

五子棋(一)——VB.net

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

五子棋(一)——VB.net

19南师软工——人机交互作业

文章目录
  • 前言
  • 一、五子棋窗口弹开
    • frmstartGame窗口
    • frmGame窗口
    • 运行结果:
  • 二、画棋盘
    • 画线段
    • 数据
    • change()
  • 三、画棋子
    • 画一个棋子
    • 随鼠标画棋子
    • 具体代码


前言

用vb来实现简易的五子棋,我们人机交互大作业,两人一组完成。是很简陋的学生作品


一、五子棋窗口弹开

我们设置的窗口是一个开始新游戏的界面和一个打开之前某次的游戏记录,点击开始游戏的界面则弹出该窗体的一个子窗口,且可以同时开启多个子窗口

所以我们五子棋是有两个窗口,一个frmGame窗口,一个frmStartGame窗口。

frmstartGame窗口

对于frmStartGame窗口,我设置了一个好看的背景图片

放在resources文件夹里

窗口的具体代码:

Public Class frmStartGame
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles StartGame.Click
        CreateChild()
    End Sub
    Sub CreateChild()
        Dim game As Form = New frmGame
        '   Dim NewChild As Form = New frmGame
        Me.IsMdiContainer = True
        game.MdiParent = Me
        game.Show()
    End Sub

    Private Sub frmStartGame_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '继续游戏
    End Sub
End Class
frmGame窗口

另外一个窗口是这个样子的:

其中一个是listbox,一个是picturebox(背景色是黄色)

运行结果:

运行弹出的窗口:我们默认是最大化,可以更改

这个是点击开始新游戏之后


可以同时打开好几个游戏窗口

二、画棋盘 画线段

首先一个五子棋的棋盘是固定的15*15的规格,也就是我们要画15条横线和竖线
而画线段的函数是

 g.DrawLine(Pens.Black, x1, y, x2, y)

g是画笔,参数分别是颜色,起始坐标的xy值,终点坐标的xy值

数据

我们会怎么画一条线段了,那么,怎么来画一个棋盘呢

对于要在PictureBox里画出两组15的线段组,那么我们需要知道

	 Public Wxy As Integer   '行数
    Public gap As Integer  '棋子间的缝隙
    Public ChessR As Integer '棋子的半径
    Public CellSize As Integer  '格子的大小

具体是多少,可以直接制定比例

change()

当我们拖动窗口,画的画框会消失怎么办?

我的解决办法是chang事件

 Public Event Changed()  '当界面改变的响应事件

在frmGame窗口里建立一个响应的事件,每次改变就再画一次棋盘

    Private Sub ChessBox_Changed() Handles ChessBox.Changed
        Dim g As Graphics = PictureBox.CreateGraphics
        ChessBox.Draw(g)
    End Sub
三、画棋子 画一个棋子

在五子棋中的棋子,是一个实心的⚪,有黑白两种颜色

g.FillEllipse(Brushes.White, x, y, 2 * clsChessBox.ChessR, 2 * clsChessBox.ChessR)
g.FillEllipse(Brushes.Black, x, y, 2 * clsChessBox.ChessR, 2 * clsChessBox.ChessR)               

参数:

颜色,定义椭圆的边界矩形左上角的 xy值,定义椭圆的边界矩形的宽和高

随鼠标画棋子

处理的事件:鼠标点击picturebox
而在五子棋游戏中,点击棋盘,其实就是开始下棋了,既在chessbox中的Do函数

而,我的想法是将棋子的状态定义为黑白和没有棋子的状态,并且在最开始,就将创建所有的棋子。

Enum ChessFlag
    White
    Black
    Null
End Enum
QiHe = New List(Of Chess) '将棋盒初始化
For i = 0 To Wxy
     For j = 0 To Wxy
        Dim chess As New Chess(Me, i, j, ChessFlag.Null) '创建15*15个棋子
                QiHe.Add(chess) 'i是rol,j是col,链表的标是14*(i-1)+j-1
   	 Next
Next

所有当我们开始下棋时,只要将点的位置对于的棋子的状态改变就行

在五子棋在中,棋子变成黑色或者白色时,就不能再下到这个位置了,所以我们需要将Do设置为能有返回值的fuction,以此来判断,再次点击棋盘时,需不需要变换颜色

具体代码

frmGame窗口

  Private Sub PictureBox_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox.MouseDown
        Static Flag As ChessFlag = ChessFlag.Black '棋子初始是黑色的
        Dim i = ChessBox.Do(e.Location, Flag)
        If i = 0 Then
            If Flag = ChessFlag.Black Then
                Flag = ChessFlag.White
            Else
                Flag = ChessFlag.Black
            End If
        End If
    End Sub

    Private Sub frmGame_Load(sender As Object, e As EventArgs) Handles Me.Load
        ChessBox = New ClsChessBox(PictureBox, 14) '棋子都是十五行
    End Sub

    Private Sub ChessBox_Changed() Handles ChessBox.Changed
        Dim g As Graphics = PictureBox.CreateGraphics
        ChessBox.Draw(g)
    End Sub

clschessbox

Class ClsChessBox
    Public Wxy As Integer   '行数
    Public gap As Integer  '棋子间的缝隙
    Public ChessR As Integer '棋子的半径
    Public CellSize As Integer  '格子的大小
    Public QiHe As List(Of Chess) '记录所有的棋子,既旗盒


    Public blackchess As List(Of Chess) '记录已经下的黑棋,方便记录步骤悔棋
    Public whitechess As List(Of Chess)

    Public Event Changed()  '当界面改变的响应事件

    Public Sub New(ByVal pic As PictureBox, ByVal Wxy As Integer) '默认执行
        Me.Wxy = Wxy
        Dim BoxSize As Integer
        If pic.Width < pic.Height Then
            BoxSize = pic.Width
        Else
            BoxSize = pic.Height
        End If    '棋盘的大小定义,因为必须是正方形的
        CellSize = BoxSize * 1.6 / (Wxy + 1) '定义格子的比例
        gap = CellSize * 0.2  '棋子是格子的0.8倍
        ChessR = CellSize * 0.8 * 0.5
        QiHe = New List(Of Chess) '将棋盒初始化
        whitechess = New List(Of Chess)
        blackchess = New List(Of Chess)
        For i = 0 To Wxy
            For j = 0 To Wxy
                Dim chess As New Chess(Me, i, j, ChessFlag.Null) '创建15*15个棋子
                QiHe.Add(chess) 'i是rol,j是col,链表的标是15*(i-1)+j-1
            Next
        Next
    End Sub

    Public Sub Draw(ByVal g As Graphics)
        For i = 0 To Wxy
            ' 画水平线
            Dim y As Integer = i * CellSize + CellSize * 1
            Dim x1 As Integer = CellSize * 1
            Dim x2 As Integer = CellSize * Wxy + CellSize * 1
            g.DrawLine(Pens.Black, x1, y, x2, y)
        Next
        For i = 0 To Wxy
            ' 画垂直线
            Dim x As Integer = i * CellSize + CellSize * 1
            Dim y1 As Integer = CellSize * 1
            Dim y2 As Integer = CellSize * Wxy + CellSize * 1
            g.DrawLine(Pens.Black, x, y1, x, y2)
        Next
        For i = 0 To QiHe.Count - 1
            QiHe(i).Draw(g) '画棋子
        Next
    End Sub

    Function [Do](ByVal p As Point, ByVal Flag As ChessFlag) '下棋的操作
        Dim row As Integer = (p.Y - CellSize * 0.5) / CellSize
        Dim col As Integer = (p.X - CellSize * 0.5) / CellSize
        '计算行列号
        If (QiHe((15 * row) + col).flag = ChessFlag.Null) Then
            QiHe((15 * row) + col).flag = Flag '改变对于位置棋子的状态
            '当前加入步骤记录
            RaiseEvent Changed()
            [Do] = 0
        Else
            [Do] = 1
        End If
    End Function

End Class

chess

Enum ChessFlag
    White
    Black
    Null
End Enum
Class Chess
    Private clsChessBox As ClsChessBox
    Private row As Integer
    Private col As Integer '行列
    Public flag As ChessFlag '记录这个棋子的状态

    Public Sub New(clsChessBox As ClsChessBox, i As Integer, j As Integer, flag As ChessFlag)
        Me.clsChessBox = clsChessBox
        Me.row = i
        Me.col = j
        Me.flag = flag
    End Sub

    Friend Sub Draw(g As Graphics)
        If flag = ChessFlag.Black Or flag = ChessFlag.White Then
            '棋子是null的状态时,就不需要进行操作
            '棋子边界矩形左上角的坐标
            Dim x As Integer = col * clsChessBox.CellSize + clsChessBox.CellSize / 2
            Dim y As Integer = row * clsChessBox.CellSize + clsChessBox.CellSize / 2
            If flag = ChessFlag.White Then
                '画白棋
                g.FillEllipse(Brushes.White, x, y, 2 * clsChessBox.ChessR, 2 * clsChessBox.ChessR)
            ElseIf flag = ChessFlag.Black Then
                '画黑棋
                g.FillEllipse(Brushes.Black, x, y, 2 * clsChessBox.ChessR, 2 * clsChessBox.ChessR)
            End If
        End If
    End Sub
End Class
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/905034.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号