[MOD]: Los códigos deben ir en su respectiva etiqueta.
Hola a todos, basicamente el programa que estoy haciendo es un AHORCADO, mi problema es el siguiente:
En un textbox yo escribo la letra que deseo ingresar para verificar si esta o no en la palabra, el tema es que si la palabra es por ejemplo HIPOPOTAMO, esta tiene 3 "O", y yo obviamente al colocar "O" me escribe solo la primera que encuentra.
la porcion de codigo con mi problema esta aca:
private void button3_Click(object sender, EventArgs e)
{
letraIngresada = textBoxLetra.Text;
TextBox[] palabraFinal = { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10, textBox11 };
if (palabraElegida.IndexOf(letraIngresada)>=0)
{
int x = 0;
x = palabraElegida.IndexOf(letraIngresada);
palabraFinal[x].Text = textBoxLetra.Text;
for (int i = 0; i < palabraFinal.Length; i++)
{
if (palabraFinal[i].Text=="")
{
x++;
x=palabraElegida.IndexOf(letraIngresada,x);
palabraFinal[x].Text = textBoxLetra.Text;
}
}
}
else
{
cont++;
CambiarImagen(cont);
}
}
public partial class Form1 : Form
{
string[] animales = { "rinoceronte", "hipopotamo", "tortuga", "flamenco", "avestruz" };
string[] FruVer = { "zanahoria", "calabacin", "puerro", "remolacha", "aceituna" };
string[] objetos = { "ventilador", "heladera", "modular", "mochila", "camperon" };
string[] paises = { "angola", "australia", "nicaragua", "tanzania", "singapur" };
int bus;
string palabraElegida;
string letraIngresada;
int cont = 0;
public Form1()
{
InitializeComponent();
}
public void Buscar_palabra(string[] vec)
{
Random buscar = new Random();
bus = buscar.Next(5);
palabraElegida = vec[bus];
label_Letra.Text= vec[bus];
}
private void button3_Click(object sender, EventArgs e)
{
letraIngresada = textBoxLetra.Text;
TextBox[] palabraFinal = { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10, textBox11 };
if (palabraElegida.IndexOf(letraIngresada)>=0)
{
int x = 0;
x = palabraElegida.IndexOf(letraIngresada);
palabraFinal[x].Text = textBoxLetra.Text;
for (int i = 0; i < palabraFinal.Length; i++)
{
if (palabraFinal[i].Text=="")
{
x++;
x=palabraElegida.IndexOf(letraIngresada,x);
palabraFinal[x].Text = textBoxLetra.Text;
}
}
}
//if (palabraElegida.IndexOf(letraIngresada) != -1)
//{
// for (int i = 0; i < palabraElegida.Length; i++)
// {
// palabraFinal[palabraElegida.IndexOf(letraIngresada)].Text = textBoxLetra.Text;
// palabraFinal[palabraElegida.IndexOf(letraIngresada, palabraElegida.IndexOf(letraIngresada) + 1)].Text = textBoxLetra.Text;
// }
//}
else
{
cont++;
CambiarImagen(cont);
}
}
private void pictureBox1_Click(object sender, EventArgs e)
{
fotoPrincipal.Image = fotoSoga.Image;
label_Letra.Visible = true;
textBoxLetra.Visible = true;
button3.Visible = true;
pictureBox1.Visible = false;
groupBox1.Visible = false;
groupBox2.Visible = true;
if (radioButton1.Checked == true)
{
Buscar_palabra(animales);
}
else if (radioButton2.Checked == true)
{
Buscar_palabra(FruVer);
}
else if (radioButton3.Checked == true)
{
Buscar_palabra(objetos);
}
else if (radioButton4.Checked == true)
{
Buscar_palabra(paises);
}
else MessageBox.Show("Elige una opción por favor.");
if (palabraElegida.Length == 10)
{
textBox11.Visible = false;
}
if (palabraElegida.Length == 9)
{
textBox11.Visible = false;
textBox10.Visible = false;
}
if (palabraElegida.Length == 8)
{
textBox11.Visible = false;
textBox10.Visible = false;
textBox9.Visible = false;
}
if (palabraElegida.Length == 7)
{
textBox11.Visible = false;
textBox10.Visible = false;
textBox9.Visible = false;
textBox8.Visible = false;
}
if (palabraElegida.Length == 6)
{
textBox11.Visible = false;
textBox10.Visible = false;
textBox9.Visible = false;
textBox8.Visible = false;
textBox7.Visible = false;
}
}
public void CambiarImagen(int cont)
{
switch (cont)
{
case 1: fotoPrincipal.Image = fotoCabeza.Image;
break;
case 2: fotoPrincipal.Image = fotoBrazo.Image;
break;
case 3: fotoPrincipal.Image = fotoBrazos2.Image;
break;
case 4: fotoPrincipal.Image = fotoPanza.Image;
break;
case 5: fotoPrincipal.Image = fotoPierna.Image;
break;
case 6: fotoPrincipal.Image = fotoCuerpoEntero.Image;
break;
default:
break;
}
if (cont==6)
{
Form2 frm = new Form2();
frm.Show();
again.Visible = true;
again.BringToFront();
}
}
private void again_Click(object sender, EventArgs e)
{
Application.Restart();
}
}
}
Este snippet de mi vieja biblioteca te debería servir para tus propósitos, la función busca un caracter todas las ocurrencias de un caracter y devuelve todos sus índices.
De todas formas el problema que tienes no tiene mucho misterio, también puedes leer caracter por caracter usando un For, o una pila (usando la Class Stack) podría ser mejor según tus necesidades.
VB.Net:
' Find Characters
' ( By Elektro )
'
' Usage Examples:
' Dim CharIndex As Integer() = FindCharacters("Elektro", "E", IgnoreCase:=True) ' Result: {0, 2}
'
''' <summary>
''' Matches a character/string pattern in a String and returns the starting indexes of all concurrences.
''' </summary>
''' <param name="String">Indicates the string.</param>
''' <param name="Characters">Indicates the character(s) to find.</param>
''' <param name="IgnoreCase">if set to <c>true</c>, sensitive case is ignored.</param>
''' <returns>System.Int32().</returns>
Public Function FindCharacters(ByVal [String] As String,
ByVal Characters As String,
Optional ByVal IgnoreCase As Boolean = False) As Integer()
Return Enumerable.Range(0, [String].Length).
Where(Function(i As Integer) Characters.Select(Function(b1, b2) New With {b2, b1}).
All(Function(p) If(IgnoreCase,
[String].ToLower.ToCharArray()(i + p.b2).Equals(Char.ToLower(p.b1)),
[String].ToCharArray()(i + p.b2).Equals(p.b1)))).
ToArray()
End Function
C#, traducción al vuelo:
// Matches a character/string pattern in a String and returns the starting indexes of all concurrences.
// ( By Elektro )
//
// Usage Examples:
// Dim CharIndex As Integer() = FindCharacters("Elektro", "E", IgnoreCase:=True) ' Result: {0, 2}
//
/// <summary>
/// Finds the characters.
/// </summary>
/// <param name="String">Indicates the string.</param>
/// <param name="Characters">Indicates the character(s) to find.</param>
/// <param name="IgnoreCase">if set to <c>true</c>, sensitive case is ignored.</param>
/// <returns>System.Int32().</returns>
public int[] FindCharacters(string String, string Characters, bool IgnoreCase = false)
{
return Enumerable.Range(0, String.Length).Where((int i) => Characters.Select((b1, b2) => new {
b2,
b1
}).All(p => IgnoreCase ? String.ToLower.ToCharArray()(i + p.b2).Equals(char.ToLower(p.b1)) : String.ToCharArray()(i + p.b2).Equals(p.b1))).ToArray();
}
//=======================================================
//Service provided by Telerik (www.telerik.com)
//=======================================================
Saludos