コード例 #1
0
ファイル: g.c プロジェクト: pengyuwei/hackathon2014
static int monsters_round()
{
    int ret = 0;
    int yoffset = 0;
    int xoffset = 0;

    for (unsigned i=0; i<monsters.size(); i++) {
        ret++;
        Object *m = &monsters[i];
        mvwaddch(win_disp->win, m->y, m->x, ' ');
        yoffset = me.y - m->y;
        xoffset = me.x - m->x;
        if (abs(yoffset) > abs(xoffset)) {
            if (yoffset > 0) {
                m->y++;
            } else {
                m->y--;
            }
        } else {
            if (xoffset > 0) {
                m->x++;
            } else {
                m->x--;
            }
        }
        if (m->y == me.y && m->x == me.x) {
            me.life--;
        }
        mvwaddch(win_disp->win, m->y, m->x, m->face);
        wrefresh(win_disp->win);
        usleep(1000*200);
    }
    
    return ret;
}
コード例 #2
0
ファイル: g.c プロジェクト: pengyuwei/hackathon2014
static int fire_fly()
{
    int hit = 0;
    int ret = 0;

    for (unsigned i=0; i<fires.size(); i++) {
        ret++;
        hit = 0;
        Object *f = &fires[i];
        mvwaddch(win_disp->win, f->y, f->x, ' '); // erase old face
        f->x += f->xstep;
        f->y += f->ystep;
        if (f->x < 0 || f->x >= win_disp->locate.w
                || f->y < 0 || f->y >= win_disp->locate.h) {
            fires.erase(fires.begin() + i);
            break;
        }
        // hit test
        for (unsigned j=0; j<monsters.size(); j++) {
            Object *m = &monsters[j];
            if (f->x == m->x && f->y == m->y) {
                m->life--;
                if (m->life <= 0) {
                    hit = 1;
                    monsters.erase(monsters.begin() + j);
                    me.score += m->score;
                    break;
                }
            }
        }
        if (hit) {
            continue;
        }
        mvwaddch(win_disp->win, f->y, f->x, f->face);
        draw_me();
        wrefresh(win_disp->win);

        usleep(1000*100);
    }

    return ret;
}
コード例 #3
0
ファイル: g.c プロジェクト: pengyuwei/hackathon2014
static void draw()
{
    unsigned i = 0;

    if (NULL == win_disp) {
        return;
    }
    wclear(win_disp->win);
    char msg[16] = {0};
    sprintf(msg, "L%d R%d Score:%d", level, round, me.score);
    mvwaddstr(win_disp->win, 0, 1, msg);

    mvwaddch(win_disp->win, me.y, me.x, me.face);
    for (i=0; i<monsters.size(); i++) {
        Object *m = &monsters[i];
        mvwaddch(win_disp->win, m->y, m->x, m->face);
    }
    for (i=0; i<fires.size(); i++) {
        Object *f = &fires[i];
        mvwaddch(win_disp->win, f->y, f->x, f->face);
    }
    
    wrefresh(win_disp->win);
}
コード例 #4
0
ファイル: g.c プロジェクト: pengyuwei/hackathon2014
static int do_round(char *key)
{
    unsigned i = 0;
    int ret = 0;
    int len = strlen(key);

    for (i=0; i<monsters.size(); i++) {
        ret++;
        Object *m = &monsters[i];
        m->score += len*10;
    }

    for (i=0; i<len; i++) {
        char cmd = key[i];
        switch(cmd) {
            case 'w':
                if (me.y > 1) {
                    me.y--;
                }
                break;
            case 'a':
                if (me.x > 1) {
                    me.x--;
                }
                break;
            case 's':
                if (me.y < win_disp->locate.h) {
                    me.y++;
                }
                break;
            case 'd':
                if (me.x < win_disp->locate.w) {
                    me.x++;
                }
                break;
            case 'h':
                new_fire(-1, 0);
                break;
            case 'j':
                new_fire(0, 1);
                break;
            case 'k':
                new_fire(0, -1);
                break;
            case 'l':
                new_fire(1, 0);
                break;
            default:
                break;
        }
        ret = monsters_round();
        draw();
        
        fire_fly();
        if (me.life <= 0) {
            gameover();
            return -1;
        }

        if (ret <= 0) {
            while (fire_fly() > 0);
            break;
        }
        usleep(1000*500);
    }
    
    return ret;
}