/********************************************************************************************
03-B.cpp
Jim Millard
for CO311
Uses the ezwin API
********************************************************************************************/
#include <iostream>
#include <string>
using namespace std;
#include "ezwin.h"
#include "rect.h"
void DrawCheckerboard(SimpleWindow& W, const color, const color);
void BlockPosition(int row, int column, float blockHeight, float blockWidth,
float& windowX, float& windowY);
color SetColor(int row, int column, color, color);
int ApiMain()
{
cout << "This program will display a checkerboard using two colors that you choose." << endl;
<< "Please choose two colors from the following list: " << endl
<< "0-Black, 1-White, 2-Red, 3-Green, 4-Blue, 5-Yellow, 6-Cyan, 7-Magenta" << endl;
int BaseColor, AltColor;
cout << "Choose the first color: ";
cin >> BaseColor;
cout << "Choose the second color: ";
cin >> AltColor;
//create the primary window
SimpleWindow W("Practical 3, Problem B");
W.Open();
DrawCheckerboard(W, (color)BaseColor, (color)AltColor);
//wait for input prior to quitting
char ch;
cout << "Enter a character to continue";
cin >> ch;
Terminate();
return 0;
}
//
//this function draws the checkerboard
//
void DrawCheckerboard(SimpleWindow& W, const color BaseColor, const color AltColor)
{
//A stack of useful constants that can later be replaced by function parameters
const float height=1., //static height of all blocks
width =1.; //static width of all blocks
const int BlocksAcross=8, //static width of checkerboard
BlocksDown =8; //static height of checkerboard
color currentColor; //the color we're drawing now
float absX, absY; //the position of the block in the window
//Draw by rows
for(int row = 0; row < BlocksDown; row++)
{
//Draw the rectangles across the row
for (int column = 0; column < BlocksAcross; column++)
{
//set the color based on its position
currentColor = SetColor(row, column, BaseColor, AltColor);
//calculate the position of the block in the display window
BlockPosition(row, column, height, width, absX, absY);
//create the block with relevant parameters
RectangleShape Rxy(W, absX, absY, currentColor, width, height);
//dray the block
Rxy.Draw();
} //inner for loop
} //outer for loop
return;
} //DrawCheckerboard
//
//this function automates the discovery of the EXACT position where the block will be placed
//based on the row/column "general" placement, and the block's height and width.
//This routine assumes that all blocks will ultimately be of identical height and that
//the first row/column is (0,0) and the origin (0,0) is in the upper-left corner.
//
void BlockPosition(int row, int column, float blockHeight, float blockWidth,
float& windowX, float& windowY)
{
windowX = column*blockWidth + blockWidth/2;
windowY = row*blockHeight + blockHeight/2;
}
//
//this function sets the color of the square based on it's position in the checkerboard
//it takes advantage of the coincicence between the sum of row & column for the block and
//whether that sum is even or odd.
//
color SetColor(int row, int column, color color_1, color color_2)
{
switch ((row + column)%2)
{
case 1:
return color_2;
default:
return color_1;
}
}