Avatar billede flashit Nybegynder
09. november 2003 - 12:27 Der er 8 kommentarer og
2 løsninger

benyt et objekt i et andet objekt

Hej E.

Jeg er ved at løse en opgave på et .net kursus.
Mit problem er at jeg er gået total i stå .

Opgave går ud på at man skal op rette et spil kort.

Jeg ar følgende objekt:

Public Class Kort
    Private _farve As Integer
    Private _vardi As Integer

    Public Sub New(ByVal wfarve As Integer, ByVal wvardi As Integer)
        If wfarve > 0 And wfarve < 5 Then
            _farve = wfarve
        Else
            MessageBox.Show("Et korts farve skal være 1-4 ... Kort ikke oprettet", "FEJL", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            _farve = 0
        End If

        If wvardi > 0 And wvardi < 14 Then
            _vardi = wvardi
        Else
            MessageBox.Show("Et korts værdi skal være 1-13 ... Kort ikke oprettet", "FEJL", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            _vardi = 0
        End If
    End Sub

    Public ReadOnly Property getVaerdi() As Integer
        Get
            Return _vardi
        End Get
    End Property

    Public Function getFarve() As String
        Dim res As String
        Select Case _farve
            Case 1
                res = "klør"
            Case 2
                res = "spar"
            Case 3
                res = "hjerter"
            Case 4
                res = "ruder"
            Case Else
                res = "ugyldig farve - kort ikke valid"
        End Select
        Return res
    End Function

    Public Overrides Function toString() As String
        Return getFarve() & " " & VardiToString()
    End Function

    Private Function isValid() As Boolean
        If _farve = 0 Or _vardi = 0 Then
            Return False
        Else
            Return True
        End If
    End Function

    Private Function VardiToString() As String
        Dim res As String
        Select Case _vardi
            Case 0
                res = "ugyldig værdi - kort ikke valid"
            Case 1
                res = "es"
            Case 11
                res = "knægt"
            Case 12
                res = "dame"
            Case 13
                res = "konge"
            Case Else
                res = CStr(_vardi)
        End Select
        Return res
    End Function
End Class

Nu skal jeg så oprette et nyt objekt som benytter kort objektet til at oprette et HELT spil kort.

MEN

Hvordan kan man bruge et objekt inden i et andet.
Er her en som kan oprette et spil kort(52 stk) ud fra kort klassen, og forklarer mig hvordan man gør???
Avatar billede kaffe Nybegynder
09. november 2003 - 13:47 #1
Hej
Jeg lavede dette for noget tid siden, det kan være du kan bruge noget af det i stedet:

Public Class Card

    Enum CardSuit
        Hearts = 1
        Spades = 2
        Diamonds = 3
        Clubs = 4
    End Enum

    Enum CardValue
        Ace = 1
        Two = 2
        Three = 3
        Four = 4
        Five = 5
        Six = 6
        Seven = 7
        Eight = 8
        Nine = 9
        Ten = 10
        Jack = 11
        Queen = 12
        King = 13
    End Enum

    Private mSuit As CardSuit
    Private mCardValue As CardValue

    Public Property Card_Value() As CardValue
        Get
            Return mCardValue
        End Get
        Set(ByVal Value As CardValue)
            mCardValue = Value
        End Set
    End Property

    Public Property Card_Suit() As CardSuit
        Get
            Return mSuit
        End Get
        Set(ByVal Value As CardSuit)
            mSuit = Value
        End Set
    End Property

End Class


Public Class Deck

    Private mColCards As Collection

    Public Sub New_Deck()
        mColCards = New Collection()

        Dim intSuit As Byte = 0
        Dim intVal As Byte = 0
        Dim intCnt As Byte

        For intSuit = 1 To 4
            For intVal = 1 To 13
                Dim tmpCard As New Card()

                tmpCard.Card_Value = intVal
                tmpCard.Card_Suit = intSuit
                mColCards.Add(tmpCard)
            Next
        Next
    End Sub

    Public Function Count() As Byte
        Return mColCards.Count
    End Function

    Public Function GetCard() As Card
        Randomize()
        Dim CrdTmp As Card
        Dim bytCount As Byte = Count()
        Dim bytTmpCard As Byte
        bytTmpCard = Int(Rnd() * (bytCount - 1)) + 1
        Try
            CrdTmp = mColCards(bytTmpCard)
            mColCards.Remove(bytTmpCard)
        Catch ex As Exception
            MsgBox(bytTmpCard.ToString & "/" & bytCount.ToString)
        End Try

        Return CrdTmp
    End Function

End Class

Og en form der henter kort:

Public Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer. 
    'Do not modify it using the code editor.
    Friend WithEvents Button1 As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button()
        Me.SuspendLayout()
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(56, 56)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(136, 32)
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Button1"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 273)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.Button1})
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Dim mDeck As Deck
    Private Sub NewDeck()
        mDeck = New Deck()
        mDeck.New_Deck()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim mCard As Card
        mCard = mDeck.GetCard()
        MessageBox.Show(mCard.Card_Suit.ToString() & " " & mCard.Card_Value.ToString())
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        NewDeck()
    End Sub
End Class
Avatar billede arne_v Ekspert
09. november 2003 - 20:10 #2
Simpelt 2D array:

      Dim deck(4,13) As Kort
      Dim color As Integer
      Dim value As Integer
      For color = 1 To 4
          For value = 1 To 13
              deck(color-1,value-1) = new Kort(color, value)
          Next
      Next
      For color = 1 To 4
          For value = 1 To 13
              Console.WriteLine(deck(color-1,value-1))
          Next
      Next

kan vist ikke være meget simplere.
Avatar billede arne_v Ekspert
09. november 2003 - 20:16 #3
Som 1D array:

      Dim deck(52) As Kort
      Dim color As Integer
      Dim value As Integer
      Dim card As Integer
      For color = 1 To 4
          For value = 1 To 13
              deck((color-1)*13+(value-1)) = new Kort(color, value)
          Next
      Next
      For card = 0 To 51
          Console.WriteLine(deck(card))
      Next
Avatar billede arne_v Ekspert
09. november 2003 - 20:24 #4
Og med sortering (ligesom kaffe's kode - men alligevel lidt anderledes):

      Dim randeck(52) As Kort
      Dim deck(52) As Kort
      Dim color As Integer
      Dim value As Integer
      Dim card As Integer
      Dim rng As Random = new Random()
      Dim tmp As ArrayList
      Dim ix As Integer
      For color = 1 To 4
          For value = 1 To 13
              deck((color-1)*13+(value-1)) = new Kort(color, value)
          Next
      Next
      For card = 0 To 51
          Console.WriteLine(deck(card))
      Next
      tmp = new ArrayList(deck)
      For card = 0 To 51
          ix = rng.Next(tmp.Count)
          randeck(card) = tmp.Item(ix)
          tmp.Remove(ix)
      Next
      For card = 0 To 51
          Console.WriteLine(randeck(card))
      Next
Avatar billede arne_v Ekspert
16. november 2003 - 22:01 #5
Kommet videre ?
Avatar billede flashit Nybegynder
17. november 2003 - 11:58 #6
ja, tak.Det går bedrer med objekterne :-)
Kan I ikke give mig et svar så er der p til jeg begge.
Avatar billede arne_v Ekspert
17. november 2003 - 12:01 #7
ok
Avatar billede flashit Nybegynder
17. november 2003 - 12:03 #8
Super Arne_V (og tak for hjælpen IGEN)
Jeg giver lige kadde lidt tid.
Avatar billede kaffe Nybegynder
17. november 2003 - 18:50 #9
ok :)
Avatar billede flashit Nybegynder
18. november 2003 - 10:37 #10
Mange Tak.....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester