Visual Basic - угадай цветовую программу - PullRequest
1 голос
/ 30 марта 2009

Я пытаюсь сделать небольшую игру, в которой компьютер выдает случайный код цветов (красный, зеленый, желтый и синий), а затем вы должны попытаться угадать их ... Хотя у меня возникают проблемы с выбором цветов случайным образом.

Цвета - 4 цвета кнопок. Код состоит из четырех цветов. Затем игрок нажимает на некоторые кнопки чуть ниже и пытается угадать код. Каждый клик меняет цвет один раз. Если игрок угадает правильный цвет, который находится в правильном месте, то цвет раскрывается.

Пока у меня есть это:

(Проблема в том, что: Не удалось разрешить перегрузку, так как с этим аргументом нельзя вызвать Public '=': 'Public Shared Operator = (слева как System.Drawing.Color, справа как System.Drawing.Color) As Boolean': параметр соответствия аргумента 'right' не может быть преобразован от «Целое» до «Цвет». (См. Ниже цвет REM от 1 до конца REM) Проблема была сгенерирована компьютером, программа написана на Visual Basic, приложение Windows Form)

Dim turn = 0
Dim generator As New Random
Dim color1 = generator.Next(1, 4)
Dim color2 = generator.Next(1, 4)
Dim color3 = generator.Next(1, 4)
Dim color4 = generator.Next(1, 4)


Private Sub NewToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewToolStripMenuItem.Click

    REM color 1                 
    If color1 = 1 Then              
        color1 = Color.Red
    End If
    If color1 = 2 Then
        color1 = Color.Blue
    End If
    If color1 = 3 Then
        color1 = Color.Yellow
    End If
    If color1 = 4 Then
        color1 = Color.Green
    End If
    REM color 2
    If color2 = 1 Then
        color2 = Color.Red
    End If
    If color2 = 2 Then
        color2 = Color.Blue
    End If
    If color2 = 3 Then
        color2 = Color.Yellow
    End If
    If color2 = 4 Then
        color2 = Color.Green
    End If
    REM color 3
    If color3 = 1 Then
        color3 = Color.Red
    End If
    If color3 = 2 Then
        color3 = Color.Blue
    End If
    If color3 = 3 Then
        color3 = Color.Yellow
    End If
    If color3 = 4 Then
        color3 = Color.Green
    End If
    REM color 4
    If color4 = 1 Then
        color4 = Color.Red
    End If
    If color4 = 2 Then
        color4 = Color.Blue
    End If
    If color4 = 3 Then
        color4 = Color.Yellow
    End If
    If color4 = 4 Then
        color4 = Color.Green
    End If
  REM End
    Button1.BackColor = color1
    Button2.BackColor = color2
    Button3.BackColor = color3
    Button4.BackColor = color4

Ответы [ 6 ]

5 голосов
/ 30 марта 2009

color1, color2, color3, color4 являются целыми числами.

когда вы пишете: Тусклый цвет1 = генератор. Следующая (1, 4)

generator.Next создает целое число, поэтому color1 определяется как целое число. Когда ты пишешь color1 = Color.Red

это сбивает с толку, потому что вы пытаетесь установить Color для переменной, которая является целым числом.

Есть более понятные способы написания кода в целом, но вы, вероятно, могли бы сделать что-то вроде этого:


option explicit
Dim color_index as Integer
Dim color1 as System.Drawing.Color
color_index=generator.Next(1,4)
[choosing logic]
color1 = Color.red
[blah blah blah]
Button.backcolor = color1

Дополнительные примечания: как говорится в первом ответе, действительно есть лучший способ написать все это. Следующий псевдокод - это то, как я подхожу к проблеме: (извините, я не помню точный синтаксис VB на моей голове)


Button_Array = [Button1,Button2,Button3,Button4]
Color_array= [Color.red,Color.blue,Color.green,Color.yellow]
for i in 1 to 4
   color_index=generator.Next(1,4)
   Button_Array[i].backcolor = Color_array[color_index]
endfor

Это намного удобочитаемее и удобнее в обслуживании. (подумайте, сколько строк нужно добавить, если вы хотите добавить 5-ю кнопку или 5-й цвет в исходном списке или в моем списке псевдокода)

4 голосов
/ 30 марта 2009

Проблема заключается в том, что вы устанавливаете colorN (целое число) для объекта Color.

Как дополнение к отличным ответам уже здесь ...

generator.Next(1,4)

будет возвращать значения только от 1 до 3 !

То, что вы действительно хотите, это:

generator.Next(1,5)
4 голосов
/ 30 марта 2009

Массивы в Visual Basic

Я не знаю, в чем ваша конкретная проблема, но этот массивный переключатель должен быть просто массивом цветов. Если по какой-то причине вы не можете сравнить цвета с =, сделайте код массивом целых чисел, работайте с целыми числами и ищите цвета в массиве, когда вам нужно их отобразить.

0 голосов
/ 31 марта 2009

Спасибо за вашу помощь, но я нашел некоторую помощь от другого парня, Клинта из "Coding4fun.com". Работай правильно сейчас. То, что я сделал, было, как сказал Йенфест сначала, сбить компьютер с толку, назвав color1, например, целым числом, а затем запросить цвет. То, что я сделал сейчас, было так же, как BlueMonkMN, который должен был начать дело, т.е.

Private Function getrandomcolour() As Color
    Select Case generator.[Next](1, 6)
        Case 1
            Return Color.Red
            Exit Select
        Case 2
            Return Color.Green
            Exit Select
        Case 3
            Return Color.Yellow
            Exit Select
        Case 4
            Return Color.Blue
            Exit Select
        Case 5
            Return Color.Pink
            Exit Select
        Case 6
            Return Color.Turquoise
            Exit Select
    End Select
    If Button1.BackColor = Button2.BackColor Then
        getrandomcolour()
    End If
    If Button3.BackColor = Button4.BackColor Then
        getrandomcolour()
    End If
    If Button1.BackColor = Button3.BackColor Then
        getrandomcolour()
    End If
    If Button2.BackColor = Button3.BackColor Then
        getrandomcolour()
    End If
End Function

Спасибо за ваши прекрасные ответы в любом случае!

0 голосов
/ 30 марта 2009

Вы должны создать словарь цветов, подобный этому:

private _Generator as Random
private _Colors as Dictionary(of Integer, Color)
private _Color1 as Color
private _Color2 as Color
private _Color3 as Color
private _Color4 as Color


Public Sub New()
    _Generator = new Random()
    _Colors.Add(1, Colors.Red)
    _Colors.Add(2, Colors.Blue)
    _Colors.Add(3, Colors.Yellow)
    _Colors.Add(4, Colors.Green)    
End Sub

Private Sub NewToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NewToolStripMenuItem.Click

    _Color1 = _Colors(_Generator.Next(1, 4))
    _Color2 = _Colors(_Generator.Next(1, 4))
    _Color3 = _Colors(_Generator.Next(1, 4))
    _Color4 = _Colors(_Generator.Next(1, 4))

    Button1.BackColor = _Color1
    Button2.BackColor = _Color2
    Button3.BackColor = _Color3
    Button4.BackColor = _Color

End sub
0 голосов
/ 30 марта 2009

Когда вы Dim color1 = generator.Next (1, 4), это неявно определяет color1 как целое число, потому что это то, что возвращает generator.Next. Я предлагаю (для вашего же блага и для тех, кто читает ваш код), чтобы вы использовали «As» для явного определения типа ваших переменных.

Похоже, вы пытаетесь использовать одну и ту же переменную color1, чтобы содержать как целочисленную, так и нумерованную ("Color") версию вашего цвета. Это может привести к путанице, потому что перечисленные значения также могут быть напрямую преобразованы в целые числа и обратно, если вы явно заставите это произойти, и тогда вы не будете знать, представляет ли конкретное значение вашу собственную систему цветового кодирования или систему. Я предлагаю вам создать функцию, которая генерирует 1 из 4 случайных цветов, например:

Function GenerateColor() As Color
    Select Case generator.Next(1,5)
       Case 1
          Return Color.Red
       Case 2
          Return Color.Blue
       Case 3
          Return Color.Yellow
       Case 4
          Return Color.Green
    End Select
End Function

И используйте эту функцию для инициализации случайных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...