Micro-Project CGR Report
Micro-Project CGR Report
1. Rational :-
1. Laptop Windows 11 1
Subject teacher:-
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#define OP_SIZE 55
#define GRID_YOFF 15
#define AIR 0
#define P1 4
#define P2 1
#define DRAW 8
#define LEFT_KEY 75
#define RIGHT_KEY 77
#define UP_KEY 72
#define DOWN_KEY 80
#define ENTER_KEY 13
#define E_STATE -1
#define M_STATE 0
#define G_STATE 1
#define O_STATE 2
#define P1W_TXT "PLAYER1 WINS!"
struct Pointer {
int x, y;
} ptr;
struct Keyboard {
} kboard;
struct Game {
char* c;
} g;
void init();
void tick();
int render();
int isGameover(int);
int getWinner();
void drawMenu(int);
void drawGrid();
void hud();
void animatePointer();
int main() {
//initializing graphmode
detectgraph(&gd, &gm);
//initializing variables
init();
//loops game
while(g.state != E_STATE) {
//render() function returns value whether to skip tick() function for this loop or not
if(g.renderNxt == 0) tick();
g.renderNxt = render();
closegraph();
return 0;
void init() {
g.state = M_STATE;
kboard.key = UP_KEY;
g.renderNxt = 1;
ptr.turn = P1;
void tick() {
//key input
kboard.lastKey = kboard.key;
kboard.key = getch();
if(kboard.key == Q_KEY) {
g.state = M_STATE;
//resets grid
g.grid[i][j] = AIR;
//resets player
ptr.turn = P1;
ptr.lastTurn = P2;
return;
if(g.state == G_STATE) {
//pointer movement
if(kboard.key == UP_KEY)
ptr.y -= 1;
if(kboard.key == DOWN_KEY)
ptr.y += 1;
if(kboard.key == LEFT_KEY)
ptr.x -= 1;
if(kboard.key == RIGHT_KEY)
ptr.x += 1;
//adds 'X' or 'O' and animates pointer if key 'enter' and grid unit is empty
animatePointer();
g.grid[ptr.x][ptr.y] = ptr.turn;
ptr.lastTurn = ptr.turn;
}
int render() {
//keybind txt
settextstyle(10, 0, 1);
setcolor(DARKGRAY);
return g.state;
drawMenu(kboard.key);
drawGrid();
if(isGameover(getWinner()) != AIR) {
g.state = O_STATE;
return 0;
}
hud();
return 0;
return winner;
//winner txt
settextstyle(10, 0, 4);
setcolor(winner);
return winner;
int getWinner() {
//code - animates a line and returns the winning player (same for all conditions)
if(g.grid[i][0] != AIR && g.grid[i][0] == g.grid[i][1] && g.grid[i][1] == g.grid[i][2]) {
animateWin(i, 0, i, 2);
return g.grid[i][0];
animateWin(0, i, 2, i);
return g.grid[0][i];
animateWin(0, 0, 2, 2);
return g.grid[0][0];
animateWin(2, 0, 0, 2);
return g.grid[2][0];
//condition - checks for any empty grid unit and returns an empty grid value
return DRAW;
}
void drawMenu(int k) {
//title txt
settextstyle(10, 0, 6);
setcolor(YELLOW);
//ui txt
settextstyle(10, 0, 8);
void drawGrid() {
setcolor(WHITE);
//draws 'X'
line(x+XP_SIZE, y, x, y+XP_SIZE);
circle(x, y, OP_SIZE);
void hud() {
settextstyle(10, 0, 1);
setcolor(ptr.turn);
outtextxy(5, 200, HELP6_TXT);
//draws pointer
setcolor(ptr.turn);
void animatePointer() {
int x2 = x;
int y2 = y;
setcolor(ptr.turn);
delay(30);
//draw black(bg color) rectangle with same values to hide the last one
setcolor(BLACK);
x = ((x2-(GRID_UNIT_SIZE-XP_SIZE)/2) - x) * 0.2 + x;
y = ((y2-(GRID_UNIT_SIZE-XP_SIZE)/2) - y) * 0.2 + y;
setcolor(ptr.lastTurn);
while((currentEndY < y2-1 || currentEndY > y2+1 && startY != y2) || (currentEndX < x2-1 ||
currentEndX > x2+1 && startX != x2)) {
} else {
delay(30);
printf("\nstartX: %d, startY: %d, destX: %d, destY: %d", startX, startY, destX, destY);
}
2. Output of the microproject:-