下面是我一直在研究的纸牌游戏。我遇到了一个我似乎无法通过的基本封锁。

在这部分代码中,我无法找到一种方法将来自我的数组的数字转换为它们对应的面和西装。

Console.WriteLine("A " + deck[Game.DrawCard(deck), 0] + " of " + deck[Game.DrawCard(deck), 1] + " was drawn from the deck and then placed on top");

我可以模糊地想象一条使用一长串变量和 if 语句的路线,但我真的怀疑没有明显且更简单的方法。

其余的代码看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CribbageInCSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //Variables//
            int currentPlayer;
            short score1 = 0;
            short score2 = 0;
            short round = 1;
            int[,] deck = new int[52, 2];

            Console.WriteLine("Welcome" + "\r" + "\r" + "Enter Number of Players (Only 2 player mode works right now)");
            while ((Console.ReadLine() != "2"))
            {
                Console.WriteLine("Only two player is working right now \n Make sure you are entering a number between 1-3 \n");
            }
            //A flip is made to determine who goes first//
            currentPlayer = Game.CoinFlip();
            Console.WriteLine("A coin was flipped and it was determined that player " + currentPlayer + " will go first \n");
            //Game.PrintDeck(deck);
            //Now the game is started//
            do
            {
                Console.WriteLine("Shuffling and dealing cards...");
                System.Threading.Thread.Sleep(5000);
                Game.InitDeck(deck);
                Console.WriteLine("Round " + round + "\n");
                //Cutting the Deck now that discarding has been done//
                Console.WriteLine("Cutting the deck... \n");
                System.Threading.Thread.Sleep(2000);
                Console.WriteLine("A " + deck[Game.DrawCard(deck), 0] + " of " + deck[Game.DrawCard(deck), 1] + " was drawn from the deck and then placed on top");    //Insert a swtich statement to convert pairs of numbers into actual cards
                //Player 2's turn is started now that the cut is over//
                Console.WriteLine("");

                //pick up here

                Console.WriteLine("Player " + currentPlayer + " ");


                round++;
            } while ((score1 < 121) && (score2 < 121));  //Loops until either score exceeds 121 points//
        }
    }

    class Game  //Used for functions neccesary to the function of the game that are not neccesarily dependant on turn order and do not create win conditions.
    {
        public static int CoinFlip()    //Flips to see who goes first, results are between 1-2
        {
            var rnd = new Random(DateTime.Now.Millisecond);
            int firstPlayer = rnd.Next(1, 3);
            return (firstPlayer);
        }
        public static void InitDeck(int[,] deck) // First column 11==Jack, 12==queen, 13==king && Second Column 0==diamonds, 1==clubs, 2==spades, 3==hearts
        {
            //Initiallizing the first column==Faces
            for (int i = 0; i < 4; i++)
            {
                deck[i, 0] = 13;
                deck[(i + 4), 0] = 12;
                deck[(i + 8), 0] = 11;
                deck[(i + 12), 0] = 10;
                deck[(i + 16), 0] = 9;
                deck[(i + 20), 0] = 8;
                deck[(i + 24), 0] = 7;
                deck[(i + 28), 0] = 6;
                deck[(i + 32), 0] = 5;
                deck[(i + 36), 0] = 4;
                deck[(i + 40), 0] = 3;
                deck[(i + 44), 0] = 2;
                deck[(i + 48), 0] = 1;
            }
            //Initiallizing second column==Suit
            for (int i = 0; i < 4; i++)
            {
                deck[i, 1] = i;
                deck[(i + 4), 1] = i;
                deck[(i + 8), 1] = i;
                deck[(i + 12), 1] = i;
                deck[(i + 16), 1] = i;
                deck[(i + 20), 1] = i;
                deck[(i + 24), 1] = i;
                deck[(i + 28), 1] = i;
                deck[(i + 32), 1] = i;
                deck[(i + 36), 1] = i;
                deck[(i + 40), 1] = i;
                deck[(i + 44), 1] = i;
                deck[(i + 48), 1] = i;
            }
        }
        public static void PrintDeck(int[,] deck)
        {
            for (int i = 0; i < 52; i++)
            {
                Console.WriteLine(deck[i, 0] + "F");
                Console.WriteLine(deck[i, 1] + "S");
            }
            Console.ReadLine();
        }
        public static int DrawCard(int[,] deck) //Draws a card from the deck, ignoring Cards already drawn this turn. IF THERE ARE ANY ERRORS COME HERE AND CHECK THIS FIRST
        {
            var rnd = new Random(DateTime.Now.Millisecond);
            int o = rnd.Next(0, 51);
            while (deck[o,0]==0)
            {
                System.Threading.Thread.Sleep(1000);
                rnd = new Random(DateTime.Now.Millisecond);
                o = rnd.Next(0, 51);
            }
            int drawnCard = o;
            deck[o, 0] = 0;

            return (drawnCard);
        }

    }
}

我也有一种感觉,一副纸牌的数组可能不是最明智的决定,而不是列表,但我并不乐观。

我真的很抱歉。虽然其他人似乎很明显已经涵盖了我的主题,但我对 C# 的有限理解不允许我解释我在过去一个小时左右出现的任何帖子中的任何答案。我正在尝试通过控制台窗口编写一个简单的游戏来学习 C#,因为这就是我学习 C++ 的方式。

提前感谢任何人的帮助。我真的很感激!

最佳答案

首先,我会将洗牌后的卡片存储在 List 中,或者更好的 Queue 中。这允许您从牌组中“挑选”一张牌。

为了获得卡片和套件,我将创建两个枚举:

public enum Rank
{
   Ace,
   Two,
   Three,
   ...
}

public enum Suits
{
   Hearts,
   Spades,
   ...
}

现在你定义你的卡片,0 = aH,1 = 2H,13 = aS,等等。

现在你可以这样做:
public Rank GetRankForCard(int card)
{
     return (Rank)(card % 13);
}

public Suit GetSuitForCard(int card)
{
    return (Suit)(card / 13);
}

%(模数)运算符在这里非常有用。最后要注意的是,cribbage 不是一个容易实现的游戏(我自己在 WPF 中完成了它),祝你好运!

关于c# - 如何在 Console.WriteLine() 语句中将数字转换为字母,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27572454/

10-10 15:02