19南师软工——人机交互作业
前言
用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文章来源:https://www.toymoban.com/news/detail-452771.html
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文章来源地址https://www.toymoban.com/news/detail-452771.html
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
到了这里,关于五子棋(一)——VB.net的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!