19南師軟工——人機(jī)交互作業(yè)
前言
用vb來實(shí)現(xiàn)簡易的五子棋,我們?nèi)藱C(jī)交互大作業(yè),兩人一組完成。是很簡陋的學(xué)生作品
一、五子棋窗口彈開
我們設(shè)置的窗口是一個(gè)開始新游戲的界面和一個(gè)打開之前某次的游戲記錄,點(diǎn)擊開始游戲的界面則彈出該窗體的一個(gè)子窗口,且可以同時(shí)開啟多個(gè)子窗口
所以我們五子棋是有兩個(gè)窗口,一個(gè)frmGame窗口,一個(gè)frmStartGame窗口。
frmstartGame窗口
對于frmStartGame窗口,我設(shè)置了一個(gè)好看的背景圖片
放在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
'繼續(xù)游戲
End Sub
End Class
frmGame窗口
另外一個(gè)窗口是這個(gè)樣子的:
其中一個(gè)是listbox,一個(gè)是picturebox(背景色是黃色)
運(yùn)行結(jié)果:
運(yùn)行彈出的窗口:我們默認(rèn)是最大化,可以更改
這個(gè)是點(diǎn)擊開始新游戲之后
可以同時(shí)打開好幾個(gè)游戲窗口
二、畫棋盤
畫線段
首先一個(gè)五子棋的棋盤是固定的15*15的規(guī)格,也就是我們要畫15條橫線和豎線
而畫線段的函數(shù)是
g.DrawLine(Pens.Black, x1, y, x2, y)
g是畫筆,參數(shù)分別是顏色,起始坐標(biāo)的xy值,終點(diǎn)坐標(biāo)的xy值
數(shù)據(jù)
我們會(huì)怎么畫一條線段了,那么,怎么來畫一個(gè)棋盤呢
對于要在PictureBox里畫出兩組15的線段組,那么我們需要知道
Public Wxy As Integer '行數(shù)
Public gap As Integer '棋子間的縫隙
Public ChessR As Integer '棋子的半徑
Public CellSize As Integer '格子的大小
具體是多少,可以直接制定比例
change()
當(dāng)我們拖動(dòng)窗口,畫的畫框會(huì)消失怎么辦?
我的解決辦法是chang事件
Public Event Changed() '當(dāng)界面改變的響應(yīng)事件
在frmGame窗口里建立一個(gè)響應(yīng)的事件,每次改變就再畫一次棋盤
Private Sub ChessBox_Changed() Handles ChessBox.Changed
Dim g As Graphics = PictureBox.CreateGraphics
ChessBox.Draw(g)
End Sub
三、畫棋子
畫一個(gè)棋子
在五子棋中的棋子,是一個(gè)實(shí)心的?,有黑白兩種顏色
g.FillEllipse(Brushes.White, x, y, 2 * clsChessBox.ChessR, 2 * clsChessBox.ChessR)
g.FillEllipse(Brushes.Black, x, y, 2 * clsChessBox.ChessR, 2 * clsChessBox.ChessR)
參數(shù):
顏色,定義橢圓的邊界矩形左上角的 xy值,定義橢圓的邊界矩形的寬和高
隨鼠標(biāo)畫棋子
處理的事件:鼠標(biāo)點(diǎn)擊picturebox
而在五子棋游戲中,點(diǎn)擊棋盤,其實(shí)就是開始下棋了,既在chessbox中的Do函數(shù)
而,我的想法是將棋子的狀態(tài)定義為黑白和沒有棋子的狀態(tài),并且在最開始,就將創(chuàng)建所有的棋子。
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) '創(chuàng)建15*15個(gè)棋子
QiHe.Add(chess) 'i是rol,j是col,鏈表的標(biāo)是14*(i-1)+j-1
Next
Next
所有當(dāng)我們開始下棋時(shí),只要將點(diǎn)的位置對于的棋子的狀態(tài)改變就行
在五子棋在中,棋子變成黑色或者白色時(shí),就不能再下到這個(gè)位置了,所以我們需要將Do設(shè)置為能有返回值的fuction,以此來判斷,再次點(diǎn)擊棋盤時(shí),需不需要變換顏色
具體代碼
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文章來源:http://www.zghlxwxcb.cn/news/detail-452771.html
Class ClsChessBox
Public Wxy As Integer '行數(shù)
Public gap As Integer '棋子間的縫隙
Public ChessR As Integer '棋子的半徑
Public CellSize As Integer '格子的大小
Public QiHe As List(Of Chess) '記錄所有的棋子,既旗盒
Public blackchess As List(Of Chess) '記錄已經(jīng)下的黑棋,方便記錄步驟悔棋
Public whitechess As List(Of Chess)
Public Event Changed() '當(dāng)界面改變的響應(yīng)事件
Public Sub New(ByVal pic As PictureBox, ByVal Wxy As Integer) '默認(rèn)執(zhí)行
Me.Wxy = Wxy
Dim BoxSize As Integer
If pic.Width < pic.Height Then
BoxSize = pic.Width
Else
BoxSize = pic.Height
End If '棋盤的大小定義,因?yàn)楸仨毷钦叫蔚?/span>
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) '創(chuàng)建15*15個(gè)棋子
QiHe.Add(chess) 'i是rol,j是col,鏈表的標(biāo)是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
'計(jì)算行列號(hào)
If (QiHe((15 * row) + col).flag = ChessFlag.Null) Then
QiHe((15 * row) + col).flag = Flag '改變對于位置棋子的狀態(tài)
'當(dāng)前加入步驟記錄
RaiseEvent Changed()
[Do] = 0
Else
[Do] = 1
End If
End Function
End Class
chess文章來源地址http://www.zghlxwxcb.cn/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 '記錄這個(gè)棋子的狀態(tài)
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的狀態(tài)時(shí),就不需要進(jìn)行操作
'棋子邊界矩形左上角的坐標(biāo)
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
到了這里,關(guān)于五子棋(一)——VB.net的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!