Winforms VB.Net: Best way to code rules for german cards game "Schafkopf"?
-
I think you could have found more current examples. [How to Build a Multiplayer Card Game with Unity 2D and Mirror (UPDATED)](https://www.freecodecamp.org/news/how-to-build-a-multiplayer-card-game-with-unity-2d-and-mirror/) [card-game · GitHub Topics · GitHub](https://github.com/topics/card-game?l=c%23) etc.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
-
Jo_vb.net wrote:
but the computer is already playing better than a human with beginner level. If I only could fix 4 or 5 important remaining issues the pc would reach medium playing level.
You programmed it like that! Look into the "Random" object and force it to play a dumb card now and then (once out of five?).
Jo_vb.net wrote:
A list or a xml file came also to my mind - I searched for CP articles about rules engine or business rules.
Hehe, good idea; those tend to generalize to fit a lot of rules though. You want to keep it simpler; understand the concept enough to build a simpler version of your own. Remember that "xyz".Contains("c")? Imagine xyz and c coming from a file? It wouldn't be rules based, but halfway. If you can do that, we'll go from there to make actual rules :)
Jo_vb.net wrote:
The last thing would be to have classes for card, hand cards, cards deck, current trick and so on. But I do not know how to bring together the properties of the classes and my existing rules.
You could write multiple classes for a "card"; I'd talk about interfaces at this point if we'd be in class :D
Jo_vb.net wrote:
Any link to an article which may help me would be great.
I did not help in any way, and any suggestion may have sounded like homework for school. There's never a library that does exactly what you need. I can only point to CodeProject; they'd help. Conquer the rules; if you can do that, I'll write an article about depending on classes and having variants :thumbsup:
Bastard Programmer from Hell :suss: "If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
Thanks a lot for this detailed answer. But I'm only on a better beginner level in coding... I use already subs in my loops and I really don't understand how
Quote:
Remember that "xyz".Contains("c")? Imagine xyz and c coming from a file? It wouldn't be rules based, but halfway. If you can do that, we'll go from there to make actual rules
could be used for a loop like the following:
If MyForm.RufAs.MeAlreadyPlayed = True Or MyForm.iCoSpieler = -1 Then For Each row As DataGridViewRow In dgv.Rows For n As Integer = 1 To dgv.Columns.Count - 1 If MyForm.RufAs.MeAlreadyPlayed = True Or MyForm.iCoSpieler = -1 Then If MyForm.Trick\_Content.CurrentTrickWinner <> MyForm.iCoSpieler AndAlso MyForm.Trick\_Content.CurrentTrickWinner <> DeclarerID Then If n > 0 AndAlso PlayerID <> DeclarerID AndAlso PlayerID <> MyForm.iCoSpieler Then If TrumpCardID <> 4 Then If PlayTogether\_WenzUsage(dgvCell, PlayerID, DeclarerID, GameStatus, sTrumpList, TrumpCardID, "RufAs", MyForm, LeadSuitID) = True Then If row.Cells(n).Value.ToString.Contains("U") Then If ContainsHandCardsStandardTrumps(CStr(sHandCards)) = False Then ' Or sHandCards Is Nothing Then ' Or MyForm.cardLessThan(MyForm.Trick\_Content.PossibleWinnerCardString, row.Cells(n).Value.ToString & row.Cells(0).Value.ToString) Then If LeadSuitID = TrumpCardID AndAlso row.Cells(n).Value.ToString <> String.Empty Then SetCurrentCell(dgvCell, dgv, row.Cells(n), row.Cells(0), " ~ " & (String.Format("Line # {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())) & " ~ ") End If End If End If End If End If End If End If End If Next Next
-
Thanks a lot for this detailed answer. But I'm only on a better beginner level in coding... I use already subs in my loops and I really don't understand how
Quote:
Remember that "xyz".Contains("c")? Imagine xyz and c coming from a file? It wouldn't be rules based, but halfway. If you can do that, we'll go from there to make actual rules
could be used for a loop like the following:
If MyForm.RufAs.MeAlreadyPlayed = True Or MyForm.iCoSpieler = -1 Then For Each row As DataGridViewRow In dgv.Rows For n As Integer = 1 To dgv.Columns.Count - 1 If MyForm.RufAs.MeAlreadyPlayed = True Or MyForm.iCoSpieler = -1 Then If MyForm.Trick\_Content.CurrentTrickWinner <> MyForm.iCoSpieler AndAlso MyForm.Trick\_Content.CurrentTrickWinner <> DeclarerID Then If n > 0 AndAlso PlayerID <> DeclarerID AndAlso PlayerID <> MyForm.iCoSpieler Then If TrumpCardID <> 4 Then If PlayTogether\_WenzUsage(dgvCell, PlayerID, DeclarerID, GameStatus, sTrumpList, TrumpCardID, "RufAs", MyForm, LeadSuitID) = True Then If row.Cells(n).Value.ToString.Contains("U") Then If ContainsHandCardsStandardTrumps(CStr(sHandCards)) = False Then ' Or sHandCards Is Nothing Then ' Or MyForm.cardLessThan(MyForm.Trick\_Content.PossibleWinnerCardString, row.Cells(n).Value.ToString & row.Cells(0).Value.ToString) Then If LeadSuitID = TrumpCardID AndAlso row.Cells(n).Value.ToString <> String.Empty Then SetCurrentCell(dgvCell, dgv, row.Cells(n), row.Cells(0), " ~ " & (String.Format("Line # {0}", (New StackTrace(New StackFrame(True))).GetFrame(0).GetFileLineNumber())) & " ~ ") End If End If End If End If End If End If End If End If Next Next
Jo_vb.net wrote:
But I'm only on a better beginner level in coding...
Lots of beginners here; most looking for templates to do their work.
Jo_vb.net wrote:
could be used for a loop like the following:
Don't worry about the big picture; understand the concept first, then you integrate it into your 'engine'. Someone hit me if I wrong, but string s = File.ReadAllText(path, appendText, Encoding.UTF8); would load the data of that file into the string called s? "xyz".Contains("c") becomes s.Contains("c") Where s is then loaded from a file (specified in "path"). This way, the "xyz" isn't hardcoded, but just data in a file. Requires you to read a string from a file. Could you achieve that?
Bastard Programmer from Hell :suss: "If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
-
Jo_vb.net wrote:
But I'm only on a better beginner level in coding...
Lots of beginners here; most looking for templates to do their work.
Jo_vb.net wrote:
could be used for a loop like the following:
Don't worry about the big picture; understand the concept first, then you integrate it into your 'engine'. Someone hit me if I wrong, but string s = File.ReadAllText(path, appendText, Encoding.UTF8); would load the data of that file into the string called s? "xyz".Contains("c") becomes s.Contains("c") Where s is then loaded from a file (specified in "path"). This way, the "xyz" isn't hardcoded, but just data in a file. Requires you to read a string from a file. Could you achieve that?
Bastard Programmer from Hell :suss: "If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
-
I'm in doubt about this approach [the .Contains(s) method is only used in < 10% of the "if - then" statements/rules], but reading a text file line after line is possible.
-
Are we a programming forum, or a Google service? :confused:
Bastard Programmer from Hell :suss: "If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
I could have just said "There are better examples". If someone said that to me, I would have responded: "And...?" So, I saw no point in responding as you might suggest. There, I wasted a message after all.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
-
Rules come in a form best suited for a given situation; be it "if's", tables or whatever. Your "if's" depend on the length of your "cell value". If it's only 1 (char) long, instead of multiple if's, you can code:
string s = "x"
if "xwz".Contains(s) etc.
if the cell value's length is greater than one, then iterate each character:
For Each ch As Char in s
if "xyx".Contains(ch) etc.
Next
}"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
Well this leads me to another improvement. Instead of many times using If statements like that
If PlayerID <> DeclarerID And PlayerID <> MyForm.iCoSpieler Then ...
or
If PlayerID = DeclarerID Or PlayerID = MyForm.iCoSpieler Then ...I will use variables like
Dim bTeamDeclarer As Boolean
Dim bTeamOpponent As BooleanIf PlayerID <> DeclarerID And PlayerID <> MyForm.iCoSpieler Then bTeamOpponent = True
If PlayerID = DeclarerID Or PlayerID = MyForm.iCoSpieler Then bTeamDeclarer = TrueThen i can combine 2 or 3 lines of my rules in the loops like
If n > 0 AndAlso bTeamDeclarer= True AndAlso row.Index = TrumpCardID Then
...This should make code easier to read AND shorter.
-
Well this leads me to another improvement. Instead of many times using If statements like that
If PlayerID <> DeclarerID And PlayerID <> MyForm.iCoSpieler Then ...
or
If PlayerID = DeclarerID Or PlayerID = MyForm.iCoSpieler Then ...I will use variables like
Dim bTeamDeclarer As Boolean
Dim bTeamOpponent As BooleanIf PlayerID <> DeclarerID And PlayerID <> MyForm.iCoSpieler Then bTeamOpponent = True
If PlayerID = DeclarerID Or PlayerID = MyForm.iCoSpieler Then bTeamDeclarer = TrueThen i can combine 2 or 3 lines of my rules in the loops like
If n > 0 AndAlso bTeamDeclarer= True AndAlso row.Index = TrumpCardID Then
...This should make code easier to read AND shorter.
In c# I'd code:
// As a "property"
bool bTeamComponent => PlayerID != DeclarerID && PlayerID != MyForm.iCoSpieler;
...
// Then in a method:
if ( bTeamComponent ) ...Note how bTeamComponent is "dynamic" for every access. It obviously has to be scoped properly.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
-
I think you could have found more current examples. [How to Build a Multiplayer Card Game with Unity 2D and Mirror (UPDATED)](https://www.freecodecamp.org/news/how-to-build-a-multiplayer-card-game-with-unity-2d-and-mirror/) [card-game · GitHub Topics · GitHub](https://github.com/topics/card-game?l=c%23) etc.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I
I do not want to learn Unity or Python. But I found a WPF project in a CP article with a cards deck where each card is a class object (which shows a card image) called PlayingCard. I've added some properties which I need for my game rules and migrated all I already had to WPF. All I have to do now is to re-write > 1000 code lines with the game rules. But the UI is much better then the old one.
-
I do not want to learn Unity or Python. But I found a WPF project in a CP article with a cards deck where each card is a class object (which shows a card image) called PlayingCard. I've added some properties which I need for my game rules and migrated all I already had to WPF. All I have to do now is to re-write > 1000 code lines with the game rules. But the UI is much better then the old one.
They were there for "design" ideas. You were asking for "best ways to code" (i.e. "patterns"). (I personally have never written a lick of VB.NET). But I see you get the idea: find a mouse trap (sample app) and build a better one.
"Before entering on an understanding, I have meditated for a long time, and have foreseen what might happen. It is not genius which reveals to me suddenly, secretly, what I have to say or to do in a circumstance unexpected by other people; it is reflection, it is meditation." - Napoleon I