ゲーム実装で身に付くプログラミング 第13回

背景色を反映させる

背景色を反映させる

このゲームの趣旨でもある背景色を反映させます(図3)。「rgb」リスト配列の要素をランダムに初期化して初期背景色を決め、色ブロックをクリックしたらrgbリスト配列の要素をインクリメントし、各要素が同値になったら背景色を真っ白にしてステージクリアです。ステージクリア画面とサウンドは省略しました。

図3:背景色を反映

・サンプルコード「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で対応します。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored