AssoAndrea

memory

Dec 3rd, 2019
214
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.62 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Aiv.Draw;
  7.  
  8. namespace MemoryGame
  9. {
  10.     enum Color { Rosso, Verde, Giallo, Blu, Viola, Bianco, Marrone, Celeste, Arancione,VerdeOliva, RosaScuro,Oro,last }
  11.  
  12.     class Program
  13.     {
  14.         struct CardColor
  15.         {
  16.             public byte R;
  17.             public byte G;
  18.             public byte B;
  19.         }
  20.         struct Card
  21.         {
  22.             public int X;
  23.             public int Y;
  24.             public int Width;
  25.             public int Height;
  26.             public int LeftPadding;
  27.             public int UpPadding;
  28.             public CardColor color;
  29.         }
  30.         static void Main(string[] args)
  31.         {
  32.             int row;
  33.             int col;
  34.             int leftPadding = 20;
  35.             int upPadding = 20;
  36.             int cardWidth = 70;
  37.             int cardHeight = 100;
  38.             int windowWidth = 1000;
  39.             int windowHeight = 1000;
  40.             int maxRow = (windowWidth / (cardHeight + upPadding));
  41.             int maxCol = (windowHeight / (cardWidth + leftPadding));
  42.             Console.WriteLine("Righe massime: " + maxRow);
  43.             Console.WriteLine("Colonne massime: "+ maxCol);
  44.  
  45.             AskRowCol(out row, out col,maxRow,maxCol);
  46.             Window window = new Window(windowWidth, windowHeight, "Memory", PixelFormat.RGB);
  47.             Card[] deck = new Card[row * col];
  48.             CardColor[] color = new CardColor[(int)Color.last];
  49.             for (int i = 0; i < (int)Color.last; i++)
  50.             {
  51.                 CreateColor(color, (Color)i);
  52.             }
  53.             CreateDeck(window, deck, leftPadding, upPadding,col,row,cardWidth,cardHeight,color);
  54.             Card[] coveredDeck = new Card[deck.Length+2];
  55.             CopyDeck(coveredDeck, deck);
  56.             CardColor cover;
  57.             InitCover(out cover);
  58.             CoverDeck(coveredDeck, cover);
  59.             int mouseX1=-1;
  60.             int mouseY1=-1;
  61.             bool firstClick = true;
  62.  
  63.             int index1=-1;
  64.             int saveindex1 = -1;
  65.             int saveindex2 = -1;
  66.             int uncoverCards=0;
  67.             int cardSelected = 0;
  68.             float resetTime = 80;
  69.             int[] uncoverIndex = new int[deck.Length+2];
  70.             bool swap = true;
  71.             float time = 0;
  72.             bool reset = false;
  73.             bool fine = false;
  74.  
  75.             while(window.opened)
  76.             {
  77.                 Clear(window);
  78.                 DrawDeck(window, coveredDeck);
  79.                 SelectTwoCards(window, deck, coveredDeck, ref mouseX1, ref mouseY1, ref firstClick, ref index1, ref saveindex1, ref saveindex2, ref cardSelected, ref swap);
  80.                 if(CompareCard(window, deck, saveindex1, saveindex2, uncoverIndex, ref uncoverCards)&&cardSelected==2)
  81.                 {
  82.                     swap = true;
  83.                     cardSelected = 0;
  84.                     saveindex1 = -1;
  85.                     saveindex2 = -1;
  86.                     index1 = -1;
  87.                 }
  88.                 else if(cardSelected>=2)
  89.                 {
  90.                     swap = true;
  91.                     reset = true;
  92.                     Reset(coveredDeck, cover, ref index1, ref saveindex1, ref saveindex2, ref cardSelected, ref time, ref reset);
  93.                 }
  94.                 WaitTime(resetTime, window, reset, ref time);
  95.                 if(uncoverCards>=deck.Length)
  96.                 {
  97.                     DrawDeck(window, deck);
  98.                     if (fine)
  99.                     {
  100.                     Console.WriteLine("Hai vinto");
  101.                     break;
  102.                     }
  103.                     fine = true;
  104.                 }
  105.                 window.Blit();
  106.             }
  107.             Console.ReadLine();
  108.         }
  109.  
  110.         static void Reset(Card[] coveredDeck, CardColor cover, ref int index1, ref int saveindex1, ref int saveindex2, ref int cardSelected, ref float time, ref bool reset)
  111.         {
  112.             if (time >= 100 && saveindex1 >= 0 && saveindex2 >= 0)
  113.             {
  114.                 coveredDeck[saveindex1].color = cover;
  115.                 coveredDeck[saveindex2].color = cover;
  116.                 cardSelected = 0;
  117.                 saveindex1 = -1;
  118.                 saveindex2 = -2;
  119.                 index1 = -3;
  120.                 time = 0;
  121.                 reset = false;
  122.             }
  123.         }
  124.  
  125.         static void SelectTwoCards(Window window, Card[] deck, Card[] coveredDeck, ref int mouseX1, ref int mouseY1, ref bool firstClick, ref int index1, ref int saveindex1, ref int saveindex2, ref int uncoverCards, ref bool swap)
  126.         {
  127.             if (uncoverCards < 2)
  128.             {
  129.                 if (UncoverFirstCard(window, ref mouseX1, ref mouseY1, ref firstClick, ref index1, deck, ref uncoverCards))
  130.                 {
  131.                     if (swap)
  132.                     {
  133.                         saveindex1 = index1;
  134.                         swap = false;
  135.                         coveredDeck[saveindex1].color = deck[saveindex1].color;
  136.                     }
  137.                     else
  138.                     {
  139.                         saveindex2 = index1;
  140.                         coveredDeck[saveindex2].color = deck[saveindex2].color;
  141.                     }
  142.                 }
  143.             }
  144.         }
  145.  
  146.         static bool UncoverFirstCard(Window window,ref int mouseX1, ref int mouseY1,ref bool firstClick,ref int index1,Card[] deck, ref int uncoverCards)
  147.         {
  148.  
  149.             if(Click(window, ref mouseX1, ref mouseY1, ref firstClick))
  150.             {
  151.                 if (CheckClick(ref index1, mouseX1, mouseY1, deck))
  152.                 {
  153.                     uncoverCards++;
  154.                     return true;
  155.                 }
  156.             }
  157.             return false;
  158.         }
  159.  
  160.         static void DrawUncoverCard(Window window, int[] uncoverIndex, int uncoverCard,Card[] deck)
  161.         {
  162.             for (int i = 0; i < uncoverCard; i++)
  163.             {
  164.                 DrawRect(window, deck[i]);
  165.             }
  166.         }
  167.  
  168.         static bool CompareCard(Window window, Card[] deck,int index1,int index2, int[] uncoverIndex,ref int uncoverCards)
  169.         {
  170.             if (CompareColor(deck, index1, index2))
  171.             {
  172.                 uncoverCards += 2;
  173.                 uncoverIndex[uncoverCards] = index1;
  174.                 uncoverIndex[uncoverCards + 1] = index2;
  175.                 return true;
  176.             }
  177.             else
  178.             {
  179.                 return false;
  180.             }
  181.         }
  182.  
  183.         static void WaitTime(float resetTime,Window window,bool reset, ref float time)
  184.         {
  185.             if (reset)
  186.             {
  187.                 time += resetTime * window.deltaTime;
  188.             }
  189.         }
  190.  
  191.         static bool CompareColor(Card[] deck, int index1, int index2)
  192.         {
  193.             if (index1 >= 0 && index2>=0)
  194.             {
  195.                 if ((deck[index1].color.R == deck[index2].color.R) && (deck[index1].color.G == deck[index2].color.G) && (deck[index1].color.B == deck[index2].color.B))
  196.                 {
  197.                     return true;
  198.                 }
  199.             }
  200.  
  201.             return false;
  202.         }
  203.  
  204.         static bool CheckClick(ref int index, int mouseX, int mouseY, Card[] deck)
  205.         {
  206.             for (int i = 0; i < deck.Length; i++)
  207.             {
  208.                 if ((mouseX >= deck[i].X && mouseX <= deck[i].X + deck[i].Width) && (mouseY >= deck[i].Y && mouseY <= deck[i].Y + deck[i].Height))
  209.                 {
  210.                     index = i;
  211.                     return true;
  212.                 }
  213.             }
  214.             return false;
  215.         }
  216.  
  217.         static bool Click(Window window, ref int mouseX, ref int mouseY,ref bool firstClick)
  218.         {
  219.             if (window.mouseLeft && firstClick)
  220.             {
  221.                 mouseX = window.mouseX;
  222.                 mouseY = window.mouseY;
  223.                 firstClick = false;
  224.                 return true;
  225.             }
  226.             else
  227.             {
  228.                 if(!window.mouseLeft) firstClick = true;
  229.                 return false;
  230.             }
  231.         }
  232.  
  233.         static void CopyDeck(Card[] coveredDeck, Card[] deck)
  234.         {
  235.             for (int i = 0; i < deck.Length; i++)
  236.             {
  237.                 coveredDeck[i] = deck[i];
  238.             }
  239.         }
  240.  
  241.         static void InitCover(out CardColor cover)
  242.         {
  243.             cover.R = 128;
  244.             cover.G = 128;
  245.             cover.B = 128;
  246.         }
  247.  
  248.         static void CoverDeck(Card[] coveredDeck, CardColor color)
  249.         {
  250.             for (int i = 0; i < coveredDeck.Length; i++)
  251.             {
  252.                 coveredDeck[i].color = color;
  253.             }
  254.         }
  255.  
  256.         static void CreateColor(CardColor[] color, Color enumColor)
  257.         {
  258.             switch (enumColor)
  259.             {
  260.                 case Color.Rosso:
  261.                     color[(int)enumColor].R = 255;
  262.                     color[(int)enumColor].G = 0;
  263.                     color[(int)enumColor].B = 0;
  264.                     break;
  265.                 case Color.Verde:
  266.                     color[(int)enumColor].R = 0;
  267.                     color[(int)enumColor].G = 255;
  268.                     color[(int)enumColor].B = 0;
  269.                     break;
  270.                 case Color.Giallo:
  271.                     color[(int)enumColor].R = 255;
  272.                     color[(int)enumColor].G = 255;
  273.                     color[(int)enumColor].B = 102;
  274.                     break;
  275.                 case Color.Blu:
  276.                     color[(int)enumColor].R = 0;
  277.                     color[(int)enumColor].G = 0;
  278.                     color[(int)enumColor].B = 255;
  279.  
  280.                     break;
  281.                 case Color.Viola:
  282.                     color[(int)enumColor].R = 128;
  283.                     color[(int)enumColor].G = 0;
  284.                     color[(int)enumColor].B = 128;
  285.                     break;
  286.                 case Color.Bianco:
  287.                     color[(int)enumColor].R = 255;
  288.                     color[(int)enumColor].G = 255;
  289.                     color[(int)enumColor].B = 255;
  290.                     break;
  291.                 case Color.Marrone:
  292.                     color[(int)enumColor].R = 101;
  293.                     color[(int)enumColor].G = 67;
  294.                     color[(int)enumColor].B = 33;
  295.                     break;
  296.                 case Color.Celeste:
  297.                     color[(int)enumColor].R = 10;
  298.                     color[(int)enumColor].G = 186;
  299.                     color[(int)enumColor].B = 181;
  300.                     break;
  301.                 case Color.Arancione:
  302.                     color[(int)enumColor].R = 255;
  303.                     color[(int)enumColor].G = 117;
  304.                     color[(int)enumColor].B = 20;
  305.                     break;
  306.                 case Color.VerdeOliva:
  307.                     color[(int)enumColor].R = 128;
  308.                     color[(int)enumColor].G = 128;
  309.                     color[(int)enumColor].B = 0;
  310.                     break;
  311.                 case Color.RosaScuro:
  312.                     color[(int)enumColor].R = 231;
  313.                     color[(int)enumColor].G = 84;
  314.                     color[(int)enumColor].B = 128;
  315.                     break;
  316.                 case Color.Oro:
  317.                     color[(int)enumColor].R = 255;
  318.                     color[(int)enumColor].G = 215;
  319.                     color[(int)enumColor].B = 0;
  320.                     break;
  321.                 default:
  322.                     break;
  323.             }
  324.         }
  325.  
  326.         static void DrawDeck(Window window, Card[] deck)
  327.         {
  328.             for (int i = 0; i < deck.Length; i++)
  329.             {
  330.                 DrawRect(window, deck[i]);
  331.             }
  332.         }
  333.         static void CreateDeck(Window window, Card[] deck, int leftPadding, int upPadding,int col, int row,int width, int height, CardColor[] color)
  334.         {
  335.             Random r = new Random();
  336.             int cardWidth = width;
  337.             int cardHeight = height;
  338.             int tempX = 0;
  339.             int tempY = 0 - deck[0].Height;
  340.             InitCard(tempX,tempY, deck, leftPadding, upPadding,cardWidth, cardHeight, color);
  341.             PlaceCard(window, deck, col, row, ref tempX, ref tempY);
  342.             ShuffleCard(deck, r);
  343.         }
  344.  
  345.         static void ShuffleCard(Card[] deck, Random r)
  346.         {
  347.             Card card;
  348.             for (int i = 0; i < deck.Length; i++)
  349.             {
  350.                 int index = r.Next(0, deck.Length);
  351.                 card = deck[i];
  352.                 deck[i].color = deck[index].color;
  353.                 deck[index].color = card.color;
  354.             }
  355.         }
  356.  
  357.         static void PlaceCard (Window window, Card[] deck,int col, int row, ref int tempX, ref int tempY)
  358.         {
  359.             bool firstCard = true;
  360.            
  361.             int rowCount = 0;
  362.             for (int i = 0; i < deck.Length; i++)
  363.             {
  364.                 if (rowCount==0)
  365.                 {
  366.                     tempX = 0;
  367.                     deck[i].X = deck[i].LeftPadding;
  368.                     tempX = deck[i].X;
  369.                     if (firstCard)
  370.                     {
  371.                         deck[i].Y = deck[i].UpPadding;
  372.                         firstCard = false;
  373.                     }
  374.                     else
  375.                     {
  376.                         deck[i].Y += tempY + deck[i].UpPadding+deck[i].Height;
  377.                     }
  378.                     tempY = deck[i].Y;
  379.                     rowCount = col;
  380.                 }
  381.                 else
  382.                 {
  383.                     deck[i].X = tempX + deck[i].LeftPadding + deck[i].Width;
  384.                     deck[i].Y = tempY;
  385.                     tempX = deck[i].X;
  386.                 }
  387.                     rowCount--;
  388.             }
  389.  
  390.         }
  391.  
  392.         static void DrawRect(Window window, Card card)
  393.         {
  394.             for (int i = card.Y; i <card.Y + card.Height; i++)
  395.             {
  396.                 DrawHorizontalLine(window, card.X, i, card.Width, card.color);
  397.             }
  398.         }
  399.         static void Clear(Window window)
  400.         {
  401.             for (int i = 0; i < window.bitmap.Length; i++)
  402.             {
  403.                 window.bitmap[i] = 0;
  404.             }
  405.         }
  406.  
  407.         static void InitCard(int newX, int newY, Card[] card, int leftPadding, int upPadding,int width, int height, CardColor[] color)
  408.         {
  409.             int c = 0;
  410.             for (int i = 0; i < card.Length; i++)
  411.             {
  412.                 card[i].Width = width;
  413.                 card[i].Height = height;
  414.                 card[i].UpPadding = upPadding;
  415.                 card[i].LeftPadding = leftPadding;
  416.                 card[i].X = newX;
  417.                 card[i].Y = newY;
  418.             }
  419.             for (int i = 0; i < card.Length; i+=2)
  420.             {
  421.                 if (c>=color.Length)
  422.                 {
  423.                     c = 0;
  424.                 }
  425.                 byte col = color[c].R;
  426.                 card[i].color.R = col;
  427.                 card[i].color.G = color[c].G;
  428.                 card[i].color.B = color[c].B;
  429.                 card[i + 1].color.R = color[c].R;
  430.                 card[i + 1].color.G = color[c].G;
  431.                 card[i + 1].color.B = color[c].B;
  432.                 c++;
  433.             }
  434.         }
  435.  
  436.         static void DrawHorizontalLine(Window win, int x, int y, int width, CardColor color)
  437.         {
  438.             for (int i = x; i < x + width; i++)
  439.             {
  440.                 PutPixel(win, i, y, color);
  441.             }
  442.         }
  443.         static void PutPixel(Window win, int x, int y, CardColor color)
  444.         {
  445.             if (x >= 0 && y >= 0 && x < win.width && y < win.height)
  446.             {
  447.                 int index = (y * win.width + x) * 3;
  448.  
  449.                 win.bitmap[index] = color.R;
  450.                 win.bitmap[index + 1] = color.G;
  451.                 win.bitmap[index + 2] = color.B;
  452.             }
  453.         }
  454.  
  455.         static void AskRowCol(out int row, out int col,int maxRow, int maxCol)
  456.         {
  457.             row = 1;
  458.             col = 1;
  459.             bool check = false;
  460.             bool checkCol = false;
  461.             bool checkRow = false;
  462.             while (!check)
  463.             {
  464.                 Console.Write("Quante righe vuoi?: ");
  465.                 row = int.Parse(Console.ReadLine());
  466.                 Console.Write("Quante colonne vuoi?: ");
  467.                 col = int.Parse(Console.ReadLine());
  468.                 if (row<=maxRow)
  469.                 {
  470.                     checkRow = true;
  471.                 }
  472.                 if (col<=maxCol)
  473.                 {
  474.                     checkCol = true;
  475.                 }
  476.                 if (col % 2 == 0 && checkRow && checkCol)
  477.                 {
  478.                     check = true;
  479.                 }
  480.                 else check = false;
  481.  
  482.             }
  483.         }
  484.     }
  485. }
Advertisement
Add Comment
Please, Sign In to add comment