This is RuleControl.m in view mode; [Download] [Up]
#import "RuleControl.h" #import "RuleType.h" #import "random.h" #import "Opponent.h" @implementation RuleControl Rule ruleMatrix[5][5]; int row, col, operatorRow, operatorCol, operandRow, operandCol; char statusMsg[128]; int lr, ruleActive; - init { [self resetStandard:self]; return self; } - resetStandard:sender { int x,y; // set Globals: lr = 1; // blue button title "right <--> left" ruleActive = 0; // no rule is active for (y=0; y<5; y++) // runs top-->down for (x=0; x<5; x++) // from left to right { ruleMatrix[x][y].buttonX = x; ruleMatrix[x][y].buttonY = y; if ((y*5+x) < 12) // upper half { ruleMatrix[x][y].actsOn = 0; // left color } if ((y*5+x) == 12) // center { ruleMatrix[x][y].actsOn = -1; // itself } if ((y*5+x) > 12) // lower half { ruleMatrix[x][y].actsOn = 1; // right color } } ruleMatrix[0][0].leftColor = 0; ruleMatrix[0][0].rightColor = 1; ruleMatrix[1][0].leftColor = 0; ruleMatrix[1][0].rightColor = 2; ruleMatrix[2][0].leftColor = 0; ruleMatrix[2][0].rightColor = 3; ruleMatrix[3][0].leftColor = 1; ruleMatrix[3][0].rightColor = 0; ruleMatrix[4][0].leftColor = 1; ruleMatrix[4][0].rightColor = 2; ruleMatrix[0][1].leftColor = 1; ruleMatrix[0][1].rightColor = 3; ruleMatrix[1][1].leftColor = 2; ruleMatrix[1][1].rightColor = 0; ruleMatrix[2][1].leftColor = 2; ruleMatrix[2][1].rightColor = 1; ruleMatrix[3][1].leftColor = 2; ruleMatrix[3][1].rightColor = 3; ruleMatrix[4][1].leftColor = 3; ruleMatrix[4][1].rightColor = 0; ruleMatrix[0][2].leftColor = 3; ruleMatrix[0][2].rightColor = 1; ruleMatrix[1][2].leftColor = 3; ruleMatrix[1][2].rightColor = 2; ruleMatrix[2][2].leftColor = 4; ruleMatrix[2][2].rightColor = 4; ruleMatrix[3][2].leftColor = 3; ruleMatrix[3][2].rightColor = 2; ruleMatrix[4][2].leftColor = 3; ruleMatrix[4][2].rightColor = 1; ruleMatrix[0][3].leftColor = 3; ruleMatrix[0][3].rightColor = 0; ruleMatrix[1][3].leftColor = 2; ruleMatrix[1][3].rightColor = 3; ruleMatrix[2][3].leftColor = 2; ruleMatrix[2][3].rightColor = 1; ruleMatrix[3][3].leftColor = 2; ruleMatrix[3][3].rightColor = 0; ruleMatrix[4][3].leftColor = 1; ruleMatrix[4][3].rightColor = 3; ruleMatrix[0][4].leftColor = 1; ruleMatrix[0][4].rightColor = 2; ruleMatrix[1][4].leftColor = 1; ruleMatrix[1][4].rightColor = 0; ruleMatrix[2][4].leftColor = 0; ruleMatrix[2][4].rightColor = 3; ruleMatrix[3][4].leftColor = 0; ruleMatrix[3][4].rightColor = 2; ruleMatrix[4][4].leftColor = 0; ruleMatrix[4][4].rightColor = 1; [self setAllButtons:self]; return self; } - resetRandom:sender { int x,y; // set Globals: lr = 1; // blue button title "right <--> left" ruleActive = 0; // no rule is active for (y=0; y<5; y++) // runs top-->down for (x=0; x<5; x++) // from left to right { ruleMatrix[x][y].buttonX = x; ruleMatrix[x][y].buttonY = y; ruleMatrix[x][y].actsOn = (int) floor(randomVal(0.0, 1.99999999999999)); // left/right ruleMatrix[x][y].leftColor = (int) floor(randomVal(0.0, 3.99999999999999)); ruleMatrix[x][y].rightColor = (int) floor(randomVal(0.0, 3.99999999999999)); } // center always blue ruleMatrix[2][2].actsOn = -1; // itself ruleMatrix[2][2].leftColor = 4; // blue ruleMatrix[2][2].rightColor = 4; // blue [self setAllButtons:self]; return self; } - receiveClick:sender { row = [buttonMatrix selectedRow]; col = [buttonMatrix selectedCol]; if (!ruleActive) // activate rule { ruleActive = 1; operatorRow = row; operatorCol = col; sprintf(statusMsg, "rule [%d, %d] activated", row, col); } else // execute rule { operandRow = row; operandCol = col; sprintf(statusMsg, "rule [%d, %d] was applied to rule [%d, %d]", operatorRow, operatorCol, operandRow, operandCol); // change if (ruleMatrix[operatorCol][operatorRow].actsOn == 0) // left color { // correct application of rule? if ( ruleMatrix[operatorCol][operatorRow].leftColor == ruleMatrix[operandCol][operandRow].leftColor) { ruleMatrix[operandCol][operandRow].leftColor = ruleMatrix[operatorCol][operatorRow].rightColor; [self setIcon:operandRow:operandCol]; // the change [opponent move:self]; } else { NXRunAlertPanel([NXApp appName], "rule [%d, %d] is not applicable", "OK", NULL, NULL, operatorCol, operatorRow); sprintf(statusMsg, "rule [%d, %d] was NOT applied to rule [%d, %d]", operatorRow, operatorCol, operandRow, operandCol); } } if (ruleMatrix[operatorCol][operatorRow].actsOn == 1) // right color { // correct application of rule? if ( ruleMatrix[operatorCol][operatorRow].leftColor == ruleMatrix[operandCol][operandRow].rightColor) { ruleMatrix[operandCol][operandRow].rightColor = ruleMatrix[operatorCol][operatorRow].rightColor; [self setIcon:operandRow:operandCol]; // the change [opponent move:self]; } else { NXRunAlertPanel([NXApp appName], "rule [%d, %d] is not applicable", "OK", NULL, NULL, operatorCol, operatorRow); sprintf(statusMsg, "rule [%d, %d] was NOT applied to rule [%d, %d]", operatorRow, operatorCol, operandRow, operandCol); } } if (ruleMatrix[operatorCol][operatorRow].actsOn == -1) // side change { if (ruleMatrix[operandCol][operandRow].actsOn != -1) // not blue button ruleMatrix[operandCol][operandRow].actsOn = 1 - ruleMatrix[operandCol][operandRow].actsOn; [self setText:operandRow:operandCol]; // the change [opponent move:self]; } [buttonMatrix setState:0 at:operatorRow:operatorCol]; [buttonMatrix setState:0 at:operandRow:operandCol]; ruleActive = 0; } [statusLine setStringValue:statusMsg]; return self; } - setIcon:(int)r:(int)c { int nr; id button; nr = 4*ruleMatrix[c][r].leftColor + ruleMatrix[c][r].rightColor; switch (nr) { case 0: // bb button = [buttonMatrix cellAt:r:c]; [button setIcon:"bb"]; break; case 1: // bw button = [buttonMatrix cellAt:r:c]; [button setIcon:"bw"]; break; case 2: // by button = [buttonMatrix cellAt:r:c]; [button setIcon:"by"]; break; case 3: // br button = [buttonMatrix cellAt:r:c]; [button setIcon:"br"]; break; case 4: // wb button = [buttonMatrix cellAt:r:c]; [button setIcon:"wb"]; break; case 5: // ww button = [buttonMatrix cellAt:r:c]; [button setIcon:"ww"]; break; case 6: // wy button = [buttonMatrix cellAt:r:c]; [button setIcon:"wy"]; break; case 7: // wr button = [buttonMatrix cellAt:r:c]; [button setIcon:"wr"]; break; case 8: // yb button = [buttonMatrix cellAt:r:c]; [button setIcon:"yb"]; break; case 9: // yw button = [buttonMatrix cellAt:r:c]; [button setIcon:"yw"]; break; case 10: // yy button = [buttonMatrix cellAt:r:c]; [button setIcon:"yy"]; break; case 11: // yr button = [buttonMatrix cellAt:r:c]; [button setIcon:"yr"]; break; case 12: // rb button = [buttonMatrix cellAt:r:c]; [button setIcon:"rb"]; break; case 13: // rw button = [buttonMatrix cellAt:r:c]; [button setIcon:"rw"]; break; case 14: // ry button = [buttonMatrix cellAt:r:c]; [button setIcon:"ry"]; break; case 15: // rr button = [buttonMatrix cellAt:r:c]; [button setIcon:"rr"]; break; case 20: // blue button = [buttonMatrix cellAt:r:c]; [button setIcon:"blue"]; break; } return self; } - setText:(int)r:(int)c { id button; button = [buttonMatrix cellAt:r:c]; if (ruleMatrix[c][r].actsOn == -1) // the blue button { switch (lr) { default: case 0: [button setTitle:"left <--> right"]; lr = 1; break; case 1: [button setTitle:"right <--> left"]; lr = 0; break; } return self; } if (ruleMatrix[c][r].actsOn == 0) { [button setTitle:"left"]; } else { [button setTitle:"right"]; } return self; } - setAllButtons:sender { int x,y; // set Icons for (y=0; y<5; y++) // runs top-->down for (x=0; x<5; x++) // from left to right { [self setIcon:y:x]; [self setText:y:x]; } return self; } - (Rule) ruleAt:(int)x:(int)y { return ruleMatrix[x][y]; } - setRule:(Rule)rl { int x = rl.buttonX, y = rl.buttonY; ruleMatrix[x][y].leftColor = rl.leftColor; ruleMatrix[x][y].rightColor = rl.rightColor; ruleMatrix[x][y].actsOn = rl.actsOn; [self setAllButtons:self]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.