⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 code.c

📁 C程序设计经典教程第5版程序示例,比较适合初级c语言的学生
💻 C
字号:
#include <allegro.h>

#define DOWN_RIGHT 0
#define UP_RIGHT 1
#define DOWN_LEFT 2
#define UP_LEFT 3

void moveBall(void);
void respondToKeyboard(void);
void reverseVerticalDirection(void);
void reverseHorizontalDirection(void);

int ball_x;
int ball_y;
int barL_y;
int barR_y;
int scoreL;
int scoreR;
int direction;
BITMAP *ball;
BITMAP *buffer;
BITMAP *bar;
SAMPLE *boing;
FONT *pongFont;

int main() {
    allegro_init();
    install_keyboard();
    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
    install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL);
    ball = load_bitmap("ball.bmp", NULL);
    bar = load_bitmap("bar.bmp", NULL);
    buffer = create_bitmap(640, 480);
    boing = load_sample("boing.wav");
    pongFont = load_font("pongfont.pcx", NULL, NULL);
    ball_x = SCREEN_W / 2;
    ball_y = SCREEN_H / 2;
    barL_y = SCREEN_H / 2;
    barR_y = SCREEN_H / 2;
    scoreL = 0;
    scoreR = 0;
    srand(time(NULL));
    direction = rand() % 4;
    while (!key[KEY_ESC]) {
        moveBall();
        respondToKeyboard();
        rectfill(buffer, 0, 0, 640, 480, makecol(255, 255, 255));
        blit(ball, buffer, 0, 0, ball_x, ball_y, ball->w, ball->h);
        blit(bar, buffer, 0, 0, 0, barL_y, bar->w, bar->h); 
        blit(bar, buffer, 0, 0, 620, barR_y, bar->w, bar->h);
        line(buffer, 0, 30, 640, 30, makecol(0, 0, 0));
        textprintf_ex(buffer, pongFont, 75, 0, makecol(0, 0, 0), -1, "Left Player Score: %d", scoreL);
        textprintf_ex(buffer, pongFont, 400, 0, makecol(0, 0, 0), -1, "Right Player Score: %d", scoreR);
        blit(buffer, screen, 0, 0, 0, 0, buffer->w, buffer->h);
        clear_bitmap(buffer);
    }
    destroy_bitmap(ball);
    destroy_bitmap(bar);
    destroy_bitmap(buffer);
    destroy_sample(boing);
    destroy_font(pongFont);
    return 0;
}
END_OF_MAIN();

void moveBall() {
    switch (direction) {
        case DOWN_RIGHT:
            ++ball_x;
            ++ball_y;
            break;
        case UP_RIGHT:
            ++ball_x;
            --ball_y;
            break;
        case DOWN_LEFT:
            --ball_x;
            ++ball_y;
            break;
        case UP_LEFT:
            --ball_x;
            --ball_y;
            break;
    }
    if (ball_y <= 30 || ball_y >= 440)
        reverseVerticalDirection();
        
    if (ball_x <= 20 && (direction == DOWN_LEFT || direction == UP_LEFT)) {
        if (ball_y > (barL_y - 35) && ball_y < (barL_y + 95))
            reverseHorizontalDirection();
        else if (ball_x <= -40) {
            ++scoreR;
            ball_x = SCREEN_W / 2;
            ball_y = SCREEN_H / 2;
            direction = rand() % 4;
        }
    }
    
    if (ball_x >= 580 && (direction == DOWN_RIGHT || direction == UP_RIGHT)) {
        if (ball_y > (barR_y - 35) && ball_y < (barR_y + 95))
            reverseHorizontalDirection();
        else if (ball_x >= 640) {
            ++scoreL;
            ball_x = SCREEN_W / 2;
            ball_y = SCREEN_H / 2;
            direction = rand() % 4;
        }
    }
}

void respondToKeyboard() {
     if (key[KEY_A])
        barL_y -= 3;
     if (key[KEY_Z])
        barL_y += 3;
     if (key[KEY_UP])
        barR_y -= 3;
     if (key[KEY_DOWN])
        barR_y += 3;
        
     if (barL_y < 30)
        barL_y = 30;
     if (barL_y > 380)
        barL_y = 380;
     if (barR_y < 30)
        barR_y = 30;
     if (barR_y > 380)
        barR_y = 380;
}

void reverseVerticalDirection() {
     if ((direction % 2) == 0)
        ++direction;
     else
        --direction;
     play_sample(boing, 255, 128, 1000, 0);
}

void reverseHorizontalDirection() {
     direction = (direction + 2) % 4;
     play_sample(boing, 255, 128, 1000, 0);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -