main.cpp

来自「一个语言识别引擎」· C++ 代码 · 共 264 行

CPP
264
字号
// -*- mode:C++; tab-width:4; c-basic-offset:4; indent-tabs-mode:nil -*-
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

#include <yarp/os/all.h>

#include <yarp/os/RateThread.h>
#include <yarp/os/Random.h>
#include <yarp/os/Semaphore.h>

#include <yarp/os/Time.h>
using namespace yarp::os;

const char SERVER_NAME[]="/game";
const int PLAYER_RATE=500;

const char UP[]="up";
const char DOWN[]="down";
const char RIGHT[]="right";
const char LEFT[]="left";
const char FIRE[]="fire";
const char GO[]="go";

class MyPlayer: public RateThread
{
public:
    MyPlayer(const char *n, int rate):RateThread(rate)
    {
        myX=0;
        myY=0;
        myLife=0;
        shooterF=0;

        strcpy(myName, n);
        printf("Registering port\n");
        port.open(myName);
    }

    ~MyPlayer()
    {
        port.close();
    }

    void doInit()
    {
        mutex.wait();

        printf("Connecting with game server\n");
        Network::connect(port.getName(), SERVER_NAME);

        myLife=6;

        Random::seed(time(0));
    
        mutex.post();
    }

    void doLoop()
    {
        mutex.wait();
        
        look();
        rndMove();
        if(shooterF)
            rndShoot();

        mutex.post();
    }

    void doRelease()
    {
        mutex.wait();

        printf("Disconnecting\n");
        Network::disconnect(port.getName(), SERVER_NAME);
        
        mutex.post();
    }

    void look()
    {
        Bottle cmd;
        Bottle response;
        cmd.addString("look");
        port.write(cmd,response);

        // pick out map part
        world= response.findGroup("look").findGroup("map");
          
        Bottle &users = response.findGroup("look").findGroup("players");
        
        Bottle *player = users.get(1).asList();
        if (player!=0)
            {
                Bottle &location = player->findGroup("location");
                Value &life = player->find("life");
                ConstString playerName = player->get(0).asString();
       
                myX=location.get(1).asInt(),
                    myY=location.get(2).asInt(),
                    myLife=life.asInt();
            }
    }

    void rndMove()
    {
        Bottle cmd;
        Bottle response;
        cmd.addString("go");
        cmd.addString(randomDirection());

        port.write(cmd, response);
    }

    void setShooter(int sh)
    {
        shooterF=sh;
    }

    void rndShoot()
    {
        Bottle cmd;
        Bottle response;
        cmd.addString("fire");
        cmd.addString(randomDirection());

        port.write(cmd, response);
    }

    const char* randomDirection()
    {
        double rnd=Random::uniform();

        if (rnd<1/4.0)
            return RIGHT;
        if ( (rnd>=1/4.0) && (rnd<=2/4.0))
            return  LEFT;
        if ( (rnd>=2/4.0) && (rnd<=3/4.0))
            return  DOWN;
        if ( (rnd>=3/4.0) && (rnd<=1.0))
            return  UP;

        return DOWN;
    }

    void getWorld(Bottle &w)
    {
        mutex.wait();
        
        w=world;

        mutex.post();
    }

    int getLife()
    {
        int ret;
        mutex.wait();
        ret=myLife;
        mutex.post();

        return ret;
    }

    int getX()
    {
        int ret;
        mutex.wait();
        ret=myX;
        mutex.post();
        return ret;
    }

    int getY()
    {
        int ret;
        mutex.wait();
        ret=myY;
        mutex.post();
        return ret;
    }

    int myLife;
    int myX;
    int myY;
    int shooterF;
    char myName[255];

    Bottle world;
    Port port;


    double prev;
    double now;
    Semaphore mutex;
};

int main(int argc, char **argv)
{
    if (argc!=3)
        return 0;
  
    Network::init();

    MyPlayer *player = new MyPlayer(argv[1], PLAYER_RATE);
  
    if(atoi(argv[2])==0)
        player->setShooter(0);
    else
        player->setShooter(1);

    player->start();

    int count=0;
    while(true)
        {
            int plLife;
            int plX;
            int plY;
            count++;

            plLife=player->getLife();
            plX=player->getX();
            plY=player->getY();

            if ((count==500)||(plLife==0)) 
                {
                    fprintf(stderr, "Stopping player\n");
                    player->stop();
                    fprintf(stderr, "Waiting some time\n");
                    Time::delay(2);

                    printf("Restarting the player\n");
                    player->start();

                    count=0;
                }

            Bottle world;
            player->getWorld(world);

            int i;
            for (i=1; i<world.size(); i++) 
                {
                    printf("%s\n", world.get(i).asString().c_str());
                }

            printf("X:%d Y:%d Life:%d\n", plX, plY, plLife);

            Time::delay(0.5);
        }
     
    player->stop();

    delete player;

    Network::fini();

    return 0;
}

⌨️ 快捷键说明

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