我有点发脾气。我开始开发基于GUI的Hangman游戏,用于娱乐。但是,我遇到了一些问题。
需要猜测的单词已转换为char数组。但是,当用户输入char以猜测单词时,CheckLetter()方法似乎不起作用,尽管它正确调用。因为字母没有出现在屏幕上,所以当它们被正确猜到时。
如果你能指导正确的方向,我将不胜感激......
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 HangmanV1._0
{
public partial class Main : Form
{
private Graphics g;
//Stores words characters
private char[] WordCharactes;
//Cloned array size of word characters, though data only appears in the elements
//when characters are matched succesfully
private char[] GuessedLetters;
public Main()
{
InitializeComponent();
}
public void GetWord(string Word, int NumberOfCharacters)
{
//Declares new char array
WordCharactes = new char[NumberOfCharacters];
GuessedLetters = new char[NumberOfCharacters];
//Converts word to char array
WordCharactes = Word.ToCharArray();
}
private void btnPlay_Click(object sender, EventArgs e)
{
//invokes the method by passing the word required to be guessed, specified by the user
GetWord(tbWordToGuess.Text, tbWordToGuess.Text.Length);
grbNewGame.Visible = false;
//Draw hangman game board
DrawWord(g);
}
public void DrawWord(Graphics e)
{
//Line Coordinates
int LinePointX = 50;
int LinePointY = 80;
int LetterPoint = 50;
for (int i = 0; i < WordCharactes.Length; i++)
{
//Draws dashed unser letters, highlights how many letters to guess
e.DrawLine(new Pen(Color.Black, 5), new PointF(LinePointX, 300), new PointF(LinePointY, 300));
//Draws letters that have been correctly guessed
e.DrawString(GuessedLetters[i].ToString(), new Font("Arial", 18), Brushes.Black, new PointF(LetterPoint, 270));
//Steadily increments line
LetterPoint += 40;
LinePointX += 40;
LinePointY += 40;
}
}
public void CheckLetter(char Letter)
{
this.Refresh(); //<-- Edit: adding this solved my problem
//Compares letters
for (int i = 0; i < WordCharactes.Length; i++)
{
if (WordCharactes[i] == Letter)
{
GuessedLetters[i] = WordCharactes[i];
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
g = this.CreateGraphics();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
//Exits enviroment
Environment.Exit(0);
}
private void btnInputLetter_Click(object sender, EventArgs e)
{
//Invokes the checkletter method to compare inputted char to that of the word
CheckLetter(char.Parse(tbGuessedLetter.Text));
//Redraws
DrawWord(g);
}
}
}
答案 0 :(得分:2)
在表单(或任何其他控件)上绘制的正确方法是通过调用
使其无效Invalidate();
你会这样做而不是btnInputLetter_Click中的DrawWord(g)
然后系统将调用表单的paint事件。此事件的参数包含您应该用于绘制的Graphics对象。
这一切总结如下:
private void Form1_Paint(object sender, PaintEventArgs e)
{
DrawWord(e.Graphics);
}
private void btnInputLetter_Click(object sender, EventArgs e)
{
//Invokes the checkletter method to compare inputted char to that of the word
CheckLetter(char.Parse(tbGuessedLetter.Text));
//Redraws
Invalidate();
}
答案 1 :(得分:1)
你能不能只使用string.Contains方法查看这封信是否存在?
public bool CheckLetter(char letter)
{
return word.Contains(letter);
}
然后,您可以使用此结果来操纵您拥有的单词。
答案 2 :(得分:1)
您的CheckLetter方法是向后的,它应该是:
GuessedLetters[i] = WordCharactes[i];
不
WordCharactes[i] = GuessedLetters[i];
答案 3 :(得分:0)
问题是您没有在表单/控件的Paint事件中更新绘图逻辑。为此添加一个事件,然后在那里处理所有绘图。要更新,请调用表单/控件的Invalidate()函数。