Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2022:avaduva:chickeninvaders [2022/06/02 02:50]
diana.vespan
pm:prj2022:avaduva:chickeninvaders [2022/06/02 03:10] (current)
diana.vespan [Hardware Design]
Line 29: Line 29:
  
 {{ :​pm:​prj2022:​avaduva:​schematinkercadchickeninvaders.png?​nolink |}} {{ :​pm:​prj2022:​avaduva:​schematinkercadchickeninvaders.png?​nolink |}}
 +Nu am găsit un soft ce conține toate componentele proiectului meu, asa că am folosit Paint și am încercat să fac schema circuitului cât mai vizibilă.
  
  
Line 64: Line 65:
 Cu ajutorul acestei funcții se poate desena o singură pasăre alcătuită dintr-un cerc galben(cap),​ două cercuri negre(ochi) și un triunghi rosu(cioc). Cu ajutorul acestei funcții se poate desena o singură pasăre alcătuită dintr-un cerc galben(cap),​ două cercuri negre(ochi) și un triunghi rosu(cioc).
  
-  * ///void Draw_Chickens()//​+  * //void Draw_Chickens()//​
  
 Se utilizează pentru a desena păsări pe aproape toată lățimea ecranului și jumătate din lungimea acestuia. Fiecare pasăre este asociată unei singure poziții dintr-o matrice. Această funcție desenează numai păsările ce nu au fost eliminate de către jucător, verificându-se de fiecare data valoarea corespunzătoare fiecărei poziții. În cazul în care valoarea este 1, atunci se desenează o pasăre pe locul respectiv. În caz contrar, se va lăsa un spațiu liber de dimensiunile unei păsări. Se apeleaza funcția //​Draw_Chicken//​. Se utilizează pentru a desena păsări pe aproape toată lățimea ecranului și jumătate din lungimea acestuia. Fiecare pasăre este asociată unei singure poziții dintr-o matrice. Această funcție desenează numai păsările ce nu au fost eliminate de către jucător, verificându-se de fiecare data valoarea corespunzătoare fiecărei poziții. În cazul în care valoarea este 1, atunci se desenează o pasăre pe locul respectiv. În caz contrar, se va lăsa un spațiu liber de dimensiunile unei păsări. Se apeleaza funcția //​Draw_Chicken//​.
Line 112: Line 113:
  
  
 +==== Cod ====
  
 +<​code>​
 +#include <​LCDWIKI_GUI.h>​
 +#include <​LCDWIKI_SPI.h>​
 +
 +#define MODEL ST7735S128
 +#define CS   A5
 +#define CD   A3
 +#define RST  A4
 +#define SDA  A2
 +#define SCK  A1
 +#define LED  A0
 +#define STANGA 10
 +#define MIJLOC 9
 +#define DREAPTA 8
 +#define BAD 12
 +#define GOOD 13
 +#define BUZZER 11
 +int start = 0;
 +int stare_stanga = 0;
 +int stare_mijloc = 0;
 +int stare_dreapta = 0;
 +int chickens = 0;
 +int killed = 0;
 +int chicken_matrix[4][8] =
 +{ {1, 1, 1, 1, 1, 1, 1, 1},
 +  {1, 1, 1, 1, 1, 1, 1, 1},
 +  {1, 1, 1, 1, 1, 1, 1, 1},
 +  {1, 1, 1, 1, 1, 1, 1, 1},
 +};
 +int shooterX = 0;
 +int shooterY = 0;
 +int fireX[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 +int fireY[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
 +int fires = -1;
 +int dir = 0;
 +int moveX = 4;
 +int moveY = 0;
 +int lives = 3;
 +
 +LCDWIKI_SPI mylcd(MODEL,​ CS, CD, -1, SDA, RST, SCK, LED); //​model,​cs,​dc,​sdo,​sda,​reset,​sck,​led
 +
 +#define BLACK   ​0x0000
 +#define BLUE    0x20B4
 +#define RED     ​0xF800
 +#define GREEN   ​0x07E0
 +#define CYAN    0x07FF
 +#define MAGENTA 0xBD96
 +#define YELLOW ​ 0xFFE0
 +#define WHITE   ​0xFFFF
 +
 +void Draw_Chicken(int i, int j, int r)
 +{
 +  mylcd.Set_Draw_color(YELLOW);​
 +  mylcd.Fill_Circle(i,​ j, r);
 +  mylcd.Set_Draw_color(BLACK);​
 +  mylcd.Fill_Circle(i + 2, j - 2, 1);
 +  mylcd.Fill_Circle(i - 2, j - 2, 1);
 +  mylcd.Set_Draw_color(RED);​
 +  mylcd.Fill_Triangle(i + 2, j + 2, i, j, i - 2, j + 2);
 +}
 +void Draw_Chickens()
 +{
 +
 +  mylcd.Set_Draw_color(YELLOW);​
 +  int r = 6, i, j, ii = 0, jj = 0;
 +  for (i = 2 * r - 1; i < mylcd.Get_Display_Width();​ i += 2 * r + 3)
 +  {
 +    for (j = 2 * r - 3; j < mylcd.Get_Display_Height() / 2; j += 2 * r + 3)
 +    {
 +      Serial.print(chicken_matrix[jj][ii]);​
 +
 +      if (chicken_matrix[jj][ii] == 0)
 +      {
 +        mylcd.Set_Draw_color(BLUE);​
 +        mylcd.Fill_Circle(i,​ j, r);
 +      }
 +
 +      else
 +      {
 +        Draw_Chicken(i,​ j, r);
 +      }
 +      //
 +
 +      Serial.print(jj);​
 +      jj = jj + 1;
 +    }
 +    ii = ii + 1;
 +    jj = 0;
 +    Serial.println(ii);​
 +
 +  }
 +
 +}
 +
 +void Draw_Fire(int id_fire)
 +{
 +  mylcd.Set_Draw_color(RED);​
 +  mylcd.Fill_Circle(fireX[id_fire],​ fireY[id_fire],​ 2);
 +}
 +
 +int Killed_Chicken(int id_fire)
 +{
 +  int r = 6, i, j, ii = 0, jj = 0;
 +  for (i = 2 * r - 1; i < mylcd.Get_Display_Width();​ i += 2 * r + 3)
 +  {
 +    for (j = 2 * r - 3; j < mylcd.Get_Display_Height() / 2; j += 2 * r + 3)
 +    {
 +      if (chicken_matrix[jj][ii] == 1 && fireY[id_fire] <= j && fireX[id_fire] >= i - 6 && fireX[id_fire] <= i + 6)
 +      {
 +        chicken_matrix[jj][ii] = 0;
 +        chickens--;
 +        return 1;
 +      }
 +      ​
 +      jj = jj + 1;
 +    }
 +    ​
 +    ii = ii + 1;
 +    jj = 0;
 +  }
 +  ​
 +  return 0;
 +}
 +
 +void Throw_Egg()
 +{
 +  //if
 +}
 +
 +void Delete_Fire(int id_fire)
 +{
 +  mylcd.Set_Draw_color(BLUE);​
 +  mylcd.Fill_Circle(fireX[id_fire],​ fireY[id_fire],​ 2);
 +  mylcd.Set_Draw_color(MAGENTA);​
 +  Draw_Ship(shooterX,​ shooterY);
 +}
 +
 +void Draw_Ship(int shx, int shy)
 +{
 +
 +  mylcd.Fill_Round_Rectangle(shx - 17, shy + 7, shx + 17, shy + 14, 4);
 +  mylcd.Fill_Triangle(shx - 7, shy + 7 , shx, shy, shx + 7, shy + 7);
 +}
 +
 +void Move_Ship()
 +{
 +  if (dir == 1 && shooterX + 10 + moveX <= mylcd.Get_Width())
 +  {
 +    mylcd.Set_Draw_color(BLUE);​
 +    Draw_Ship(shooterX,​ shooterY);
 +    mylcd.Set_Draw_color(MAGENTA);​
 +    Draw_Ship(shooterX + moveX, shooterY);
 +    delay(100);
 +    shooterX = shooterX + moveX;
 +  }
 +
 +  else if (dir == -1 && shooterX - 10 - moveX >= 0)
 +  {
 +    mylcd.Set_Draw_color(BLUE);​
 +    Draw_Ship(shooterX,​ shooterY);
 +    mylcd.Set_Draw_color(MAGENTA);​
 +    Draw_Ship(shooterX - moveX, shooterY);
 +    delay(100);
 +    shooterX = shooterX - moveX;
 +  }
 +
 +  else
 +  {
 +    return;
 +  }
 +}
 +
 +void Launch_Fire(int id_fire)
 +{
 +  fireX[fires] = shooterX;
 +  fireY[fires] = shooterY;
 +
 +  while (fireY[fires] != 0)
 +  {
 +    stare_stanga = digitalRead(STANGA);​
 +    stare_dreapta = digitalRead(DREAPTA);​
 +
 +    if (stare_stanga == HIGH && start == 1)
 +    {
 +      dir = -1;
 +      Move_Ship();​
 +    }
 +
 +    if (stare_dreapta == HIGH && start == 1)
 +    {
 +      dir = 1;
 +      Move_Ship();​
 +    }
 +
 +    Draw_Fire(fires);​
 +    killed = Killed_Chicken(fires);​
 +    if (killed == 1)
 +    {
 +      digitalWrite(GOOD,​ HIGH);
 +      beep(50); ​
 +      Delete_Fire(fires);​
 +      break;
 +    }
 +
 +    Delete_Fire(fires);​
 +    fireX[fires] = fireX[fires];​
 +    fireY[fires] = fireY[fires] - 2;
 +    if (fireY[fires] <= 0)
 +    {
 +      digitalWrite(BAD,​ HIGH);
 +      lives--;
 +      if(lives==2){
 +        beep(100);
 +        delay(10);
 +        beep(100); ​
 +      }
 +      if(lives==1){
 +        beep(100);
 +      }
 +      if(lives==0){
 +        beep(200);
 +        beep(200);
 +      }
 +    }
 +  }
 +
 +  Draw_Chickens();​
 +}
 +
 +void Win_Screen()
 +{
 +  mylcd.Fill_Screen(GREEN);​
 +  mylcd.Set_Text_colour(BLACK);​
 +  mylcd.Set_Text_Back_colour(GREEN);​
 +  mylcd.Set_Text_Size(2);​
 +  mylcd.Print_String("​CONGRATS! <​3",​ 14, 54);
 +  mylcd.Set_Text_Size(1);​
 +  mylcd.Print_String("​Wanna play again?",​ 7, 74);
 +  mylcd.Print_String("​Press the middle button",​ 0, 84);
 +}
 +
 +void Lose_Screen()
 +{
 +  mylcd.Fill_Screen(RED);​
 +  mylcd.Set_Text_colour(BLACK);​
 +  mylcd.Set_Text_Back_colour(RED);​
 +  mylcd.Set_Text_Size(2);​
 +  mylcd.Print_String("​BAD LUCK", 14, 54);
 +  mylcd.Set_Text_Size(1);​
 +  mylcd.Print_String("​Wanna try again?",​ 7, 74);
 +  mylcd.Print_String("​Press the middle button",​ 0, 84);
 +}
 +
 +void start_Page()
 +{
 +  mylcd.Fill_Screen(RED);​
 +  mylcd.Set_Text_colour(BLACK);​
 +  mylcd.Set_Text_Back_colour(RED);​
 +  mylcd.Set_Text_Size(3);​
 +  mylcd.Print_String("​START",​ 14, 54);
 +  mylcd.Set_Text_Size(1);​
 +  mylcd.Print_String("​Press the middle button",​ 0, 84);
 +}
 +
 +void beep(unsigned char delayms)
 +
 +  analogWrite(BUZZER,​ 20); 
 +  delay(delayms);​
 +  analogWrite(BUZZER ,0); 
 +  delay(delayms); ​
 +}
 +  ​
 +void setup()
 +{
 +  pinMode(STANGA,​ INPUT);
 +  pinMode(MIJLOC,​ INPUT);
 +  pinMode(DREAPTA,​ INPUT);
 +  pinMode(BAD,​ OUTPUT);
 +  pinMode(GOOD,​ OUTPUT);
 +  pinMode(BUZZER,​ OUTPUT);
 +  Serial.begin (9600);
 +  mylcd.Init_LCD();​
 +  start_Page();​
 +}
 +
 +void loop()
 +{
 +  digitalWrite(GOOD,​ LOW);
 +  digitalWrite(BAD,​ LOW);
 +
 +  stare_mijloc = digitalRead(MIJLOC);​
 +  stare_stanga = digitalRead(STANGA);​
 +  stare_dreapta = digitalRead(DREAPTA);​
 +
 +  if (stare_mijloc == HIGH && start == 0)
 +  {
 +    start = 1;
 +    mylcd.Fill_Screen(BLUE);​
 +    Draw_Chickens();​
 +    chickens = 4 * 8;
 +    shooterX = mylcd.Get_Width() / 2;
 +    shooterY = mylcd.Get_Height() - 14;
 +    mylcd.Set_Draw_color(MAGENTA);​
 +    Draw_Ship(shooterX,​ shooterY);
 +    delay(1000);​
 +    return;
 +  }
 +
 +  if (stare_mijloc == HIGH && start == 1)
 +  {
 +    fires++;
 +    Launch_Fire(fires);​
 +    fires--;
 +  }
 +
 +  if (stare_stanga == HIGH && start == 1)
 +  {
 +    dir = -1;
 +    Move_Ship();​
 +  }
 +
 +  if (stare_dreapta == HIGH && start == 1)
 +  {
 +    dir = 1;
 +    Move_Ship();​
 +  }
 +
 +  if (chickens == 0 && start == 1 && lives > 0)
 +  {
 +    for(int i=0; i<10; i++)
 +    {
 +      beep(50);
 +      delay(20);
 +    }
 +    start = 0;
 +    for (int i = 0; i < 4; i++)
 +      for (int j = 0; j < 8; j++)
 +        chicken_matrix[i][j] = 1;
 +    chickens = 4 * 8;
 +    lives = 3;
 +    delay(1000);​
 +    Win_Screen();​
 +  }
 +
 +  if (chickens != 0 && start == 1 && lives == 0)
 +  {
 +    start = 0;
 +    for (int i = 0; i < 4; i++)
 +      for (int j = 0; j < 8; j++)
 +        chicken_matrix[i][j] = 1;
 +    chickens = 4 * 8;
 +    lives = 3;
 +    delay(1000);​
 +    Lose_Screen();​
 +  }
 +}
 +</​code>​
  
  
Line 148: Line 507:
 ===== Download ===== ===== Download =====
  
-<note warning>​ +În arhiva de mai jos sunt incluse codul sursă, un README, ​scheme șpoze cu proiectul. 
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ sursescheme, etc. Un fişier ​README, ​un ChangeLog, un script de compilare şcopiere automată pe uC crează întotdeauna o impresie bună ;-).+ 
 +{{:​pm:​prj2022:​avaduva:​chicken_invaders_vespan_diana-gabriela.zip|}}
  
-Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:​pm:​prj20??:​c?​** sau **:​pm:​prj20??:​c?:​nume_student** (dacă este cazul). **Exemplu:​** Dumitru Alin, 331CC -> **:​pm:​prj2009:​cc:​dumitru_alin**. 
-</​note>​ 
  
 ===== Jurnal ===== ===== Jurnal =====
Line 164: Line 522:
 [[http://​www.lcdwiki.com/​1.44inch_Arduino_SPI_Module_ST7735S_SKU:​MAR1441#​How_to_use_on_Arduino]]\\ [[http://​www.lcdwiki.com/​1.44inch_Arduino_SPI_Module_ST7735S_SKU:​MAR1441#​How_to_use_on_Arduino]]\\
 [[https://​www.instructables.com/​Arduino-YL-44-Buzzer-module/​]]\\ [[https://​www.instructables.com/​Arduino-YL-44-Buzzer-module/​]]\\
 +LCDWIKI GUI lib Manual\\
 +LCDWIKI SPI lib Manual\\
  
 <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​ <​html><​a class="​media mediafile mf_pdf"​ href="?​do=export_pdf">​Export to PDF</​a></​html>​
pm/prj2022/avaduva/chickeninvaders.1654127413.txt.gz · Last modified: 2022/06/02 02:50 by diana.vespan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0