Subversion Repositories QTron

Compare Revisions

Ignore whitespace Rev 36 → Rev 35

/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!");
}
}