SimonController.m

/*
    File:       SimonController.m   
 
    Contains:   A sample of a simple Cocoa Application
 
    Written by:     Karl Groethe
 
    Copyright:  Copyright © 2000 by Apple Computer, Inc., All Rights Reserved.
 
            You may incorporate this Apple sample source code into your program(s) without
            restriction. This Apple sample source code has been provided "AS IS" and the
            responsibility for its operation is yours. You are not permitted to redistribute
            this Apple sample source code as "Apple sample source code" after having made
            changes. If you're going to re-distribute the source, we require that you make
            it clear in the source that the code was descended from Apple sample source
            code, but that you've made changes.
 
    Change History (most recent first):
                        6/00    created
                
 
*/
#import "SimonController.h"
 
#define HALF_A_SEC 30
#define ONE_SEC 60
#define TWO_SEC 120
#define NUM_SIMON_BUTTON 4
#define BUTTON_ONE 0
#define BUTTON_TWO 1
#define BUTTON_THREE 2
#define BUTTON_FOUR 3
#define START_STR "Start"
#define STOP_STR  "Stop"
#define PRESS_START_STR "Press start to begin."
#define PLAYING_STR "Remember the sequence..."
#define LISTENING_STR   "Repeat the sequence..."
#define GAME_OVER   "Incorrect Sequence. Game Over"
 
@implementation SimonController
- (id)init
{
    /*------------------------------------------------------
        initialize controller members
    --------------------------------------------------------*/
    self=[super init];//chain up to superclass
    
    listening=FALSE;
    sequenceLength=0;
    
    return self;
}
- (void)StartStopGame:(id)sender
{
     /*------------------------------------------------------
        Handle starting and stopping the game
    --------------------------------------------------------*/
 
    static int playing=FALSE;
    
    if(playing==TRUE){
        playing=FALSE;          //we're playing so stop playing
        listening=FALSE;        //stop listening as well
        //change the title of the Start/Stop button
        [myStartStop setTitle:[NSString stringWithCString:START_STR]];
        [myStartStop display];      //refresh title of the Start/Stop button
        //change message string to reflect that we are not playing 
        [myMessage setStringValue:[NSString stringWithCString:PRESS_START_STR]];
        [myMessage display];        //refresh message on screen
        sequenceLength=0;       //reset sequence
    }else{
        playing=TRUE;           //we're not playing so start playing
        [myCounter setIntValue:0];  //reset counter
        [myCounter display];        //refresh counter on screen
                                        //change the title of the Start/Stop button
        [myStartStop setTitle:[NSString stringWithCString:STOP_STR]];
        [myStartStop display];      //refresh button
        //change message string to reflect that we are now playing
        [myMessage   setStringValue:[NSString stringWithCString:PLAYING_STR]];
        [myMessage display];        //refresh message on screen
        [self PlaySequence];        //start playing a new sequence
    }
}
- (void)ListenSequence:(id)sender
{
    /*------------------------------------------------------
        Listen for the user's sequence and evaluate it
    --------------------------------------------------------*/
    static int index=0;//the element we are currently looking at
    long junk;
    Delay(HALF_A_SEC,&junk);//slow things down a little
    if(listening==TRUE){            //we're listening
            if(sequence[index]==sender){    //check the player's selection
            index++;                //correct selection so move on
            [myCounter setIntValue:index];  //update the onscreen counter
            [myCounter display];        
            if(index==sequenceLength){      //end of the sequence?
                [sender highlight:NO];      //reset hilighting
                [sender display];
                [self PlaySequence];        //play the new sequence
                index=0;
            }
        }else{                  //wrong selection so game over
            [myMessage setStringValue:[NSString stringWithCString:GAME_OVER]];
            [myMessage display];
            [sender highlight:NO];
            [sender display];
            Delay(TWO_SEC,&junk);       //let it sink in
            [self StartStopGame:self];      //stop the game
        }
    }else
        index=0;
}
 
- (void)PlaySequence
{
    /*------------------------------------------------------
        Play a new sequence for the player to remember
    --------------------------------------------------------*/
    int i=0;
    long junk;
    listening=FALSE;                //stop listening
    srand(time(NULL));              //randomize
    switch(rand()%NUM_SIMON_BUTTON){        //pick a random button
        case BUTTON_ONE:
            sequence[sequenceLength++]=myButton1;//and add it to the sequence
            break;
        case BUTTON_TWO:
            sequence[sequenceLength++]=myButton2;
            break;
        case BUTTON_THREE:
            sequence[sequenceLength++]=myButton3;
            break;
        case BUTTON_FOUR:
            sequence[sequenceLength++]=myButton4;
            break;
    }
    [myMessage setStringValue:[NSString stringWithCString:PLAYING_STR]];
    [myMessage display];
    for(i=0;i<sequenceLength;i++){  //play the sequence
        Delay(HALF_A_SEC,&junk);
        [myCounter setIntValue:i+1];
        [myCounter display];
        [sequence[i] performClick:self];//simulate button click
    }
    listening=TRUE;         //start listening again
    [myMessage setStringValue:[NSString stringWithCString:LISTENING_STR]];
    [myMessage display];
    
}
@end