Archief - C# random dictionary item

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GizeH

Legacy Member
Ik wil bij het maken van een de pionnen voor een bordspel, een random kleur toekennen in de constructor. (per pion)

De mogelijke kleuren staan in een dictionary.
Het probleem is echter dat bij het uitvoeren van de code, alle pionnen telkens dezelfde kleur hebben TENZIJ ik de code debug, dan worden de kleuren toch afgewisseld... :s

Code:
class Piece: Sprite
    {
        Dictionary<string, Color> _pieceColors = new Dictionary<string, Color>();

        public Piece()
        {
            _pieceColors["red"] = new Color(1, 0, 0, 1);
            _pieceColors["green"] = new Color(0, 1, 0, 1);
            _pieceColors["blue"] = new Color(0, 0, 1, 1);
            _pieceColors["yellow"] = new Color(1, 1, 0, 1);

            List<string> keyList = new List<string>(_pieceColors.Keys);
            int size = _pieceColors.Count;
            Random rand = new Random();            
            string randomKey = keyList[rand.Next(size)];
            
            Color col = _pieceColors[randomKey];

            this.SetColor(col);
            
            this.SetWidth(50);
            this.SetHeight(50);
        }

        public void Render(Renderer _renderer)
        {
            _renderer.DrawSprite(this);
        }
    }

En hier het stukje waarin de pieces gemaakt worden:
Code:
board = new Piece[_rows, _cols];

            double gap = 10;
            double x = -25; //50/2
            double y = -35;
            for (int r = 0; r < _rows; r++)
            {
                for (int c = 0; c < _cols; c++)
                {
                    Piece p = new Piece();
                    p.SetPosition(new Vector(x, y,0));
                    x += p.GetWidth();
                    x += gap;
                    board[r, c] = p;
                }
                x = -25;
                y -= 50;
                y -= gap;
            }

pietje666

Legacy Member
probeer eens van uw random variabele een statische klasse variabele te maken

ultddave

Legacy Member
Waarom een dictionary van kleuren bijhouden in elke pion? Is logischer om maar 1 kleur bij te houden.

Eventueel zoiets (ben niet vertrouwd met C# syntax, but you'll get the point ^^):
Code:
class Piece: Sprite
    {
        private Color _color; // Tenzij je die niet wilt bijhouden

        public Piece()
        {
           Random r = new Random();
            _color = new Color(r.Next(1), r.Next(1), r.Next(1), r.Next(1));
        }
....
Dus voor die 4 parameters een 0 of 1 genereren (indien die r.next(<int>) een double ofzo returned, gewoon casten naar integer). Indien r.Next(1) wilt zeggen "exclusief 1" => dan uiteraard r.Next(2) gebruiken.
Best die random generator seeden met de huidige tijd omgezet in een long ofzo ;).

Hou er rekening mee dat je dan wel meer dan 4 kleuren kan hebben ;). Anders kan je inderdaad de oplossing van pietje666 eens proberen.

Recipe4hate

Legacy Member
ultddave zei:
Waarom een dictionary van kleuren bijhouden in elke pion? Is logischer om maar 1 kleur bij te houden.

Eventueel zoiets (ben niet vertrouwd met C# syntax, but you'll get the point ^^):
Code:
class Piece: Sprite
    {
        private Color _color; // Tenzij je die niet wilt bijhouden

        public Piece()
        {
           Random r = new Random();
            _color = new Color(r.Next(1), r.Next(1), r.Next(1), r.Next(1));
        }
....
Dus voor die 4 parameters een 0 of 1 genereren (indien die r.next(<int>) een double ofzo returned, gewoon casten naar integer). Indien r.Next(1) wilt zeggen "exclusief 1" => dan uiteraard r.Next(2) gebruiken.
Best die random generator seeden met de huidige tijd omgezet in een long ofzo ;).

Hou er rekening mee dat je dan wel meer dan 4 kleuren kan hebben ;). Anders kan je inderdaad de oplossing van pietje666 eens proberen.

Ik ben ook niet helemaal mee met de code uit klasse Piece. Ik snap niet waarom je binnen die klasse zo je dictionary wil opstellen.
Je kan misschien gewoon een enum of een static dictionary opstellen die 4 kleuren bevat. Eventueel hier een helper method aan koppelen die de conversie van int (jouw random input) converteert naar enum waarde of direct naar color.
Als je dan met een random call max 1 van deze 4 kleuren opvraagt, lijkt me Daves probleem op gefixt :)

NeverwinterX

Legacy Member
De code voor het maken van de verschillende pionnen wordt in niet-debugmode zo snel uitgevoerd dat je Random objecten dezelfde seed krijgen en dus dezelfde eerste pseudo-random genereren. Je zal waarschijnlijk hogerop ergens een soort van controller/manager object hebben dat de pionnen aanmaakt: die laat je de kleuren genereren en die kleur geef je mee met de constructor van je pion.

GizeH

Legacy Member
Bedankt. Ik weet inderdaad dat die rando color code niet binnen de piece class moet, maar het was een
Vlugge test en
Handiger om het zo te posten.
Ik heb oorspronkelijk met die rand.next gewerkt, maar had toen hetzelfde probleem als met de dictionary. (als oplossing voor dit probleem dacht ik over te schakelen naar de dict)

Via rand.next zijn alle pionnen trouwens bijna altijd ook in dezelfde kleur. Het probleem Zal waarschijnlijk zijn zoals bovenstaande poster vermeld, dus ik zal eens kijken om het op zijn manier op te lossen
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan