Spielautomat erweitern (frage dazu)

yakisikli123

Grünschnabel
hallo

ich soll einen spielautomaten (mit LED s , bzw 4 felder) erweitern

mit mehrere spielvarianten

mehrere schwierigkeitsstufen



hier habe den quellcode





Code:
#include <msp430x16x.h>

void delay_value(unsigned int wert){           //Pause-Funktion
  for (unsigned int j=1; j<wert; j++);	
}

void ton_laenge(unsigned int laenge){          //Funktion für Tonlänge
  for (unsigned int i=0; i<laenge; i++);
}

int buffer =0,t,a=0;
static int A[10];

void zufall(unsigned int *D,int stufe){
  unsigned int y=1234;                         //Wert beliebig!
  double w=TAR;				       //Timerwert auslesen
  double wb=w/3;
  for(int i=0;i<=stufe+3;i++){
    y=(unsigned int)(w+wb*0.732+3.14159*y);    //erstellen mehrerer "Zufallszahlen"
    *D=(unsigned int)(y%4)+1;                  //mithilfe der Umwandlung von "double"
    *D++;                                      //in "integer" und Modulo 4
  }
}

void PWM (long int lange, int weite){          //Puls-Weiten-Modulation zur Tonausgabe
  P5OUT &= (1<<7);
  P5DIR |= (1<<7);
  TBCCR0 = lange;                              //Periodenlänge
  TBCCR1 = weite;                              //länge des "dutycycle" (Tastgrad)
  TBCCTL1 |= (1<<4);
  TBCTL |= (1<<5) | (1<<4) | (1<<9);
  _BIS_SR(GIE);                            
  }

void ton(int x){                               //Funktion zum erstellen mehrerer Töne
  switch(x){
  case 1:                                      //Fehler-Ton
     PWM(1300, 300);                      
     ton_laenge(30000);
     TBCCTL1 &= ~(1<<4);
     P5OUT &= ~(1<<7);
     PWM(2100, 300);
     ton_laenge(35000);
     TBCCTL1 &= ~(1<<4);
     P5OUT &= ~(1<<7);
     PWM(3000, 300);
     ton_laenge(65000);
     TBCCTL1 &= ~(1<<4);
     P5OUT &= ~(1<<7);
     break;
  case 2:                                      //Sieg-Ton
    PWM(1000, 300);
    ton_laenge(20000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    PWM(300, 300);
    ton_laenge(25000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    PWM(300, 300);
    ton_laenge(25000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    PWM(1000, 300);
    ton_laenge(20000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    PWM(300, 300);
    ton_laenge(65000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    break;
  case 3:                                    //Ton Feld
    PWM(1000, 300);
    ton_laenge(10000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    break;
  case 4:                                    //Ton Feld
    PWM(900, 300);
    ton_laenge(10000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    break;
  case 5:                                    //Ton Feld
    PWM(800, 300);
    ton_laenge(10000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    break;
  case 6:                                    //Ton Feld
    PWM(700, 300);
    ton_laenge(10000);
    TBCCTL1 &= ~(1<<4);
    P5OUT &= ~(1<<7);
    break;
  default:
    break;
  }
}

void tim(int stufe){                        //Funktion für die Schnelligkeit der abgespielten Kombination
  for (int k=1;k<(10-stufe);k++)            //mit steigender Stufe werden die Pausen
    delay_value(50000);                     //zwischen den aufleuchtenden Feldern kürzer
}

void ausg(int x, int stufe){                //Ausgabe-Funktion die mithilfe der "Zufallszahlen"
  switch (x){                               //eine Kombination erstellt
    case 1:
      P2OUT |= (1<<1);
      ton(3);
      tim(stufe);
      P2OUT &= ~(1<<1);
      break;
    case 2:
      P2OUT |= (1<<2);
      ton(4);
      tim(stufe);
      P2OUT &= ~(1<<2);
      break;
    case 3:
      P2OUT |= (1<<3);
      ton(5);
      tim(stufe);
      P2OUT &= ~(1<<3);
      break;
    case 4:
      P2OUT |= (1<<4);
      ton(6);
      tim(stufe);
      P2OUT &= ~(1<<4);
      break;
  default:
    ton(2);
      P2OUT = 0x00;
  }
  delay_value(50000);                         //Verzögerung ziwschen den Felder der Kombination
}

int abfr(){                                   //Funktion zur Abfrage der gespielten Kombination
  for(int i=0;i<10;i++){
    for(unsigned int j=0;j<50000;j++){
      if( P1IN & (1<<1) ){
        while( P1IN & (1<<1) ){
          delay_value(2000);
          P2OUT |=(1<<1);
        }
        P2OUT &= ~(1<<1);
        buffer = 1;
        delay_value(2000);
        return 1;
      }
      if( P1IN & (1<<2) ){
        while( P1IN & (1<<2) ){
          delay_value(2000);
          P2OUT |=(1<<2);
        }
        P2OUT &=~(1<<2);
        buffer = 2;
        delay_value(2000);
        return 2;
      }
      if( P1IN & (1<<3) ){
        while( P1IN & (1<<3) ){
          delay_value(2000);
          P2OUT |=(1<<3);
        }
        P2OUT &= ~(1<<3);
        buffer = 3;
        delay_value(2000);
        return 3;
      }
      if( P1IN & (1<<4) ){
        while( P1IN & (1<<4) ){
          delay_value(2000);
          P2OUT |=(1<<4);
        }
        P2OUT &=~(1<<4);
        buffer = 4;
        delay_value(2000);
        return 4;
      }
    }
  }
  return 0;
}

int spiel()                                 //Hauptfunktion des Spiels
{
  int stufe=0,fehler=0;                     

  do
  {
    zufall(A, stufe);                       //Aufruf der Funktion "Zufall" abhängig von der Höhe der Stufe
    ausg(A[0], stufe);                      //Ausgabe der ersten Kombination         
    ausg(A[1], stufe);
    ausg(A[2], stufe);
    ausg(A[3], stufe);
    if (stufe>3)                            //Solange Stufe 4 noch nicht erreicht wurde, besteht
    {                                       //die Kombination aus 4 Felder, danach
      for (int z=4; z<=stufe; z++)          //steigt es pro Stufe um ein Feld
        ausg(A[z], stufe);
    }
    abfr();                                 //die ausgegebene Kombination wird Feld
    if (A[0]==buffer)                       //für Feld abgefragt
    {
      abfr();
      if (A[1]==buffer)
      {
        abfr();
        if (A[2]==buffer)
        {
          abfr();
          if (A[3]==buffer)
          {
            if (stufe<=3)                   //bis Stufe 4 wird bei richtiger
              stufe++;                      //Eingabe nur die Stufe erhöht
            else                            //ab Stufe 4 kommt pro Stufe ein
            {                               //Feld mehr dazu
             if (fehler < 3){                              
              for (t=4; t<=stufe; t++)
              {
                abfr();
                 if( A[t]!=buffer )         //bei falscher Eingabe wird die Fehler-Variable
                 {                          //um 1 erhöht und es ertönt der Fehler-Ton
                  fehler ++;
                  P2OUT |= (1<<1);
                  P2OUT |= (1<<2);
                  delay_value(50000);
                  P2OUT = 0x00;
                  P2OUT |= (1<<3);
                  P2OUT |= (1<<4);
                  delay_value(50000);
                  P2OUT = 0x00;
                  ton(1);
                  delay_value(50000);
                }
               }        
              }
              if (fehler<3)
                  stufe++;
            }
          }
          else
          {
            fehler ++;
            P2OUT |= (1<<1);
            P2OUT |= (1<<2);
            delay_value(50000);
            P2OUT = 0x00;
            P2OUT |= (1<<3);
            P2OUT |= (1<<4);
            delay_value(50000);
            P2OUT = 0x00;
            ton(1);
            delay_value(50000);
          }
        }
        else
        {
          fehler ++;
          P2OUT |= (1<<1);
          P2OUT |= (1<<2);
          delay_value(50000);
          P2OUT = 0x00;
          P2OUT |= (1<<3);
          P2OUT |= (1<<4);
          delay_value(50000);
          P2OUT = 0x00;
          ton(1);
          delay_value(50000);
        }
      }
    else
    {
      fehler ++;
      P2OUT |= (1<<1);
      P2OUT |= (1<<2);
      delay_value(50000);
      P2OUT = 0x00;
      P2OUT |= (1<<3);
      P2OUT |= (1<<4);
      delay_value(50000);
      P2OUT = 0x00;
      ton(1);
      delay_value(50000);
    }
    }
    else
    {
      fehler ++;
      P2OUT |= (1<<1);
      P2OUT |= (1<<2);
      delay_value(50000);
      P2OUT = 0x00;
      P2OUT |= (1<<3);
      P2OUT |= (1<<4);
      delay_value(50000);
      P2OUT = 0x00;
      ton(1);
      delay_value(50000);
    }
    for (int i=1; i<10; i++){
      delay_value(50000);
    }
  }                                         //sobald der Spieler 3 Fehler macht oder
  while( fehler !=3 && stufe !=9 )          //die 9.Stufe erreicht ist das Spiel beendet
      ;
  if (stufe==9)                             //bei erreichen der 9.Stufe wird der Sieg-Ton abgespielt
  {                                         //und alle Felder leuchten nacheinander auf
    ausg(1,stufe);
    ton(2);
    ausg(2,stufe);
    ton(2);
    ausg(3,stufe);
    ton(2);
    ausg(4,stufe);
    ton(2);
  }
  if (fehler == 3){                          //nach 3 Fehlern wird das Spiel beendet und man hat verloren
    for(int f=0;f<=2;f++){
      P2OUT |= (1<<1);
      delay_value(30000);
      P2OUT = 0x00;
      P2OUT |= (1<<4);
      delay_value(30000);
      P2OUT = 0x00;
      P2OUT |= (1<<2);
      delay_value(30000);
      P2OUT = 0x00;
      P2OUT |= (1<<3);
      delay_value(30000);
      P2OUT = 0x00;
    }
    ton(1);
    delay_value(25000);
    ton(1);
    delay_value(25000);
  }
  return 0;
}


#pragma vector = PORT1_VECTOR           //Interrupt zum Starten des Spiels bei betätigen des Schalters
__interrupt void Port1_Interrupt(void)
{
  if( P1IFG & (1<<0) ){                 //Wenn Flag von P1.0 gesetzt ist wird ein Interrupt ausgelöst
    P1IFG=0x00;                         //Flag wird wieder 0 gesetzt um Interruptfähigkeit wiederherzustellen
    P2OUT=0x00;
    spiel();                            //Spiel wird gestartet
  }
}

#pragma vector=TIMERB1_VECTOR           //Interrupt Funktion für PWM-Generierung
__interrupt void Timerbx_ISR (void){
   if(a){
     P5OUT |= (1<<7);
     a--;
   }
   else{
     P5OUT &= ~(1<<7);
     a++;
   }
   TBCCTL1 &= ~(1<<0);
}

int main( void ){
  WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer to prevent time out reset

  P1OUT=0x00;                           //Setzen der Ports auf Startwerte
  P2OUT=0x00;                           //um zufällige Werte zu verhindern
  P3OUT=0x00;
  P4OUT=0x00;
  P5OUT=0x00;
  P6OUT=0x00;

  P1IFG=0x00;
  P2IFG=0x00;

  P1IFG=0x00;
  P2IES=0x00;

  P1IE=0x00;
  P2IE=0x00;

  P1SEL=0x00;
  P2SEL=0x00;
  P3SEL=0x00;
  P4SEL=0x00;
  P5SEL=0x00;
  P6SEL=0x00;

  P1DIR=0x00;
  P2DIR=0x00;
  P3DIR=0x00;
  P4DIR=0x00;
  P5DIR=0x00;
  P6DIR=0x00;

  P1IE |=0x01;
  P1DIR &= ~(1<<1) & ~(1<<2) & ~(1<<3) & ~(1<<4);		//?
  P2DIR |= (1<<0) | (1<<1) | (1<<2) | (1<<3) | (1<<4);

  TACTL = 0x00;
  TACTL = TASSEL_2 + TACLR;             //SMCLK, clear TAR
  TACTL |= MC1;
  _BIS_SR(GIE);                         //interrupt enable

  while(1){                             //Endlosschleife
    
  }
  return 0;
}


ich habe vor das man auswählen kann welche stufe man spielen will dazu muss derjenige
den feld drücken

am anfang soll es nur die felder erhöhen nicht die schnelligkeit ab 9 richtige soll schnelligkeit erhöht werden

es sollen andere spielvarianten wie statt leuchtende den nicht leuchtenden betätigen
oder das ganze rückwärts machen usw


habt ihr vielleicht paar vorschläge bezüglich des codes

vielen dank im voraus
 
hä wie habt ihre vorschläge also deine arbeit wird dir hier niemand machen wo liegt deon problem wenn du eins hast dann helfen wir gerne aber wenigsten ein ansatz deiner neuen funktion solltest du schon hab und nicht quellcode das will ich haben hier macht mal oder hab ich das jetzt falsch verstanden?
 
Zurück