2011-05-11 63 views
1

我在一個小小的泡菜。我開始基於GUI的Hangman遊戲開發,以進行娛樂。但是,我遇到了一些問題。Hang子手 - GDI +問題

需要猜測的單詞已轉換爲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); 
     } 
    } 
} 

回答

2

繪製表格(或任何其他控件)上的正確的方法是通過以使它無效調用

Invalidate(); 

你會在btnInputLetter_Click

012做到這一點,而不是DrawWord(G)

然後系統將調用窗體的繪畫事件。該事件有一個參數,其中包含您應該用於繪製的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(); 
} 
+0

這會在DrawWord()方法內引起問題(空引用異常),因爲WordCharacters []對象引用沒有實例化,直到用戶輸入一個單詞爲止。 – Hmm 2011-05-11 20:18:04

+0

這應該可以在for循環中使用「if(WordCharacters!= null)」來輕鬆解決。 – 2011-05-11 20:30:56

1

難道你們就不能僅僅使用string.Contains方法,看看是否存在信?

public bool CheckLetter(char letter) 
{ 
    return word.Contains(letter); 
} 

然後,您可以使用此結果操縱您擁有的單詞。

1

你CheckLetter方法是倒退,它應該是:

GuessedLetters[i] = WordCharactes[i]; 

不是:

WordCharactes[i] = GuessedLetters[i]; 
+0

謝謝,雖然問題仍然無法在屏幕上繪製匹配的字符... – Hmm 2011-05-11 19:38:57

+0

您是否調試過CheckLetter和DrawWord方法?猜測的內容是你期望的內容嗎? – 2011-05-11 20:03:16

+0

是的,謝謝你設法解決問題的信息。 – Hmm 2011-05-11 21:44:57

0

的問題是,你不要在你的窗體/控件的Paint事件更新您的繪圖邏輯。爲此添加一個事件,然後處理您的所有繪圖。要更新,請調用窗體/控件的Invalidate()函數。