This file is indexed.

/usr/share/fritzing/sketches/core/Fritzing Creator Kit DE+EN/creator-kit-de/Fritzing Creator Kit/PingPong/PingPong.ino is in fritzing-data 0.9.3b+dfsg-4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/*
  Ping Pong Spiel
  LED-Matrix und zwei Potis für ein Pingpong Spiel
  
  Dieses Beispiel aus dem Fritzing Creator Kit: www.fritzing.org/creator-kit.
*/

// Pinbelegung für Arduino UNO
int reihenPins[8] = {9,3,2,12,15,11,7,6};      // Anschlüsse der Reihenpins am Arduino
int spaltenPins[8] = {13,8,17,10,5,16,4,14};   // Anschlüsse der Spaltenpins am Arduino


// Pinbelegung für Arduino MEGA
// int reihenPins[8] = {9,3,2,12,55,11,7,6};      // Anschlüsse der Reihenpins am Arduino
// int spaltenPins[8] = {13,8,57,10,5,56,4,54};   // Anschlüsse der Spaltenpins am Arduino

int pot1Pin=18;                                        // Pin an dem das Potentiometer von Spieler 1 angeschlossen ist
int pot2Pin=19;                                        // Pin an dem das Potentiometer von Spieler 2 angeschlossen ist

int image[8][8]={                                      // Bild, das auf der Matrix gezeigt wird. 1 = LED an, 0 = LED aus
{0,0,0,0,0,0,0,0},  
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};                                              

int death[8][8]={                                      // Alles an
{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}, 
{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 death2[8][8]={                                      // Totenkopf
{0,1,1,1,1,1,0,0},  
{1,1,1,1,1,1,1,0},
{1,0,0,1,0,0,1,0},
{1,1,1,1,1,1,1,0},
{0,1,1,1,1,1,0,0},
{0,1,0,1,0,1,0,0},
{0,1,0,1,0,1,0,0},
{0,0,0,0,0,0,0,0}
};   

int blank[8][8]={                                      // alles aus
{0,0,0,0,0,0,0,0},  
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};    

long theTimer;                                           // Timervariable

int gameState=0;                                         // speichert den Spielmodus
int animations=300;                                      // speichert die Dauer der Zwischenbilder

float ballXSpeed = 1;                                    // speichert die Beschleunigung in X-Richtung   
float ballXPosition=4;                                   // speichert die Ballposition als reale Zahl

float ballYSpeed = 0;                                    // speichert die Beschleunigung in Y-Richtung
float ballYPosition=4;                                   // speichert die Ballposition als reale Zahl

int imageYPosition;                                      // speichert die Ballposition als ganze Zahl
int imageXPosition;                                      // speichert die Ballposition als ganze Zahl

int player1Position=3;                                   // speichert die Paddel Position von Player1
int player2Position=3;                                   // speichert die Paddel Position von Player2

int gameSpeed;                                           // speichert die aktuelle Spielgeschwindigkeit

void setup(){
  for (int i=0; i<8; i++){                               // Alle Pins werden als OUTPUT deklariert 
    pinMode(reihenPins[i],OUTPUT);
    pinMode(spaltenPins[i],OUTPUT);
  }
}

void draw(){
  for (int y=0; y<8; y++){                               // zeilenweise werden 
    for (int x=0; x<8; x++){                             // von links nach rechts alle Einträge des Arrays geprüft
      if (image[x][y]==1){                               // ist der Eintrag = 1
        digitalWrite(spaltenPins[x],HIGH);               // wird der Spaltenpin eingeschalten
      } else {                                           // sonst
        digitalWrite(spaltenPins[x],LOW);                // abgeschalten
      }
    }
    digitalWrite(reihenPins[y],LOW);                     // nun wird der Reihenpin auf LOW geschalten (da es die Kathode der LED betrifft bedeutet LOW eingeschalten: LOW = GND)
    delayMicroseconds(1000);                             // das Programm hällt 1000 Mikrosekunden an
    digitalWrite(reihenPins[y],HIGH);                    // danach wird der Reihenpin wieder auf HIGH (in diesem Fall also abge-) schalten
  }
}

void update(){
  switch (gameState) {                                   // in welchem Modus befindet sich das Programm
  case 0:                                                // neues Spiel
    memcpy(image,blank,sizeof(blank));                   // Bildschirm wird gelöscht
    gameSpeed=300;                                       // Spieltempo wird festgelegt
    ballXPosition=3;                                     // festlegen der Ballposition
    ballYPosition=3;                                     // festlegen der Ballposition
    ballYSpeed=0;                                        // Ball fliegt am Anfang gerade
    if (random(0,2)>0){                                  // per Zufall nach Links oder Rechts
      ballXSpeed=1;
    } else {
      ballXSpeed=-1;
    }     
    theTimer=millis(); 
    gameState=1;
    break;
  case 1:                                                // Spiel aktiv
    image[player1Position][0]=0;                         // Paddel Player 1 alte Position löschen
    image[player1Position+1][0]=0;                       // Paddel Player 1 alte Position löschen
    image[player2Position][7]=0;                         // Paddel Player 2 alte Position löschen
    image[player2Position+1][7]=0;                       // Paddel Player 2 alte Position löschen

    player1Position=map(analogRead(pot1Pin),0,1023,0,6); // liest die Position von Spieler 1 aus
    player2Position=map(analogRead(pot2Pin),0,1023,0,6); // liest die Position von Spieler 2 aus
    
    image[player1Position][0]=1;                         // Paddel Player 1 darstellen              
    image[player1Position+1][0]=1;                       // Paddel Player 1 darstellen    
    image[player2Position][7]=1;                         // Paddel Player 2 darstellen              
    image[player2Position+1][7]=1;                       // Paddel Player 2 darstellen        
  
    if (millis()>theTimer+gameSpeed){                    // timer für Spielgeschwindigkeit
      if (gameSpeed>50) gameSpeed-=3;                    // spiel wird beschleunigt    
      theTimer=millis();                                 // neuer Timer wird gesetzt
      image[imageYPosition][imageXPosition]=0;           // alte Position wird überschrieben    
      ballXPosition+=ballXSpeed;                         // Update der Position
      ballYPosition+=ballYSpeed;                         // Update der Position      
      
      if (ballYPosition>=7) ballYSpeed*=-1;              // Koolision unterer Rand
      if (ballYPosition<=0) ballYSpeed*=-1;              // Koolision oberer Rand

      ballYPosition=constrain(ballYPosition,0,7);        // verhindert, dass Werte kleiner 0 oder größer 7 erreicht werden
      ballXPosition=constrain(ballXPosition,0,7);        // verhindert, dass Werte kleiner 0 oder größer 7 erreicht werden      
      imageYPosition=round(ballYPosition);
      imageXPosition=round(ballXPosition);      
      
      if ((ballXPosition>=6)&&(image[imageYPosition][7]==1)) {  // wenn der Ball den Rand erreicht und das Paddel trifft
        ballXSpeed*=-1;                                    // Ball wird reflektiert
        ballYSpeed=random(-2,3);                           // Abprallwinkel bekommt Zufallskomponente
      }
      if ((ballXPosition<=1)&&(image[imageYPosition][0]==1)) {  // wenn der Ball den Rand erreicht und das Paddel trifft
        ballXSpeed*=-1;                                    // Ball wird reflektiert
        ballYSpeed=random(-2,3);                           // Abprallwinkel bekommt Zufallskomponente
      }
      if (ballXPosition>=7){                               // Ball im Aus
        gameState=2;                                       // Spiel verloren Modus wird aktiviert
        theTimer=millis();                                 // neuer Timer wird gesetzt
      }

      if (ballXPosition<=0){                               // Ball im Aus
        gameState=2;                                       // Spiel verloren Modus wird aktiviert      
        theTimer=millis();                                 // neuer Timer wird gesetzt
      }

      image[imageYPosition][imageXPosition]=1;             // neue Position wird eingeschalten
      
    }
    break;
  case 2:                                                  // Spiel verloren, kurze Nachleuchtzeit
    if (millis()>theTimer+gameSpeed){
      theTimer=millis();
      gameState=3;                                         // Spiel verloren Anzeigemodus aufrufen
    }
    break;
  case 3:                                                  // Spiel verloren Anzeigemodus
    memcpy(image,death,sizeof(death));                     // Spiel verloren Bild wird aufgerufen, memcpy ist eine Funktion, die ein Array einem anderen Array gleich setzt
    if (millis()>theTimer+animations){                     // Wartzeit
      gameState=0;                                         // Spiel starten von vorn
    }
    break;
  }
}

void loop(){
  update();                                                // alle Berechnungen sind in der update-Methode
  draw();                                                  // Darstellung ist in der draw-Methode
}