2009-11-29 4 views
1

У меня проблема с моей программой 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(); 
    } 


} 
} 

Проблема в том, что, когда я нажимаю на кнопку «Play» на форме предполагается для запуска start() в классе BlackJack. Когда он выполняет это, предполагается, что что-то должно быть записано в «playertb», которое является текстовым полем. Ничего не написано в текстовом поле, и я ничего не могу с этим поделать. Пожалуйста помоги.

+0

Это домашнее задание? Если это так, я предлагаю пометить его как таковой. – JohnFx

ответ

0

В классе blackjack вы создаете второй экземпляр Form1 с именем f1, но вы его никогда не показываете. Вы вызываете blackjack.Start() из первого экземпляра Form1.

Чтобы устранить непосредственную проблему, вы можете попробовать следующее:

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. В принципе, блэкджек должен знать очень мало или ничего о слое пользовательского интерфейса. Это делает ваш код намного более портативным и многоразовым.

+0

Я набрал «статический блэкджек blaj = новый блэкджек» в форме1 и использовал его istead из blackjack.start, а затем я получил сообщение об ошибке: Пользователь «WindowsFormsApplication1.blackjack.start()» не может быть доступен с ссылкой на экземпляр; квалифицируйте его с именем типа вместо – Bob

+0

oh не видел вашего редактирования – Bob

+0

@Charlie: Это НЕправда, что класс без конструктора не может быть создан. Если вы не знаете, о чем говорите, лучше не говорить ничего. Таким образом, вы не дезинформируете людей. –