Subversion Repositories QTron

Compare Revisions

Ignore whitespace Rev 35 → Rev 36

/bike.h
11,7 → 11,6
#include <cmath>
#include <time.h>
#include <stdio.h>
#include <pthread.h>
 
using namespace std;
 
24,7 → 23,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;
42,18 → 41,17
QColor colour;
bool collided;
float abpool;
float velocity;
float speed;
 
private:
float velocity;
float speed;
QTcpSocket *socket;
bool haveSentAlready;
 
private slots:
void disconnected();
void readyRead();
void disconnected();
 
signals:
void chat(QString name, QString message);
void chat(QString name, QString message);
};
 
#endif // BIKE_H
/mainwindow.h
28,14 → 28,16
QList<Bike *> bikes;
QTimer *timer;
int id;
QTimer *suddenDeathTimer;
bool suddenDeath;
QTimer *suddenDeathTimer;
QTimer *timer2;
bool suddenDeath;
 
private slots:
private slots:
void newConnection();
void checkClients();
void chat(QString name, QString message);
void activateSuddenDeath();
void chat(QString name, QString message);
void activateSuddenDeath();
void clientTimeOut();
};
 
#endif // MAINWINDOW_H
/main.cpp
7,5 → 7,4
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,38 → 105,43
 
void Bike::run()
{
for (int i = 0; i < bikes.count(); i++)
{
Bike *bike = bikes[i];
if (bike->isReady && bike->show)
if(!haveSentAlready){
for (int i = 0; i < bikes.count(); i++)
{
if (bike->collided)
 
 
Bike *bike = bikes[i];
if (bike->isReady && bike->show)
{
socket->write("DEAD ");
socket->write(bike->name.toAscii());
socket->write("\n");
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");
}
}
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;
147,14 → 152,18
 
if (!dead)
{
socket->write("G\n");
socket->flush();
if(!haveSentAlready){
socket->write("G\n");
socket->flush();
}
 
hadGo = false;
if (!socket->waitForReadyRead(10000))
if (!socket->waitForReadyRead(1))
{
socket->disconnectFromHost();
dead = true;
// socket->disconnectFromHost();
// dead = true;
haveSentAlready = true;
return;
}
if (!hadGo)
{
166,7 → 175,6
 
time_t result = time(NULL);
cout << result << ": Recieved next move from " << name.toStdString().c_str() << endl;
pthread_exit(NULL);
}
 
int sign(int x){
255,12 → 263,13
 
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();
275,7 → 284,7
hadGo = false;
dead = false;
collided = false;
speed = 5;
speed = 5;
 
socket->write("RESET\n");
}
299,12 → 308,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;
321,12 → 330,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;
335,14 → 344,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;
}
353,12 → 362,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;
}
365,12 → 374,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;
397,17 → 406,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,14 → 12,36
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(50);
 
suddenDeath = false;
suddenDeathTimer = new QTimer(this);
connect(suddenDeathTimer, SIGNAL(timeout()), this, SLOT(activateSuddenDeath()));
suddenDeathTimer->start(300000);
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);
 
 
 
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;
27,9 → 49,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++)
{
37,21 → 59,15
}
}
 
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);
65,35 → 81,39
{
ready = false;
}
bikes[i]->hasHadGo = false;
bikes[i]->haveSentAlready = false;
}
 
if (ready)
{
cout << ":: Sent move request..." << endl;
pthread_t threads[bikes.count()];
for (int i = 0; i < bikes.count(); i++)
{
if (bikes[i]->show)
// cout << ":: Sent move request..." << endl;
bool alldone = false;
timer2->start(10000);
while(!alldone){
for (int i = 0; i < bikes.count(); i++)
{
bikes[i]->hasHadGo = false;
bikes[i]->bikes = bikes;
pthread_create(&threads[i],NULL,runtherun,(void *)bikes[i]);
if (bikes[i]->show && !bikes[i]->hasHadGo)
{
bikes[i]->bikes = bikes;
bikes[i]->run();
}
}
}
Bike *bike;
foreach(bike,bikes)
{
while(!bike->hasHadGo)
{
alldone = true;
for (int i = 0; i < bikes.count(); i++){
if(bikes[i]->show && !bikes[i]->hasHadGo){
alldone = false;
}
}
}
timer2->stop();
}
 
for (int i = 0; i < bikes.count(); i++)
for (int i = 0; i < bikes.count(); i++)
{
if (bikes[i]->show)
{
if (bikes[i]->show)
{
bikes[i]->draw(&painter,bikes);
}
bikes[i]->draw(&painter,bikes);
}
}
 
106,8 → 126,9
{
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);
117,59 → 138,60
 
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)
{
reset();
}
if (everyoneDied)
{
cout << "resetting from other place\n";
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!");
}
}