首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++和Allegro5中的乒乓球类游戏

C++和Allegro5中的乒乓球类游戏
EN

Code Review用户
提问于 2016-04-08 10:48:59
回答 1查看 1.1K关注 0票数 7

在过去的10天里,我一直在做这场乒乓球比赛,我想知道你对它的看法,我能改变什么来使我的代码更好呢?

代码语言:javascript
复制
 #include <stdio.h>
#include <allegro5/allegro.h>
#include "allegro5/allegro.h"
#include "allegro5/allegro_image.h"
#include <allegro5/allegro_native_dialog.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/color.h>
#include <allegro5/allegro_color.h>
#include <allegro5/allegro5.h>
#include <allegro5/color.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_ttf.h>
#include <iostream>
int p1score = 0;
int p2score=0;

ALLEGRO_EVENT ev;
int main(){
srand (time(NULL));
int d = 200;
int f = 200;
int x = 700;
int y = 100;
int a = 100;
int b = 100;
int ballx = 200;
int bally = 200;
int ballXSpeed = 10;
int ballYSpeed = 5;
bool ballmoving = true;
al_init_image_addon();
ALLEGRO_BITMAP *Player1;
ALLEGRO_BITMAP *Player2;
ALLEGRO_BITMAP *ball;
ALLEGRO_DISPLAY *display = NULL;

ALLEGRO_EVENT_QUEUE *eventqueue = NULL;
ALLEGRO_TIMER *timer = NULL;

bool playing = true;
al_init();
al_init_primitives_addon();
display = al_create_display(800, 600);
al_install_keyboard();
eventqueue = al_create_event_queue();
timer = al_create_timer(1.0 / 60.0);
al_register_event_source(eventqueue, al_get_keyboard_event_source());
al_register_event_source(eventqueue, al_get_display_event_source(display));
al_register_event_source(eventqueue, al_get_timer_event_source(timer));
Player1 = al_load_bitmap("brick.png");
Player2 = al_load_bitmap("brick.png");
int P1W = al_get_bitmap_width(Player1);
int P1H = al_get_bitmap_height(Player1);
int P2W = al_get_bitmap_width(Player2);
int P2H = al_get_bitmap_height(Player2);

ball = al_load_bitmap("ball.png");
int ballw = al_get_bitmap_width(ball);
int ballh = al_get_bitmap_height(ball);
while (playing){
    ballYSpeed = rand() % 7;

    al_clear_to_color(al_map_rgb(255, 255, 0));
    al_wait_for_event(eventqueue, &ev);
    al_start_timer(timer);
    if (ev.type == ALLEGRO_EVENT_TIMER){

        ballx = ballx + ballXSpeed;
        bally = bally + ballYSpeed;
        if (ballx < x+P1W && ballx+ballw>x &&bally<y+P1H && ballx+ballh>y){
            ballXSpeed = ballXSpeed * -1;
            ballYSpeed = ballYSpeed*-1;
        }
        if (ballx < a + P2W && ballx+ballw>a && bally <b + P2H &&bally+ballh>b){
            ballXSpeed = ballXSpeed*-1;
            ballYSpeed = ballYSpeed*-1;
        }
        if (ballx > 800 || bally > 600){
            ballx = 400;
            bally = 400;
            p2score++;
            std::cout << "P2 :  " << p2score << std::endl;
        }
        if (ballx<-1 || bally<-1){
            ballx = 400;
            bally = 400;
            p1score++;
            std::cout << "P1:   " << p1score << std::endl;
        }
    }
        if (ev.type = ALLEGRO_EVENT_KEY_DOWN){
            switch (ev.keyboard.keycode){
            case ALLEGRO_KEY_UP:
                y -= 20;
                break;
            case ALLEGRO_KEY_DOWN:
                y += 20;
                break;
            case ALLEGRO_KEY_W:
                b -= 20;
                break;
            case ALLEGRO_KEY_S:
                b += 20;
                break;


            }
        }

        al_draw_bitmap(Player1, x, y, 0);
        al_draw_bitmap(Player2, a, b, 0);
        al_draw_bitmap(ball, ballx, bally, 0);
        al_flip_display();
    }

al_flip_display();
al_rest(5);
}       
EN

回答 1

Code Review用户

回答已采纳

发布于 2016-04-08 12:55:33

我看到了一些可以帮助你改进你的程序的东西。

修复格式化

也许缩进问题在一定程度上是一个剪切粘贴问题,但结果的格式不太好,代码很少缩进。

修复bug

在这一行

代码语言:javascript
复制
if (ev.type = ALLEGRO_EVENT_KEY_DOWN)

很可能您实际上并不是要分配值,而是要测试它,所以应该按照如下方式编写:

代码语言:javascript
复制
if (ev.type == ALLEGRO_EVENT_KEY_DOWN)

消除未使用的变量

未使用的变量是代码质量较差的标志,因此消除它们应该是一个优先事项。根据我的编译器也告诉我,在这段代码中,dfballmmoving都是未使用的。如果您要求编译器这样做的话,您的编译器可能也足够聪明地告诉您这一点。

消除全局变量

我对这段代码的重写没有使用全局变量,因此显然它们既不快也不需要。消除它们可以使您的代码更具可读性和可维护性,这两者都是编写良好的代码的重要特征。全球变量引入了难以识别和容易出错的混乱联系。

检查错误的返回值

al_load_bitmapal_create_event_queue等的调用可能失败。您应该检查返回值,以确保它们没有。

消除了“幻数”

这段代码中到处都是“魔术数字”,即未命名的常量,如400、7、600等。一般来说,最好避免这种情况,并给这些常量取有意义的名称。这样,如果需要更改任何内容,您就不必对所有" 800“实例的代码进行搜索,然后尝试确定这个特别的800是否意味着窗口的宽度或其他恰好具有相同值的常量。

将代码分解为较小的函数

与其把所有东西都放在一个长函数中,如果每一个离散的步骤都是它自己的功能,它将更容易阅读和维护。

想到的是用户

现在还没有一个优雅的方式来结束这场比赛。通过将这三行添加到switch语句中,可以很容易地解决这一问题:

代码语言:javascript
复制
case ALLEGRO_KEY_Q:
    playing = false;
    break;

此外,球和球员可以离开屏幕的顶部或底部,使玩游戏变得更加困难和不那么愉快。

此外,我不是快板专家,但游戏似乎没有很好的反应,即使我的机器是快速的,并有很多的记忆。有什么地方不对劲。

使用对象

每个球员,球场和球都可以是物体,这可以简化这里的一些事情。考虑将代码转换为更面向对象的设计。

票数 11
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/125148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档