summaryrefslogtreecommitdiffstats
path: root/kbattleship/kbattleship/kshiplist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kbattleship/kbattleship/kshiplist.cpp')
-rw-r--r--kbattleship/kbattleship/kshiplist.cpp175
1 files changed, 175 insertions, 0 deletions
diff --git a/kbattleship/kbattleship/kshiplist.cpp b/kbattleship/kbattleship/kshiplist.cpp
new file mode 100644
index 00000000..8a17ad37
--- /dev/null
+++ b/kbattleship/kbattleship/kshiplist.cpp
@@ -0,0 +1,175 @@
+/***************************************************************************
+ kshiplist.cpp
+ -------------------
+ Developers: (c) 2000-2001 Nikolas Zimmermann <wildfox@kde.org>
+ (c) 2000-2001 Daniel Molkentin <molkentin@kde.org>
+ (c) 2001 Kevin Krammer <kevin.krammer@gmx.at>
+
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "kshiplist.moc"
+#include <kdebug.h>
+
+KShipList::KShipList() : QObject()
+{
+ m_shiplist.setAutoDelete(true);
+ m_shipsadded = 4;
+
+ m_fieldx = 10;
+ m_fieldy = 10;
+}
+
+void KShipList::clear()
+{
+ m_shipsadded = 4;
+ m_shiplist.clear();
+}
+
+int KShipList::shipTypeAt(int x, int y)
+{
+ int tempx, tempy;
+ KShip *shipiterator;
+ for(shipiterator = m_shiplist.first(); shipiterator != 0; shipiterator = m_shiplist.next())
+ {
+ if(shipiterator->shipystart() != shipiterator->shipystop())
+ {
+ for(tempy = shipiterator->shipystart(); tempy <= shipiterator->shipystop(); tempy++)
+ {
+ if(tempy == y)
+ {
+ if(shipiterator->shipxstart() != shipiterator->shipxstop())
+ {
+ for(tempx = shipiterator->shipxstart(); tempx <= shipiterator->shipxstop(); tempx++)
+ {
+ if(tempx == x)
+ return shipiterator->shiptype();
+ }
+ }
+ else
+ {
+ tempx = shipiterator->shipxstart();
+ if(tempx == x)
+ return shipiterator->shiptype();
+ }
+ }
+ }
+ }
+ else
+ {
+ tempy = shipiterator->shipystart();
+ if(tempy == y)
+ {
+ if(shipiterator->shipxstart() != shipiterator->shipxstop())
+ {
+ for(tempx = shipiterator->shipxstart(); tempx <= shipiterator->shipxstop(); tempx++)
+ {
+ if(tempx == x)
+ return shipiterator->shiptype();
+ }
+ }
+ else
+ {
+ tempx = shipiterator->shipxstart();
+ if(tempx == x)
+ return shipiterator->shiptype();
+ }
+ }
+ }
+ }
+ return 99;
+}
+
+KShip *KShipList::shipAt(int x, int y)
+{
+ int tempx, tempy;
+ KShip *shipiterator;
+ for(shipiterator = m_shiplist.first(); shipiterator != 0; shipiterator = m_shiplist.next())
+ {
+ for(tempy = shipiterator->shipystart(); tempy <= shipiterator->shipystop(); tempy++)
+ {
+ if(tempy == y)
+ {
+ for(tempx = shipiterator->shipxstart(); tempx <= shipiterator->shipxstop(); tempx++)
+ {
+ if(tempx == x)
+ return shipiterator;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+bool KShipList::canAddShips()
+{
+ if(m_shipsadded >= 1)
+ return true;
+ return false;
+}
+
+void KShipList::addNewShip(int button, int fieldx, int fieldy)
+{
+ if(!addNewShip(!(button == LeftButton), fieldx, fieldy))
+ KMessageBox::information(0L, i18n("You cannot place the ship here."));
+}
+
+bool KShipList::addNewShip(bool vertical, int fieldx, int fieldy)
+{
+ QRect ship = vertical ? QRect(fieldx, fieldy, 1, m_shipsadded) : QRect(fieldx, fieldy, m_shipsadded, 1);
+ QRect field = QRect(0, 0, m_fieldx, m_fieldy);
+ if(!field.contains(ship))
+ return false;
+
+ for(KShip *placedShip = m_shiplist.first(); placedShip != 0; placedShip = m_shiplist.next())
+ {
+ for(int i = fieldx-1; i < (fieldx + ship.width()+1); i++)
+ {
+ if(placedShip->contains(i, fieldy - 1) || placedShip->contains(i, fieldy + ship.height()))
+ return false;
+ }
+
+ for(int i = fieldy-1; i < (fieldy + ship.height()+1); i++)
+ {
+ if(placedShip->contains(fieldx - 1, i) || placedShip->contains(fieldx + ship.width(), i))
+ return false;
+ }
+ }
+
+ m_shipsadded--;
+
+ if(!vertical)
+ m_shiplist.append(new KShip(fieldx, fieldx + shipCount(), fieldy, fieldy, shipCount(), true));
+ else
+ m_shiplist.append(new KShip(fieldx, fieldx, fieldy, fieldy + shipCount(), shipCount(), false));
+
+ for(int i = 0; i < shipCount() + 1; i++)
+ {
+ int start = 0;
+ if(shipCount() == 3)
+ start = KBattleField::SHIP4P1;
+ else if(shipCount() == 2)
+ start = KBattleField::SHIP3P1;
+ else if(shipCount() == 1)
+ start = KBattleField::SHIP2P1;
+ else if(shipCount() == 0)
+ start = KBattleField::SHIP1P1;
+
+ if(!vertical)
+ emit sigOwnFieldDataChanged(fieldx + i, fieldy, start + i);
+ else
+ emit sigOwnFieldDataChanged(fieldx, fieldy + i, start + i);
+ }
+
+ if(m_shipsadded == 0)
+ emit sigLastShipAdded();
+ return true;
+}