2009-03-30 7 views
1

J'essaie de faire un petit jeu dans lequel l'ordinateur donne un code de couleurs aléatoire (rouge vert jaune et bleu) et alors vous devez essayer de les deviner ... J'ai des problèmes rendre les couleurs aléatoires cependant.Visual Basic - Devinez le programme de couleur

Les couleurs sont la couleur de fond de 4 boutons. Le code est de quatre couleurs. Le joueur clique ensuite sur certains boutons juste en dessous et essaie de deviner le code. Chaque clic change la couleur une fois. Si le joueur devine la bonne couleur qui est au bon endroit, alors la couleur est révélée.

Jusqu'à présent, j'ai ceci:

(problème est: résolution de surcharge a échoué car aucun public '=' peut être appelée avec ces arguments: «Opérateur public Shared = (gauche comme System.Drawing.Color, droit Comme System.Drawing.Color) As Boolean ': Argument correspondant au paramètre' right 'ne peut pas convertir de' Integer 'à' Color '. (Voir ci-dessous REM couleur 1 à REM End) Problème a été généré par l'ordinateur, programme écrit en Visual Basic , fenêtres application de formulaire)

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 

Répondre

4

Arrays in Visual Basic

Je ne sais pas quel est votre problème spécifique, mais ce commutateur massif devrait être juste un tableau de couleurs. Si vous ne pouvez pas comparer les couleurs avec = pour une raison quelconque, faites du code un tableau d'entiers, et travaillez dans des entiers, et recherchez les couleurs dans un tableau lorsque vous avez besoin de les afficher.

4

Le problème réside dans le fait que vous définissez colorN (un entier) à un objet Color.

Comme un additif aux excellentes réponses déjà ici ...

generator.Next(1,4) 

ne renverra des valeurs comprises entre 1 et 3!

Qu'est-ce que vous voulez vraiment est:

generator.Next(1,5) 
5

color1, couleur2, color3, color4 sont des nombres entiers.

quand on écrit: Dim color1 = generator.Next (1, 4)

generator.Next produit un nombre entier, de sorte que color1 est défini comme un nombre entier. Lorsque vous écrivez color1 = Color.Red

il est confus, car vous essayez de définir une couleur sur une variable qui est un nombre entier.

Il y a des moyens plus propres pour écrire le code en général, mais vous pourriez probablement faire quelque chose comme ceci:


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 

Note complémentaire: comme premier dit réponse, il y a vraiment une meilleure façon d'écrire cette chose . Le pseudo-code suivant est comment j'aborder le problème: (désolé, je ne me souviens pas syntaxe exacte VB du haut de ma tête)


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 

qui est beaucoup plus facile à lire, et plus maintenable. (considérez combien de lignes vous devez ajouter si vous voulez ajouter un 5ème bouton, ou une 5ème couleur, dans ma liste d'origine, ou ma liste de pseudo-code)

0

Lorsque vous Dim color1 = generator.Next (1 , 4), qui définit implicitement color1 comme un entier parce que c'est ce que le générateur.Next renvoie. Je suggère (pour votre propre bénéfice et celui de quiconque lisant votre code) que vous utilisiez "As" pour définir explicitement le type de vos variables.

Il semble que vous essayez d'utiliser la même variable color1 pour contenir à la fois la version entière et la version énumérée ("Couleur") de votre couleur. Cela va devenir assez confus parce que les valeurs énumérées peuvent aussi être directement converties en entiers si vous forcez explicitement cela, et vous ne saurez pas si une valeur particulière représente votre propre système de codage couleur ou celui du système. Je vous suggère de créer une fonction qui génère 1 de 4 couleurs aléatoires comme ceci:

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 

et utiliser cette fonction pour initialiser vos valeurs aléatoires.

0

Vous devez construire un dictionnaire de couleurs comme celui-ci:

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

Merci pour votre aide, mais je l'ai trouvé un peu d'aide d'un autre gars, Clint de « Coding4fun.com ». Travaillez correctement maintenant. Ce que j'avais fait était comme si le premier avait dit que l'ordinateur était confus en appelant color1 par exemple un entier puis en demandant une couleur. Ce que j'ai fait maintenant était juste comme BlueMonkMN qui devait commencer une affaire ie.

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 

Merci pour vos belles réponses quand même!