1
Name:
Anonymous
2010-06-07 17:22
Program a game in which the 'player' controls the likeness of Link(Zelda). The objective of the game is to defeat as many 'Goombas'(Mario Bros.) as they can before dieing. The rest is up to you.
Only one factor of your program will be judged: fun-ness.
Get to work!
56
Name:
Anonymous
2010-06-08 19:51
Well, this certainly turned out uglier than I anticipated. I may do another one tomorrow.
You'll also need this:
http://cairnarvon.rotahall.org/goombarum/sprites.pcx
(Screenshot:
http://cairnarvon.rotahall.org/goombarum/screenshot.png )
/* gcc goomba.c `allegro-config --libs` */
#include <stdio.h>
#include <allegro.h>
typedef struct { int x, y; } POS;
int main(void)
{
BITMAP *sprites, *link, *goomba1, *goomba2, *boom, *cloud, *buffa;
PALETTE pal;
extern FONT *font;
POS link_pos, missiles[5], booms[5], cloud_pos,
goombas[36];
int i, flip_alter = 10, clouder = 200,
going_right = 1, speed = 3,
booming[5], b_ind = 0,
score = 0, loser = 1;
allegro_init();
install_keyboard();
install_timer();
set_color_depth(32);
if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0) != 0) {
fprintf(stderr, "Couldn't initialise Allegro!\n");
return 1;
}
set_window_title("Goombarum goombis goombis");
sprites = load_pcx("sprites.pcx", pal);
if (!sprites) {
fprintf(stderr, "Couldn't load sprites!\n");
return 2;
}
/* Load sprites */
link = create_bitmap(22, 32);
blit(sprites, link, 0, 0, 0, 0, 22, 32);
goomba1 = create_bitmap(16, 16);
blit(sprites, goomba1, 22, 0, 0, 0, 16, 16);
goomba2 = create_bitmap(16, 16);
blit(sprites, goomba2, 22, 16, 0, 0, 16, 16);
boom = create_bitmap(32, 32);
blit(sprites, boom, 38, 0, 0, 0, 32, 32);
cloud = create_bitmap(16, 32);
blit(sprites, cloud, 70, 0, 0, 0, 16, 32);
destroy_bitmap(sprites);
buffa = create_bitmap(SCREEN_W, SCREEN_H);
/* Position everything */
link_pos.x = SCREEN_W / 2;
link_pos.y = SCREEN_H - 41;
for (i = 0; i < 5; ++i) {
missiles[i].x = missiles[i].y = -1;
booms[i] = missiles[i];
booming[i] = 0;
}
for (i = 0; i < 12; ++i) {
goombas[i].x = goombas[i + 24].x = 32 + 32 * i;
goombas[i + 12].x = 16 + 32 * i;
goombas[i].y = 68;
goombas[i + 12].y = 100;
goombas[i + 24].y = 132;
}
cloud_pos.x = -10;
cloud_pos.y = 0;
/* Main loop */
for (;;) {
int alter = flip_alter > 5, live = 0, max_left = 640, max_right = 0;
/* Paint current game state */
clear_to_color(buffa, makecol(0, 200, 0));
for (i = 0; i < 5; ++i) {
if (missiles[i].x >= 0)
circlefill(buffa,
missiles[i].x, missiles[i].y, 2,
makecol(255, 0, 0));
if (booming[i] > 0)
draw_sprite(buffa, boom, booms[i].x - 16, booms[i].y - 16);
}
draw_sprite(buffa, link, link_pos.x - 11, link_pos.y);
for (i = 0; i < 12; ++i) {
if (goombas[i].x >= 0)
draw_sprite(buffa,
alter ? goomba1 : goomba2,
goombas[i].x - 8,
goombas[i].y - 8);
if (goombas[i + 24].x >= 0)
draw_sprite(buffa,
alter ? goomba1 : goomba2,
goombas[i + 24].x - 8,
goombas[i + 24].y - 8);
alter = !alter;
if (goombas[i + 12].x >= 0)
draw_sprite(buffa,
alter ? goomba1 : goomba2,
goombas[i + 12].x - 8,
goombas[i + 12].y - 8);
}
textprintf_ex(buffa, font, 0, 0,
makecol(255, 255, 255), makecol(0, 0, 0),
"Score: %d", score);
if (cloud_pos.x >= -8)
draw_sprite(buffa, cloud, cloud_pos.x - 8, 0);
blit(buffa, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
/* Update game state */
if (--flip_alter == 0) flip_alter = 10;
if (keypressed()) {
int k = readkey();
if ((k & 0xff) == 'q')
break;
switch (k >> 8) {
case KEY_SPACE:
for (i = 0; i < 5; ++i) {
if (missiles[i].x < 0) {
missiles[i] = link_pos;
break;
}
}
break;
case KEY_LEFT:
if (link_pos.x > 27)
link_pos.x -= 5;
break;
case KEY_RIGHT:
if (link_pos.x < SCREEN_W - 27)
link_pos.x += 5;
}
clear_keybuf();
}
for (i = 0; i < 36; ++i) {
if (goombas[i].x >= 0) {
int killed = 0, j;
for (j = 0; j < 5; ++j) {
int xd = goombas[i].x - missiles[j].x,
yd = goombas[i].y - missiles[j].y;
if (xd >= -16 && xd <= 16 && yd >= -16 && yd <= 16) {
booms[b_ind] = goombas[i];
booming[b_ind] = 16;
++b_ind;
b_ind %= 5;
goombas[i].x = goombas[i].y = -1;
missiles[j] = goombas[i];
++killed;
++speed;
score += 100 * speed;
fprintf(stderr, "Killed Goomba #%d!\n", i);
break;
}
}
if (!killed) {
goombas[i].x += going_right ? speed / 3 : -speed / 3;
if (goombas[i].x < max_left) max_left = goombas[i].x;
if (goombas[i].x > max_right) max_right = goombas[i].x;
++live;
}
}
}
if (live == 0) {
loser = 0;
break;
}
if ((going_right && max_right > SCREEN_W - 32) ||
(!going_right && max_left < 32)) {
int max_down = 0;
going_right = !going_right;
for (i = 0; i < 36; ++i) {
goombas[i].y += 16;
if (goombas[i].y > max_down) max_down = goombas[i].y;
}
if (max_down > SCREEN_H - 50)
break;
}
for (i = 0; i < 5; ++i) {
if (missiles[i].x >= 0) {
if (cloud_pos.x >= -8 && missiles[i].y < 32) {
int dx = missiles[i].x - cloud_pos.x;
if (dx >= -8 && dx <= 8) {
booms[b_ind].x = cloud_pos.x;
booms[b_ind].y = 16;
booming[b_ind] = 30;
++b_ind;
b_ind %= 5;
missiles[i].y = 0;
cloud_pos.x = -10;
clouder = 400;
score += 5000;
}
}
missiles[i].y -= 5;
if (missiles[i].y < 0) missiles[i].x = -1;
}
--booming[i];
}
if (cloud_pos.x >= -8) {
cloud_pos.x += 6;
if (cloud_pos.x > SCREEN_W + 8) {
cloud_pos.x = -10;
clouder = 200;
}
}
--clouder;
if (clouder == 0)
cloud_pos.x = -8;
rest(25);
}
textout_centre_ex(screen, font, loser ? "YOUR JAMES OVER" : "WINRAR",
SCREEN_W / 2, SCREEN_H / 2,
makecol(255, 255, 255), -1);
clear_keybuf();
while (!keypressed());
return 0;
}