/bike.h |
---|
11,6 → 11,7 |
#include <cmath> |
#include <time.h> |
#include <stdio.h> |
#include <pthread.h> |
using namespace std; |
23,7 → 24,7 |
void draw(QPainter *painter,QList<Bike *> bikes); |
void run(); |
bool hasCollided(QList<Bike *> bikes); |
void setText(QString text); |
void setText(QString text); |
void reset(); |
bool isReady; |
bool dead; |
41,17 → 42,18 |
QColor colour; |
bool collided; |
float abpool; |
float velocity; |
float speed; |
float velocity; |
float speed; |
private: |
QTcpSocket *socket; |
bool haveSentAlready; |
private slots: |
void readyRead(); |
void disconnected(); |
void readyRead(); |
signals: |
void chat(QString name, QString message); |
void chat(QString name, QString message); |
}; |
#endif // BIKE_H |
/mainwindow.h |
---|
28,16 → 28,14 |
QList<Bike *> bikes; |
QTimer *timer; |
int id; |
QTimer *suddenDeathTimer; |
QTimer *timer2; |
bool suddenDeath; |
QTimer *suddenDeathTimer; |
bool suddenDeath; |
private slots: |
private slots: |
void newConnection(); |
void checkClients(); |
void chat(QString name, QString message); |
void activateSuddenDeath(); |
void clientTimeOut(); |
void chat(QString name, QString message); |
void activateSuddenDeath(); |
}; |
#endif // MAINWINDOW_H |
/main.cpp |
---|
7,4 → 7,5 |
MainWindow w; |
w.show(); |
return a.exec(); |
pthread_exit(NULL); |
} |
/bike.cpp |
---|
23,7 → 23,7 |
hadGo = false; |
dead = false; |
collided = false; |
speed = 5; |
speed = 5; |
colour.setBlue(0); |
colour.setRed(0); |
105,43 → 105,38 |
void Bike::run() |
{ |
if(!haveSentAlready){ |
for (int i = 0; i < bikes.count(); i++) |
for (int i = 0; i < bikes.count(); i++) |
{ |
Bike *bike = bikes[i]; |
if (bike->isReady && bike->show) |
{ |
Bike *bike = bikes[i]; |
if (bike->isReady && bike->show) |
if (bike->collided) |
{ |
if (bike->collided) |
{ |
socket->write("DEAD "); |
socket->write(bike->name.toAscii()); |
socket->write("\n"); |
} |
else |
{ |
socket->write("BIKE "); |
socket->write(bike->name.toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->x).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->y).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->colour.red()).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->colour.green()).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->colour.blue()).toAscii()); |
socket->write("\n"); |
} |
socket->write("DEAD "); |
socket->write(bike->name.toAscii()); |
socket->write("\n"); |
} |
else |
{ |
socket->write("BIKE "); |
socket->write(bike->name.toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->x).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->y).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->colour.red()).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->colour.green()).toAscii()); |
socket->write(" "); |
socket->write(QString::number(bike->colour.blue()).toAscii()); |
socket->write("\n"); |
} |
} |
linePoints.append(QPoint(x, y)); |
} |
linePoints.append(QPoint(x, y)); |
if (dead) |
{ |
show = false; |
152,18 → 147,14 |
if (!dead) |
{ |
if(!haveSentAlready){ |
socket->write("G\n"); |
socket->flush(); |
} |
socket->write("G\n"); |
socket->flush(); |
hadGo = false; |
if (!socket->waitForReadyRead(1)) |
if (!socket->waitForReadyRead(10000)) |
{ |
// socket->disconnectFromHost(); |
// dead = true; |
haveSentAlready = true; |
return; |
socket->disconnectFromHost(); |
dead = true; |
} |
if (!hadGo) |
{ |
175,6 → 166,7 |
time_t result = time(NULL); |
cout << result << ": Recieved next move from " << name.toStdString().c_str() << endl; |
pthread_exit(NULL); |
} |
int sign(int x){ |
263,13 → 255,12 |
void Bike::setText(QString text) |
{ |
socket->write(text.toAscii().data()); |
socket->flush(); |
socket->write(text.toAscii().data()); |
socket->flush(); |
} |
void Bike::reset() |
{ |
cout << "Reset was called\n"; |
x = rand() % 800; |
y = rand() % 600; |
linePoints.clear(); |
284,7 → 275,7 |
hadGo = false; |
dead = false; |
collided = false; |
speed = 5; |
speed = 5; |
socket->write("RESET\n"); |
} |
308,12 → 299,12 |
{ |
angle += 360; |
} |
if(velocity < speed) |
if(velocity < speed) |
velocity += 0.3; |
else if(velocity > speed) |
else if(velocity > speed) |
velocity -= 0.3; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abpool<10) |
abpool += 0.2; |
hadGo = true; |
330,12 → 321,12 |
{ |
angle += 360; |
} |
if(velocity < speed) |
if(velocity < speed) |
velocity += 0.3; |
else if(velocity > speed) |
else if(velocity > speed) |
velocity -= 0.3; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abpool<10) |
abpool += 0.2; |
hadGo = true; |
344,14 → 335,14 |
{ |
if(abpool > 0){ |
velocity += 0.1; |
abpool -= 0.5; |
abpool -= 0.5; |
} else { |
if(velocity < speed) |
if(velocity < speed) |
velocity += 0.3; |
else if(velocity > speed) |
else if(velocity > speed) |
velocity -= 0.3; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
} |
hadGo = true; |
} |
362,12 → 353,12 |
abpool -= 0.5; |
} |
else { |
if(velocity < speed) |
if(velocity < speed) |
velocity += 0.3; |
else if(velocity > speed) |
else if(velocity > speed) |
velocity -= 0.3; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
} |
hadGo = true; |
} |
374,12 → 365,12 |
else if (line == "N") |
{ |
if(velocity < speed) |
if(velocity < speed) |
velocity += 0.3; |
else if(velocity > speed) |
else if(velocity > speed) |
velocity -= 0.3; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abs(speed-velocity)<0.3) |
velocity = speed; |
if(abpool<10) |
abpool += 0.2; |
hadGo = true; |
406,17 → 397,17 |
colour.setBlue(list[3].toInt()); |
} |
} |
else if (line.startsWith("CHAT ")) |
{ |
QString message = line.remove(0, 5); |
else if (line.startsWith("CHAT ")) |
{ |
QString message = line.remove(0, 5); |
if (!message.isEmpty()) |
{ |
emit chat(name, message); |
} |
if (!message.isEmpty()) |
{ |
emit chat(name, message); |
} |
hadGo = true; |
} |
hadGo = true; |
} |
} |
} |
/mainwindow.cpp |
---|
12,36 → 12,14 |
connect(timer, SIGNAL(timeout()), this, SLOT(update())); |
timer->start(50); |
timer2 = new QTimer(this); |
connect(timer2, SIGNAL(timeout()),this,SLOT(clientTimeOut())); |
timer2->setSingleShot(true); |
suddenDeath = false; |
suddenDeathTimer = new QTimer(this); |
connect(suddenDeathTimer, SIGNAL(timeout()), this, SLOT(activateSuddenDeath())); |
suddenDeathTimer->start(300000); |
suddenDeath = false; |
suddenDeathTimer = new QTimer(this); |
connect(suddenDeathTimer, SIGNAL(timeout()), this, SLOT(activateSuddenDeath())); |
suddenDeathTimer->start(300000); |
id = 0; |
} |
void MainWindow::clientTimeOut() |
{ |
cout << "Timeout function called\n"; |
Bike *bike; |
foreach(bike,bikes) |
{ |
if(!bike->hasHadGo) |
{ |
bike->socket->disconnectFromHost(); |
bike->dead = true; |
bike->hasHadGo = true; |
} |
} |
} |
MainWindow::~MainWindow() |
{ |
delete server; |
49,9 → 27,9 |
void MainWindow::reset() |
{ |
suddenDeathTimer->stop(); |
suddenDeathTimer->start(300000); |
suddenDeath = false; |
suddenDeathTimer->stop(); |
suddenDeathTimer->start(300000); |
suddenDeath = false; |
for (int i = 0; i < bikes.count(); i++) |
{ |
59,15 → 37,21 |
} |
} |
void *runtherun(void *bike){ |
Bike *realbike = (Bike *)bike; |
realbike->run(); |
pthread_exit(NULL); |
} |
void MainWindow::paintEvent(QPaintEvent *e) |
{ |
if (suddenDeath) |
{ |
for (int i = 0; i < bikes.count(); i++) |
{ |
bikes[i]->speed *= 1.01; |
} |
} |
if (suddenDeath) |
{ |
for (int i = 0; i < bikes.count(); i++) |
{ |
bikes[i]->speed *= 1.01; |
} |
} |
e->accept(); |
QPainter painter(this); |
81,39 → 65,35 |
{ |
ready = false; |
} |
bikes[i]->hasHadGo = false; |
bikes[i]->haveSentAlready = false; |
} |
if (ready) |
{ |
// cout << ":: Sent move request..." << endl; |
bool alldone = false; |
timer2->start(10000); |
while(!alldone){ |
for (int i = 0; i < bikes.count(); i++) |
cout << ":: Sent move request..." << endl; |
pthread_t threads[bikes.count()]; |
for (int i = 0; i < bikes.count(); i++) |
{ |
if (bikes[i]->show) |
{ |
if (bikes[i]->show && !bikes[i]->hasHadGo) |
{ |
bikes[i]->bikes = bikes; |
bikes[i]->run(); |
} |
bikes[i]->hasHadGo = false; |
bikes[i]->bikes = bikes; |
pthread_create(&threads[i],NULL,runtherun,(void *)bikes[i]); |
} |
alldone = true; |
for (int i = 0; i < bikes.count(); i++){ |
if(bikes[i]->show && !bikes[i]->hasHadGo){ |
alldone = false; |
} |
} |
Bike *bike; |
foreach(bike,bikes) |
{ |
while(!bike->hasHadGo) |
{ |
} |
} |
timer2->stop(); |
} |
for (int i = 0; i < bikes.count(); i++) |
{ |
if (bikes[i]->show) |
for (int i = 0; i < bikes.count(); i++) |
{ |
bikes[i]->draw(&painter,bikes); |
if (bikes[i]->show) |
{ |
bikes[i]->draw(&painter,bikes); |
} |
} |
} |
126,9 → 106,8 |
{ |
QTcpSocket *socket = server->nextPendingConnection(); |
Bike *bike = new Bike(socket, id); |
connect(bike, SIGNAL(chat(QString,QString)), this, SLOT(chat(QString,QString))); |
connect(bike, SIGNAL(chat(QString,QString)), this, SLOT(chat(QString,QString))); |
id += 1; |
cout << "Resetting from here\n"; |
reset(); |
bikes.append(bike); |
138,60 → 117,59 |
void MainWindow::checkClients() |
{ |
bool everyoneDied = true; |
bool everyoneDied = true; |
for (int i = bikes.count() - 1; i >= 0; i--) |
{ |
if (bikes[i]->isDisconnected) |
{ |
for (int j = 0; j < bikes.count(); j++) |
{ |
bikes[j]->setText(QString("DISCO ") + bikes[i]->name + QString("\n")); |
} |
for (int j = 0; j < bikes.count(); j++) |
{ |
bikes[j]->setText(QString("DISCO ") + bikes[i]->name + QString("\n")); |
} |
delete bikes[i]; |
bikes.removeAt(i); |
cout << ":: Removed Bike: " << i << endl; |
} |
else |
{ |
if (!bikes[i]->collided) |
{ |
everyoneDied = false; |
} |
// else if (bikes[i]->dead) |
// { |
// everyoneDied = false; |
// } |
} |
else |
{ |
if (!bikes[i]->collided) |
{ |
everyoneDied = false; |
} |
else if (bikes[i]->dead) |
{ |
everyoneDied = false; |
} |
} |
} |
if (everyoneDied) |
{ |
cout << "resetting from other place\n"; |
reset(); |
} |
if (everyoneDied) |
{ |
reset(); |
} |
} |
void MainWindow::chat(QString name, QString message) |
{ |
QString packet = "CHAT "; |
packet.append(name); |
packet.append(" "); |
packet.append(message); |
packet.append("\n"); |
QString packet = "CHAT "; |
packet.append(name); |
packet.append(" "); |
packet.append(message); |
packet.append("\n"); |
for (int i = 0; i < bikes.count(); i++) |
{ |
bikes[i]->setText(packet); |
} |
for (int i = 0; i < bikes.count(); i++) |
{ |
bikes[i]->setText(packet); |
} |
} |
void MainWindow::activateSuddenDeath() |
{ |
if (!suddenDeath) |
{ |
suddenDeath = true; |
chat("Server", "SUDDEN DEATH ACTIVATED!"); |
} |
if (!suddenDeath) |
{ |
suddenDeath = true; |
chat("Server", "SUDDEN DEATH ACTIVATED!"); |
} |
} |