如何从不同的类访问类?

时间:2009-11-29 02:54:58

标签: c#

我的BlackJack程序存在问题。这是BlackJack.cs中的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class blackjack
    {

    static string[] playercards = new string[11];
    static string hitstay = "";
    static int total = 0, count = 1, dealertotal = 0;
    static Random cardshuffler = new Random();
    static Form1 f1 = new Form1();




    public static void start()
    {


        dealertotal = cardshuffler.Next(15, 22);
        playercards[0] = deal();
        playercards[1] = deal();
        f1.TextValue = "test";

        bj();

    }


    private static void hit()
    {

        count += 1;
        playercards[count] = deal();
        f1.playertb.Text += "you were dealed a(n) " + playercards[count] + ".your new total is " + total + ".";
        if (total.Equals(21))
        {
            f1.playertb.Text += "you got blackjack! the dealer's total was " + dealertotal + ".would you like to play again?";
            playagain();
        }
        else if (total > 21)
        {
            f1.playertb.Text += "you busted, therefore you lost. sorry. the dealer's total was " + dealertotal + ".would you like to play again? y/n";
            playagain();
        }
        else if (total < 21)
        {
            do
            {
                f1.playertb.Text += "would you like to hit or stay?";

            } while (!hitstay.Equals(f1.Hit) && !hitstay.Equals(f1.Stay));
            bj();
        }
    }

    private static string deal()
    {
        string Card = "";
        int cards = cardshuffler.Next(1, 14);
        switch (cards)
        {
            case 1: Card = "Two"; total += 2;
                break;
            case 2: Card = "Three"; total += 3;
                break;
            case 3: Card = "Four"; total += 4;
                break;
            case 4: Card = "Five"; total += 5;
                break;
            case 5: Card = "Six"; total += 6;
                break;
            case 6: Card = "Seven"; total += 7;
                break;
            case 7: Card = "Eight"; total += 8;
                break;
            case 8: Card = "Nine"; total += 9;
                break;
            case 9: Card = "Ten"; total += 10;
                break;
            case 10: Card = "Jack"; total += 10;
                break;
            case 11: Card = "Queen"; total += 10;
                break;
            case 12: Card = "King"; total += 10;
                break;
            case 13: Card = "Ace"; total += 11;
                break;

        }
        return Card;
    }

    static void bj()
    {
        if (hitstay.Equals (f1.Hit))
        {
            hit();
        }
        else if (hitstay.Equals(f1.Stay))
        {
            if (total > dealertotal && total <= 21)
            {
 f1.PlayerText += "you won! the dealer busted with " + dealertotal + " as their total" + "your total was " + total;
                playagain();
            }
            else if (total < dealertotal)
            {
 f1.PlayerText += "sorry, you lost! the dealer's total was " + dealertotal;
                playagain();
            }

        }
    }

    private static void playagain()
    {



    }


}
}

现在这是我的Form1.cs代码:

 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
{



    public Form1()
    {
        InitializeComponent();


    }

    public void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        DialogResult result = MessageBox.Show
            ("Are You Sure You Want To Close?",
            "",
            MessageBoxButtons.OK,
            MessageBoxIcon.Warning);

        if (result == DialogResult.Cancel)
            e.Cancel = true;

    }



        public void button1_Click(object sender, EventArgs e)
    {
         BetForm betForm = new BetForm();


        betForm.StartPosition = FormStartPosition.CenterParent;
        if (betForm.ShowDialog() == DialogResult.OK)
        {
            MessageBox.Show("You bet  $" + betForm.Bet);
        }
    }

    public string TextValue
    {

        set
        {
            playertb.Text = value;
        }

    }





 public string PlayerText
  {
   get { return playertb.Text; }
   set { playertb.Text = value; }
  }

    private void Stay_Click(object sender, EventArgs e)
    {

    }

    private void Play_Click(object sender, EventArgs e)
    {
        blackjack.start();
    }   


}
}

问题是,当我按下表单上的“播放”按钮时,它应该在BlackJack类中执行start()。当它执行时,应该在“playertb”中写入一些文本框。什么都没有写在文本框中,我无法做任何事情。请帮忙。

1 个答案:

答案 0 :(得分:0)

在二十一点类中,您创建一个名为f1的Form1的第二个实例,但您从未显示它。您从Form1的第一个实例调用blackjack.Start()。

要解决此问题,您可以尝试以下方法:

static Form1 f1 = null;   // declare it, but don't initialise it (we'll get 
                          // it when start() is called )

public static void start(Form1 form)
    {

        // set the static reference to the calling form,

        f1 = form

        dealertotal = cardshuffler.Next(15, 22);
        playercards[0] = deal();
        playercards[1] = deal();
        f1.TextValue = "test";

        bj();

    }

然后,在您的Form1类中,

blackjack.start(this);

虽然,如果我自己设计这个,我会使blackjack成为一个带有构造函数的非静态类。目前,你一次只能玩一次二十一点游戏。然后我会通过事件发出游戏变化的信号。这可以防止二十一点类必须知道Form1的情况。原则上,二十一点应该对UI层知之甚少或一无所知。这使您的代码更具可移植性和可重用性。