Hangman - GDI +问题

时间:2011-05-11 19:28:13

标签: c# .net

我有点发脾气。我开始开发基于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);
        }
    }
}

4 个答案:

答案 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()函数。