繁体   English   中英

Hangman - GDI +问题

[英]Hangman - GDI+ problem

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

在表单(或任何其他控件)上绘制的正确方法是通过调用使其无效

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();
}

你能不能只使用string.Contains方法来查看字母是否存在?

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

然后,您可以使用此结果来操纵您拥有的单词。

你的CheckLetter方法是倒退的,它应该是:

GuessedLetters[i] = WordCharactes[i];

不:

WordCharactes[i] = GuessedLetters[i];

问题是您没有在表单/控件的Paint事件中更新绘图逻辑。 为此添加一个事件,然后在那里处理所有绘图。 要更新,请调用表单/控件的Invalidate()函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM