noobre Posted January 27, 2018 at 05:15 PM Report #609122 Posted January 27, 2018 at 05:15 PM Estou a criar um jogo tipo Scrabble e estou a ter um pequeno erro. Basicamente esse é a verificação ao carregar no botão de finalizar. Vai percorrer toda a matriz e todas as textbox's criadas que são 225. Se eu puser no código assim: Assim vai dar porque a textbox já tem o valor inserido. Basicamente não me está a converter as textbox's que eu ponho as letras em string. Alguém me pode ajudar ? para mais informações é só dizer. Obrigado a quem viu e não ignorou!
apocsantos Posted January 27, 2018 at 05:35 PM Report #609123 Posted January 27, 2018 at 05:35 PM Boa tarde, Ok, algumas questões, cada quadricula é uma textbox ? Se forem, como sabes o nome da textbox ? Precisava de perceber o que perguntei acima, para poder ajudar melhor. Se cada quadricula for uma textbox, e precisas de validar uma palavra (conjunto de quadriculas), fazes uma string temporária, concatenas as strings (de cada quadricula), e depois comparas. Cordiais cumprimentos, Apocsantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
noobre Posted January 27, 2018 at 06:50 PM Author Report #609124 Posted January 27, 2018 at 06:50 PM https://pastebin.com/wz4GdBpV Esse é o código do projecto. Basicamente associei uma textbox a uma celula da matriz. Não sei se é assim que devia ter feito porque creio que existe um ciclo For que me ajuda a fazer isso creio eu. Qual é a tua opinião ?
apocsantos Posted January 27, 2018 at 09:13 PM Report #609125 Posted January 27, 2018 at 09:13 PM Boa noite, Ok, vais ter de enumerar todas as textbox's para depois poderes iterar sobre elas. Primeiro uma função para as enumerar: public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control { var children = (control.Controls != null) ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>(); return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children); } Depois, chamas a função e seleccionas apenas os objectos do tipo textbox: int palavrasCorrectas = 0; string palavraTemp =""; var todasTextBoxes = this.GetChildControls<TextBox>(); foreach (TextBox tb in todasTextBoxes) { palavratemp = palavratemp + tb.text.toString(); //começa a compor a palavra inteira, com base em cada textbox pela ordem em que foram criadas (numero da textbox). //agora aqui colocas o código para comparar cada palavra e armazenas o valor por cada palavra correcta, sendo que sabes quantas palavras tem o tabuleiro, logo, só precisas de saber quantas palavras o utilizador acertou e se o numero for igual, então venceu } if (palavrasCorrectas == totalPalavras) { console.writeln("Ganhou"); } Else { console.writeln("Good luck! ;)"); } Cordiais cumprimentos, Apocsantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
noobre Posted January 28, 2018 at 01:16 PM Author Report #609129 Posted January 28, 2018 at 01:16 PM (edited) Não consegui perceber muito bem esse código ou se calhar não me expliquei bem. Eu basicamente criei 225 TextBox's, e criei uma matriz de 15 por 15 que cada posição da matriz vai corresponder a uma Textbox. Tipo: TextBox2.Text = Tabuleiro[0, 2]; Inicialmente queria fazer 2 dificuldades que a 1 dificuldade as primeiras letras das palavras eram dispostas no gráfico e que o jogador teria que completar a palavra. Eu na função matriz(); por ordem numérica já as textbox's devidamente á posição da matriz. Agora na função finalizar queria que verificasse se realmente a letra "L" por exemplo está na posição Tabuleiro[4, 6] e para isso tenho que converter todas as textbox's de CHAR para STRING. Para no fim fazer: if (Tabuleiro[4, 6] == 'L') e não if (textBox67.Text == 'L') Porque acredito que se fizer desta maneira é mais fácil para descobrir se realmente naquela posição da matriz se encontra a letra que eu quero e para evitar de estar constantemente a ir ver qual é que é a textbox que corresponde á posição que quero verificar. Obrigado desde mais pela a ajuda! Cumprimentos Edited January 28, 2018 at 01:20 PM by noobre
apocsantos Posted January 28, 2018 at 01:21 PM Report #609130 Posted January 28, 2018 at 01:21 PM Boa tarde, Não tinha entendido bem a questão. Pensei que estavas a tentar validar as palavras completas e não "letra a letra" Ora bem a função que permite aceder a cada textbox, é a mesma, muda o código no seu interior, para converter cada o valor de cada textbox. string textboxLetra =""; var todasTextBoxes = this.GetChildControls<TextBox>(); foreach (TextBox tb in todasTextBoxes) { textboxLetra = tb.toString(); //basciamente dentro deste loop, são percorridas todas as textbox e o seu conteudo convertido para string e armazenado na variável textboxLetra. } Cordiais cumprimentos, Apocsantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
noobre Posted January 28, 2018 at 01:33 PM Author Report #609131 Posted January 28, 2018 at 01:33 PM Boa tarde, perdoa-me a ignorância mas c# ainda é um pouco novo para mim e as aulas foram poucas. Eu pus o código assim: E dá erro onde está visivel e aqui: A lista de erros: Error CS1106 Extension method must be defined in a non-generic static class Error CS7036 There is no argument given that corresponds to the required formal parameter 'control' of 'Form1.GetChildControls<TControl>(Control)'
apocsantos Posted January 28, 2018 at 01:55 PM Report #609132 Posted January 28, 2018 at 01:55 PM Boa tarde, Primeiro vê se tens o using correcto. u using System.Windows.Forms; using System.Collections; Depois, creio que seja um problema de scope. Verifica primeiro os usings. Cordiais cumprimentos, Apocantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
noobre Posted January 28, 2018 at 02:10 PM Author Report #609133 Posted January 28, 2018 at 02:10 PM Tenho tudo bem, Apocsantos. Este erro: Error CS1106 Extension method must be defined in a non-generic static class Desaparece quando apago a função que me disse á bocado para introduzir: public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control { var children = (control.Controls != null) ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>(); return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children); } Eu experimentei apagar e de facto desaparece o erro mas continuo a ficar com o erro na função em baixo: O que me sugere que faça aqui ? Liste aqui todas as textbox's da 1 á 225 ?
vikcch Posted January 28, 2018 at 04:35 PM Report #609136 Posted January 28, 2018 at 04:35 PM Porque não crias logo um array de textbox's?? Depois quando quiseres te referenciar uma textbox é só indicares as coordenadas.... ex: é base zero... a primeira casa é [0,0] como tens na imagem... using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { TextBox[,] txts = new TextBox[15, 15]; public Form1() { InitializeComponent(); for (int y = 0; y < 15; y++) { for (int x = 0; x < 15; x++) { TextBox txt = new TextBox(); txt.Left = x * 20; txt.Top = y * 20; txt.Width = 20; this.Controls.Add(txt); txts[x, y] = txt; } } txts[3, 6].Text = "E"; txts[4, 6].Text = "L"; } private void button1_Click(object sender, EventArgs e) { if (txts[3, 6].Text == "E" && txts[4, 6].Text == "L") { MessageBox.Show("ok"); } else { MessageBox.Show("not ok"); } } } }
noobre Posted January 28, 2018 at 05:58 PM Author Report #609137 Posted January 28, 2018 at 05:58 PM @vikcch, obrigado. Ontem na aula um amigo meu também me falou em criar um array de textbox's mas como já tinha parte o trabalho feito decidi não avançar mas agora reparei que o fazendo torna o esquema muito mais simples e muito mais fácil de entender. Obrigado foi uma grande ajuda! Obrigado ao Apocsantos pela disponibilidade também!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now