diff options
| author | manuel <manuel@mausz.at> | 2011-04-17 21:50:32 +0200 |
|---|---|---|
| committer | manuel <manuel@mausz.at> | 2011-04-17 21:50:32 +0200 |
| commit | f5c00e32e6f32ca1216c72281b547faf372f0179 (patch) | |
| tree | bcaf8caacd662b4891591c0b04cf39d0d6a66c21 /pacman-c++/server.cpp | |
| parent | becd390b551f4ee705aa14a97c90eaa8596c824c (diff) | |
| download | foop-f5c00e32e6f32ca1216c72281b547faf372f0179.tar.gz foop-f5c00e32e6f32ca1216c72281b547faf372f0179.tar.bz2 foop-f5c00e32e6f32ca1216c72281b547faf372f0179.zip | |
funny ai implementation
Diffstat (limited to 'pacman-c++/server.cpp')
| -rw-r--r-- | pacman-c++/server.cpp | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/pacman-c++/server.cpp b/pacman-c++/server.cpp index 9baa9ab..516d1f7 100644 --- a/pacman-c++/server.cpp +++ b/pacman-c++/server.cpp | |||
| @@ -54,7 +54,8 @@ bool Server::run() | |||
| 54 | void Server::tick() | 54 | void Server::tick() |
| 55 | { | 55 | { |
| 56 | //qDebug() << "[Tick] Doing server update"; | 56 | //qDebug() << "[Tick] Doing server update"; |
| 57 | //TODO: add ai here | 57 | foreach(Color::Color color, m_bots) |
| 58 | aiCalculate(m_actors[color]); | ||
| 58 | Transmission::map_t map = calculateUpdates(); | 59 | Transmission::map_t map = calculateUpdates(); |
| 59 | updateMap(map); | 60 | updateMap(map); |
| 60 | 61 | ||
| @@ -89,27 +90,7 @@ invalid_direction: | |||
| 89 | qDebug() << "[Calc] Actor wants to move: color=" << i.key() | 90 | qDebug() << "[Calc] Actor wants to move: color=" << i.key() |
| 90 | << "pos=" << mapPosition << "direction=" << direction; | 91 | << "pos=" << mapPosition << "direction=" << direction; |
| 91 | 92 | ||
| 92 | QPoint newMapPosition = mapPosition; | 93 | QPoint newMapPosition = mapPosition + Actor::movementToPoint(direction); |
| 93 | switch (direction) | ||
| 94 | { | ||
| 95 | case Actor::Up: | ||
| 96 | newMapPosition += QPoint(0, -1); | ||
| 97 | break; | ||
| 98 | case Actor::Down: | ||
| 99 | newMapPosition += QPoint(0, 1); | ||
| 100 | break; | ||
| 101 | case Actor::Left: | ||
| 102 | newMapPosition += QPoint(-1, 0); | ||
| 103 | break; | ||
| 104 | case Actor::Right: | ||
| 105 | newMapPosition += QPoint(1, 0); | ||
| 106 | break; | ||
| 107 | case Actor::None: | ||
| 108 | break; | ||
| 109 | default: | ||
| 110 | Q_ASSERT(false); | ||
| 111 | } | ||
| 112 | |||
| 113 | if (newMapPosition.x() < 0) | 94 | if (newMapPosition.x() < 0) |
| 114 | newMapPosition.setX(0); | 95 | newMapPosition.setX(0); |
| 115 | if (newMapPosition.x() >= visualMap.size()) | 96 | if (newMapPosition.x() >= visualMap.size()) |
| @@ -308,7 +289,10 @@ bool Server::waitForClientConnections() | |||
| 308 | } | 289 | } |
| 309 | 290 | ||
| 310 | for (unsigned int i = (m_maxplayers - m_numbots); i < m_maxplayers; ++i) | 291 | for (unsigned int i = (m_maxplayers - m_numbots); i < m_maxplayers; ++i) |
| 292 | { | ||
| 311 | m_bots.append(Color::order[i]); | 293 | m_bots.append(Color::order[i]); |
| 294 | m_actorMovements[Color::order[i]] = Actor::None; | ||
| 295 | } | ||
| 312 | 296 | ||
| 313 | qDebug() << "[Server] All Clients connected"; | 297 | qDebug() << "[Server] All Clients connected"; |
| 314 | return true; | 298 | return true; |
| @@ -355,6 +339,41 @@ void Server::sendUpdate(Transmission::map_t map) | |||
| 355 | } | 339 | } |
| 356 | } | 340 | } |
| 357 | 341 | ||
| 342 | void Server::aiCalculate(Actor *actor) | ||
| 343 | { | ||
| 344 | /* move as long as possible in one direction */ | ||
| 345 | if (m_actorMovements[actor->color()] != Actor::None) | ||
| 346 | return; | ||
| 347 | |||
| 348 | QPoint actorpos = CoordToMapPosition(actor->pos().toPoint()); | ||
| 349 | QList<Actor::Movement> directions; | ||
| 350 | directions << Actor::Left << Actor::Right << Actor::Up << Actor::Down; | ||
| 351 | |||
| 352 | QMutableListIterator<Actor::Movement> i(directions); | ||
| 353 | while(i.hasNext()) | ||
| 354 | { | ||
| 355 | i.next(); | ||
| 356 | Actor::Movement direction = i.value(); | ||
| 357 | QPoint pos = actorpos + Actor::movementToPoint(direction); | ||
| 358 | if (pos.x() < 0 || pos.x() >= visualMap.size()) | ||
| 359 | continue; | ||
| 360 | if (pos.y() < 0 || pos.y() >= visualMap[pos.x()].size()) | ||
| 361 | continue; | ||
| 362 | GameEntity *item = visualMap[pos.x()][pos.y()]; | ||
| 363 | |||
| 364 | /* check if neighbour is a block */ | ||
| 365 | Block *block = qgraphicsitem_cast<Block *>(item); | ||
| 366 | if (block != NULL && block->color() != actor->color()) | ||
| 367 | { | ||
| 368 | i.remove(); | ||
| 369 | continue; | ||
| 370 | } | ||
| 371 | } | ||
| 372 | |||
| 373 | int rand = (int) (directions.size() * (qrand() / (RAND_MAX + 1.0))); | ||
| 374 | m_actorMovements[actor->color()] = directions.at(rand); | ||
| 375 | } | ||
| 376 | |||
| 358 | void Server::keyPressUpdate() | 377 | void Server::keyPressUpdate() |
| 359 | { | 378 | { |
| 360 | ProtoBuf::KeyPressUpdate packet; | 379 | ProtoBuf::KeyPressUpdate packet; |
