背景色を反映させる
背景色を反映させる
このゲームの趣旨でもある背景色を反映させます(図3)。「rgb」リスト配列の要素をランダムに初期化して初期背景色を決め、色ブロックをクリックしたらrgbリスト配列の要素をインクリメントし、各要素が同値になったら背景色を真っ白にしてステージクリアです。ステージクリア画面とサウンドは省略しました。
・サンプルコード「ColorBlock.vb」ファイル
Public Class ColorBlock
(中略)
Public Sub New(imageCanvas As Canvas, col As Integer, p As MainWindow)
(中略)
End Sub
Private Function GetImg(col As Integer) As Image
(中略)
End Function
Public Function Update() As Integer
(中略)
End Function
Private Sub Img_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
x = 100000
parent.rgb(color) += 1
End Sub
End Class【サンプルコードの解説】
「ColorBlock」クラスで、色ブロックがクリックされると「Img_MouseLeftButtonDown」メソッドが呼ばれて色ブロックを画面外(x=100000)に移動し、MainWindowのrgbリスト配列のcolorインデックスの要素をインクリメントします。
・サンプルコード「MainWindow.xaml.vb」ファイル
Imports System.Windows.Threading
Class MainWindow
Property colors As List(Of ColorBlock) = New List(Of ColorBlock)()
Private WithEvents timer As New DispatcherTimer()
Private stage As Integer = 2
Public rgb(2) As Integer
Private Shared ReadOnly rnd As New Random()
Public Sub New()
InitializeComponent()
End Sub
Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
timer.Interval = TimeSpan.FromMilliseconds(50)
End Sub
Private Sub Title_MouseLeftButtonUp(sender As Object, e As MouseButtonEventArgs)
(中略)
End Sub
Private Sub Init()
rgb(0) = 0
rgb(1) = 0
rgb(2) = 0
While rgb(0) = rgb(1)
rgb(0) = rnd.Next(0, stage)
rgb(1) = rnd.Next(0, stage)
rgb(2) = rnd.Next(0, stage)
End While
ImageCanvas.Children.Clear()
colors.Clear()
For i As Integer = 0 To stage * 3 - 1
colors.Add(New ColorBlock(ImageCanvas, i Mod 3, Me))
Next
End Sub
Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles timer.Tick
Dim flg As Integer = 0
For Each col In colors
flg += col.Update()
Next
If flg = 0 Then
timer.Stop()
TitleGrid.Visibility = Visibility.Visible
ImageCanvas.Visibility = Visibility.Hidden
End If
If SetBgColor() Then
stage += 1
Init()
End If
End Sub
Private Function SetBgColor() As Boolean
Dim indexSorted = RGB.
Select(Function(v, idx) idx).
OrderByDescending(Function(idx) RGB(idx)).
ToArray()
Dim i As Integer = 255 \ RGB(indexSorted(0))
Dim r As Integer = i * RGB(0)
Dim g As Integer = i * RGB(1)
Dim b As Integer = i * RGB(2)
ImageCanvas.Background = New SolidColorBrush(
Color.FromRgb(r, g, b)
)
If r = g AndAlso g = b Then
Return True
End If
Return False
End Function
End Class【サンプルコードの解説】
MainWindowクラスで、rgbリスト配列と乱数のrndプロパティを宣言します。
「Init」メソッドでrgbリスト配列の3要素をランダムな整数値にセットします。
「Timer_Tick」メソッドで背景色をセットする「SetBgColor」関数を呼び出し、真っ白ならstageをインクリメントして初期化し、次のステージに遷移します。
「SetBgColor」関数では、例えばrgbの各要素が(0,3,1)なら最大要素3を分母にして(r,g,b)=(255*0/3,255*3/3,255*1/3)という背景色になります。r、g、bが同値ならTrueを戻り値に返し、そうでなければFalseを返します。
「イッチニッチイップン」という絵本のアイデアを考えました。1日1分ずつ絵を描いたり、文章を書いたり、音楽をしたり、計算したり、筋トレしたり、勉強したり…と、色々ちょっとずつしようというメソッドです。孫正義は大学で世界一勉強したと豪語していますが、1日5分だけ発明のアイデアを考えて日英翻訳機を作らせたそうです。「イッチニッチゴッフン」にしようかな?
おわりに
今回はプログラミング言語「Visual Basic.NET」のUIフレームワーク「WPF」で「Color」ゲームをプログラミングしました。プログラミング言語「C#」でプログラミングする人の方が多いでしょうから、その場合は移植してみてください。ほぼ1:1で対応します。
この記事をシェアしてください
