Code:
#include "graphics_lib.h"
#include "midi_lib.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#define X_WINDOW 1000
#define Y_WINDOW 250
#define HEADSIZE 10
#define ARMLENGTH 10
#define BODYSIZE 40
#define ARMPOSITION 15
#define STRIDE 15
#define LEG_LENGTH 40
#define STICK_MAN_HEIGHT HEADSIZE+BODYSIZE+LEG_LENGTH
#define PI 3.141592653589
#define GRAVITY 9.81
#define RETURN 13
#define NUM_HOLES 2
#define PAR1 4
/* Set offset x and y values for the title text */
#define XOFF 100
#define YOFF 30
#define SAND1MIN X_WINDOW/2-100
#define SAND1MAX X_WINDOW/2
#define WATER1MIN X_WINDOW/2
#define WATER1MAX X_WINDOW/2+100
#define HOLE1MIN X_WINDOW - XOFF - 10
#define HOLE1MAX X_WINDOW - XOFF + 10
#define ROUGH1MIN HOLE1MIN-200
#define ROUGH1MAX HOLE1MIN-100
#define OB1MIN X_WINDOW -10
#define OB1MAX X_WINDOW
#define INCREMENT 5
#define POWERMAX 100
#define POWERMIN 5
#define ANGLEMAX 85
#define ANGLEMIN -85
#define BARGAP 10
int draw_ground(int x_ground, int y_head, int COLOUR);
void draw_stick_man(int x_head, int y_head, int COLOUR);
int move_stick_man(int x_head, int y_head, int COLOUR);
void titlescreen(XF,YF)
{
/* Title Screen ASCII Art */
setbkcolor(BLACK);
outtextxy(XF+200,YF," _...._ ___ ___ _ _____");
outtextxy(XF+200,YF+10," .'.o' o.'. 2D / _ \\ / _ \\ | | | ___|");
outtextxy(XF+200,YF+20," /o o .o' o'\\ | / \\_\\ | / \\ | | | | |___");
outtextxy(XF+200,YF+30,"|'.o 'o. o'.o| | | __ | | | | | | | ___|");
outtextxy(XF+200,YF+40,"|o. o' o 'o .| | ||_ | | | | | | | | |");
outtextxy(XF+200,YF+50," \\ o .o.'o'./ | \\_/ | | \\_/ | | |___ | |");
outtextxy(XF+200,YF+60," '._o__o_.' \\___/ \\___/ |_____| |_|");
outtextxy(XF+200,YF+70," ^^^^^^^^^^ By Xi Jin");
outtextxy(XF+200,YF+120," Press any key to continue");
getch();
cleardevice();
outtextxy(XF,YF,"Please select a hole");
outtextxy(XF,YF+20,"Hole 1");
outtextxy(XF,YF+30,"Hole 2");
}
void draw_arrow(int x_arrow, int y_arrow, int COLOUR)
{
setcolor(COLOUR);
line(x_arrow,y_arrow,x_arrow+10,y_arrow+5);
line(x_arrow,y_arrow,x_arrow,y_arrow+10);
line(x_arrow,y_arrow+10,x_arrow+10,y_arrow+5);
}
int move_arrow(int x_arrow, int y_arrow, int COLOUR)
{
int key_pressed,new_y_arrow,line;
key_pressed=getch();
key_pressed=getch(); //arrows are extended keys so need two calls
new_y_arrow = y_arrow;
while (key_pressed!=RETURN)
{
draw_arrow(x_arrow, new_y_arrow, BLACK);
/* move arrow if arrow keys pressed */
if (((key_pressed==KEY_DOWN) || (key_pressed==KEY_RIGHT)) && (new_y_arrow <= y_arrow+10*(NUM_HOLES-2)))
{
new_y_arrow=new_y_arrow+10;
}
else if (((key_pressed==KEY_UP) || (key_pressed==KEY_LEFT)) && (new_y_arrow >= y_arrow+10))
{
new_y_arrow=new_y_arrow-10;
}
else new_y_arrow=new_y_arrow;
draw_arrow(x_arrow, new_y_arrow, COLOUR);
/* read keyboard again */
key_pressed=getch();
key_pressed=getch();
} /* end of while loop */
if (key_pressed==RETURN)
{
new_y_arrow=new_y_arrow;
line=new_y_arrow;
}
return line;
}
int plot_projectile(int x_head, int y_ground, int COLOUR, int power, int angle)
{
int x0,y0;
int x,y;
double vx, vy;
double t;
int v = power;
setcolor(COLOUR);
vx=v*cos(2*PI*angle/360);
vy=v*sin(2*PI*angle/360);
x0=x_head;
y0=y_ground;
x=x0;
moveto(x0,y0);
do
{
/* calculate how long it takes projectile to get from initial x position to new */
t = (x - x0) / vx;
/* calculate where y position of projectile is according to gravity */
y = (int)(y0 - (y * t) + (GRAVITY * t * t)/2);
if ( y <= y_ground) // y position is above ground so keep drawing
{
lineto(x,y); // draw little straight line between old projectile position and new
x = x++; // move projectile ordinate one pixel along
}
else
break;
}
while (x < X_WINDOW); // keep plotting until edge of window encountered
return x;
getch();
}
void draw_cursor1(int x_cursor,int COLOUR)
{
setcolor(COLOUR);
line(XOFF+x_cursor,Y_WINDOW-9,XOFF+x_cursor-5,Y_WINDOW-4);
line(XOFF+x_cursor,Y_WINDOW-9,XOFF+x_cursor+5,Y_WINDOW-4);
line(XOFF+x_cursor+5,Y_WINDOW-4,XOFF+x_cursor-5,Y_WINDOW-4);
}
int move_cursor1(int x_cursor)
{
int XF=XOFF,YF=YOFF;
int key_pressed1,new_x_cursor,angle;
key_pressed1=getch();
key_pressed1=getch(); //arrows are extended keys so need two calls
new_x_cursor = x_cursor;
while (key_pressed1!=RETURN)
{
draw_cursor1(new_x_cursor,BLACK);
/* move arrow if arrow keys pressed */
if ((key_pressed1==KEY_RIGHT) && (new_x_cursor < 360))
{
new_x_cursor=new_x_cursor+10;
}
else if ((key_pressed1==KEY_LEFT) && (0 < new_x_cursor))
{
new_x_cursor=new_x_cursor-10;
}
else new_x_cursor=new_x_cursor;
draw_cursor1(new_x_cursor,RED);
/* read keyboard again */
key_pressed1=getch();
key_pressed1=getch();
} /* end of while loop */
if (key_pressed1==RETURN)
{
angle=new_x_cursor/2 - 90;
}
return angle;
}
void draw_cursor2(int x_cursor2,int COLOUR)
{
setcolor(COLOUR);
line(XOFF+x_cursor2+360+BARGAP,Y_WINDOW-9,XOFF+x_cursor2+360+BARGAP-5,Y_WINDOW-4);
line(XOFF+x_cursor2+360+BARGAP,Y_WINDOW-9,XOFF+x_cursor2+360+BARGAP+5,Y_WINDOW-4);
line(XOFF+x_cursor2+360+BARGAP+5,Y_WINDOW-4,XOFF+x_cursor2+360+BARGAP-5,Y_WINDOW-4);
}
int move_cursor2(int x_cursor2)
{
int XF=XOFF,YF=YOFF;
int key_pressed2,new_x_cursor2,power;
key_pressed2=getch();
key_pressed2=getch(); //arrows are extended keys so need two calls
new_x_cursor2 = x_cursor2;
while (key_pressed2!=RETURN)
{
draw_cursor2(new_x_cursor2,BLACK);
/* move arrow if arrow keys pressed */
if ((key_pressed2==KEY_RIGHT) && (new_x_cursor2 < 400))
{
new_x_cursor2=new_x_cursor2+10;
}
else if ((key_pressed2==KEY_LEFT) && (0 < new_x_cursor2))
{
new_x_cursor2=new_x_cursor2-10;
}
else new_x_cursor2=new_x_cursor2;
draw_cursor2(new_x_cursor2,RED);
/* read keyboard again */
key_pressed2=getch();
key_pressed2=getch();
} /* end of while loop */
if (key_pressed2==RETURN)
{
power=new_x_cursor2/4;
}
return power;
}
void draw_hole1(int x_ground,int y_ground,int y_head)
{
setcolor(WHITE);
outtextxy(10,10,"Hole 1");
//ground
y_ground = draw_ground(x_ground, y_head, GREEN);
//sand
setcolor(YELLOW);
line(SAND1MIN,y_ground,SAND1MAX,y_ground);
//water
setcolor(BLUE);
line(WATER1MIN,y_ground,WATER1MAX,y_ground);
//rough
setcolor(BROWN);
line(ROUGH1MIN,y_ground,ROUGH1MAX,y_ground);
//ob
setcolor(RED);
line(OB1MIN,y_ground,OB1MAX,y_ground);
//hole
setcolor(BLACK);
line(HOLE1MIN,y_ground,HOLE1MAX,y_ground);
setcolor(WHITE);
line(HOLE1MIN+10,y_ground,HOLE1MIN+10,y_ground-100);
}
int angle_meter(int x_angle)
{
int angle;
int x_cursor = 180;
x_angle = XOFF +180;
setcolor(WHITE);
line(XOFF,Y_WINDOW-10,XOFF+360,Y_WINDOW-10);
outtextxy(XOFF,Y_WINDOW-25,"-90 Angle 90");
draw_cursor1(x_cursor,RED);
angle = move_cursor1(x_cursor);
return angle;
}
int power_meter(int x_power)
{
int power;
int x_cursor2 = 200;
x_power = XOFF +180;
setcolor(WHITE);
line(XOFF+360+BARGAP,Y_WINDOW-10,XOFF+360+BARGAP+400,Y_WINDOW-10);
outtextxy(XOFF+360+BARGAP,Y_WINDOW-25,"0 Power 100");
draw_cursor2(x_cursor2,RED);
power = move_cursor2(x_cursor2);
return power;
}
int draw_ground(int x_ground, int y_head, int COLOUR)
{
int y_ground;
y_ground=y_head+BODYSIZE+LEG_LENGTH;
setcolor(COLOUR);
line(x_ground,y_ground,X_WINDOW,y_ground);
return y_ground;
}
void draw_man(int x_head, int y_head, int COLOUR)
{
setcolor(COLOUR);
/* draw head */
circle(x_head, y_head, HEADSIZE);
/* Draw body */
line(x_head,y_head+HEADSIZE,x_head,y_head+BODYSIZE);
/* Draw right arm */
line(x_head,y_head+ARMPOSITION,x_head+ARMLENGTH,y_head+ARMPOSITION+20);
line(x_head+ARMLENGTH,y_head+ARMPOSITION+20,x_head,y_head+ARMPOSITION+40);
/* draw legs */
line(x_head-STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
line(x_head+STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
/* Draw left arm */
line(x_head,y_head+ARMPOSITION,x_head-ARMLENGTH,y_head+ARMPOSITION+20);
line(x_head-ARMLENGTH,y_head+ARMPOSITION+20,x_head,y_head+ARMPOSITION+40);
/* draw shaft */
line(x_head-2,y_head+ARMPOSITION+30,x_head+2,y_head+BODYSIZE+LEG_LENGTH);
/* draw club head */
// line(x_head+2,y_head+BODYSIZE+LEG_LENGTH,x_head+3,y_head+BODYSIZE+LEG_LENGTH);
// line(x_head+2,y_head+BODYSIZE+LEG_LENGTH-4,x_head,y_head+BODYSIZE+LEG_LENGTH);
}
void man1(int x_head, int y_head, int COLOUR)
{
setcolor(COLOUR);
/* draw head */
circle(x_head, y_head, HEADSIZE);
/* Draw body */
line(x_head,y_head+HEADSIZE,x_head,y_head+BODYSIZE);
/* Draw left arm */
line(x_head,y_head+ARMPOSITION,x_head-2*ARMLENGTH,y_head+ARMPOSITION);
/* Draw right arm */
line(x_head,y_head+ARMPOSITION,x_head-ARMLENGTH,y_head+ARMPOSITION+5);
line(x_head-ARMLENGTH,y_head+ARMPOSITION+5,x_head-2*ARMLENGTH+2,y_head+ARMPOSITION-0.5*ARMPOSITION);
/* draw legs */
line(x_head-STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
line(x_head+STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
/* draw shaft */
line(x_head-2*ARMLENGTH,y_head+ARMPOSITION+2,x_head-HEADSIZE,y_head-3*HEADSIZE);
}
void man2(int x_head, int y_head, int COLOUR)
{
setcolor(COLOUR);
/* draw head */
circle(x_head, y_head, HEADSIZE);
/* Draw body */
line(x_head,y_head+HEADSIZE,x_head,y_head+BODYSIZE);
/* draw legs */
line(x_head-STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
line(x_head+STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
/* Draw left arm */
line(x_head,y_head+ARMPOSITION,x_head-ARMLENGTH,y_head+ARMPOSITION+30);
/* Draw right arm */
line(x_head,y_head+ARMPOSITION,x_head-ARMLENGTH,y_head+ARMPOSITION+15);
line(x_head-ARMLENGTH,y_head+ARMPOSITION+15,x_head-ARMLENGTH,y_head+ARMPOSITION+30);
/* draw shaft */
line(x_head-ARMLENGTH,y_head+ARMPOSITION+28,x_head-2*ARMLENGTH,y_head+1.75*BODYSIZE);
}
void man3(int x_head, int y_head, int COLOUR)
{
setcolor(COLOUR);
/* draw head */
circle(x_head, y_head, HEADSIZE);
/* Draw body */
line(x_head,y_head+HEADSIZE,x_head,y_head+BODYSIZE);
/* draw legs */
line(x_head-STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
line(x_head+STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
/* Draw left arm */
line(x_head,y_head+ARMPOSITION,x_head-4,y_head+ARMPOSITION+30);
/* Draw right arm */
line(x_head,y_head+ARMPOSITION,x_head-2,y_head+ARMPOSITION+15);
line(x_head-2,y_head+ARMPOSITION+15,x_head-2,y_head+ARMPOSITION+30);
/* draw shaft */
line(x_head-2,y_head+ARMPOSITION+28,x_head-4,y_head+BODYSIZE+LEG_LENGTH);
}
void man4(int x_head, int y_head, int COLOUR)
{
setcolor(COLOUR);
/* draw head */
circle(x_head, y_head, HEADSIZE);
/* Draw body */
line(x_head,y_head+HEADSIZE,x_head,y_head+BODYSIZE);
/* draw legs */
line(x_head-STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
line(x_head+STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
/* Draw left arm */
line(x_head,y_head+ARMPOSITION,x_head+8,y_head+ARMPOSITION-5);
line(x_head+8,y_head+ARMPOSITION-5,x_head+15,y_head+ARMPOSITION-15);
/* Draw right arm */
line(x_head,y_head+ARMPOSITION,x_head+8,y_head+ARMPOSITION+5);
line(x_head+8,y_head+ARMPOSITION+5,x_head+15,y_head+ARMPOSITION-15);
/* draw shaft */
line(x_head+3*HEADSIZE-10,y_head+ARMPOSITION-12,x_head-2*HEADSIZE-10,y_head-2*HEADSIZE);
}
void man4b(int x_head, int y_head, int COLOUR)
{
setcolor(COLOUR);
/* draw head */
circle(x_head, y_head, HEADSIZE);
/* Draw body */
line(x_head,y_head+HEADSIZE,x_head,y_head+BODYSIZE);
/* draw legs */
line(x_head-STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
line(x_head+STRIDE,y_head+BODYSIZE+LEG_LENGTH,x_head,y_head+BODYSIZE);
/* Draw left arm */
line(x_head,y_head+ARMPOSITION,x_head-8,y_head+ARMPOSITION-5);
line(x_head-8,y_head+ARMPOSITION-5,x_head-15,y_head+ARMPOSITION-15);
/* Draw right arm */
line(x_head,y_head+ARMPOSITION,x_head-8,y_head+ARMPOSITION+5);
line(x_head-8,y_head+ARMPOSITION+5,x_head-15,y_head+ARMPOSITION-15);
/* draw shaft */
line(x_head-2*HEADSIZE,y_head+ARMPOSITION-12,x_head+3*HEADSIZE,y_head-2*HEADSIZE);
}
int hole_select(int new_y_arrow, int x_ground, int y_head)
{
int x_arrow=XOFF-15,y_arrow=YOFF+20;
int line_selected;
int shot;
int x_power;
int x_angle;
int x_head;
/* Hole 1 */
if (new_y_arrow == y_arrow)
{
int high1,high2;
int angle,power;
int y_ground;
x_head = 40;
high1 = 99;
high2 = 99;
draw_hole1(x_ground,y_ground,y_head);
for (shot = 0; shot <= 2*PAR1; shot++)
{
cleardevice();
draw_hole1(x_ground,y_ground,y_head);
draw_man(x_head,y_head,WHITE);
angle = angle_meter(x_angle);
power = power_meter(x_power);
draw_man(x_head,y_head,BLACK);
if (angle < 0 )
{
man4b(x_head,y_head,WHITE);
plot_projectile(x_head,y_ground,WHITE,power,angle);
getch();
}
else
{
man4(x_head,y_head,WHITE);
plot_projectile(x_head,y_ground,WHITE,power,angle);
getch();
}
cleardevice();
}
if (shot >= 2*PAR1)
{
cleardevice();
setcolor(WHITE);
outtextxy(10,10,"You have failed to achieve double par, your score is automatically double par.");
getch();
if (shot < high1) high1 = shot;
closegraph();
main();
}
else
{
cleardevice();
setcolor(WHITE);
outtextxy(10,10,"Well done");
getch();
if (shot < high1) { high1 = shot; }
closegraph();
main();
}
}
/* Hole 2 */
else if (new_y_arrow == y_arrow+10)
{
setcolor(WHITE);
cleardevice();
outtextxy(10,10,"Hole 2");
line_selected=2;
}
/* Error */
else
{
setcolor(WHITE);
cleardevice();
outtextxy(10,10,"Error");
line_selected=0;
}
return line_selected;
}
int main(void)
{
int x_arrow,y_arrow,line,x_ground,y_ground;
int x_head,y_head;
int high1 = 99, high2 = 99;
x_arrow=XOFF-15,y_arrow=YOFF+20;
x_head = 40;
y_head = 140;
x_ground = 0;
initwindow(X_WINDOW, Y_WINDOW);
titlescreen(XOFF,YOFF,high1,high2);
draw_arrow(x_arrow,y_arrow,RED);
line = move_arrow(x_arrow,y_arrow,RED);
hole_select(line, x_ground, y_head);
/*
for (shot = 0; shot < 2*PAR1; shot++)
{
printf("You are on shot number %d\n",shot+1);
x_head = 300;
y_head = 200;
x_ground=0;
y_ground = draw_ground(x_ground,y_head,WHITE);
getch();
}
*/
return 0;
}