Added all figures so you can see what kind it was promoted from
[Shogi.git] / mainwindow.cpp
blobd4e6702df7b88efdbd79491d46cd7ddd77b0eac1
1 #include <QtGui>
2 #include "pjas.h"
3 #include <cmath>
4 #include <cstdlib>
5 #include "mainwindow.h"
7 // -1 om x <0 1 om x>0 och 0 annars
8 int sgn(int x)
10 if (x>0)
11 return 1;
12 else if (x<0)
13 return -1;
14 else
15 return 0;
18 int min(int a,int b)
20 if (a>b)
21 return b;
22 else
23 return a;
26 int max(int a,int b)
28 if (a>b)
29 return a;
30 else
31 return b;
34 MainWindow::MainWindow(QWidget *parent)
35 : QMainWindow(parent, 0)
37 datasize=0;
39 connect(this,SIGNAL(nextPlayerSIG()),this,SLOT(nextPlayer()));
40 current = -1;
41 ui.setupUi(this);
42 int i;
43 // skapa pjäser
44 pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0));
45 pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0));
46 pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0));
47 pjaser.push_back(Pjas(1)); pjaser.push_back(Pjas(1)); pjaser.push_back(Pjas(2));
48 pjaser.push_back(Pjas(2)); pjaser.push_back(Pjas(3)); pjaser.push_back(Pjas(4));
49 pjaser.push_back(Pjas(5)); pjaser.push_back(Pjas(5)); pjaser.push_back(Pjas(6));
50 pjaser.push_back(Pjas(6)); pjaser.push_back(Pjas(7));
52 pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0));
53 pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0));
54 pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0)); pjaser.push_back(Pjas(0));
55 pjaser.push_back(Pjas(1)); pjaser.push_back(Pjas(1)); pjaser.push_back(Pjas(2));
56 pjaser.push_back(Pjas(2)); pjaser.push_back(Pjas(3)); pjaser.push_back(Pjas(4));
57 pjaser.push_back(Pjas(5)); pjaser.push_back(Pjas(5)); pjaser.push_back(Pjas(6));
58 pjaser.push_back(Pjas(6)); pjaser.push_back(Pjas(7));
59 for (i=20; i<40;i++)
60 pjaser[i].owner=1;
61 for (i=0;i<300;i++)
62 plan[i] = -1;
64 background = QBrush(Qt::green);
65 black = QBrush(Qt::black);
66 blackp = QPen(Qt::black);
67 redp = QPen(Qt::red);
68 redp.setWidth(3);
69 sX=100;
70 sY=100; // 1 börjar där uppe... -1 där nere
71 pjaser[ 0].xpos=0; pjaser[ 0].ypos=6; pjaser[ 0].owner=-1;
72 pjaser[ 1].xpos=1; pjaser[ 1].ypos=6; pjaser[ 1].owner=-1;
73 pjaser[ 2].xpos=2; pjaser[ 2].ypos=6; pjaser[ 2].owner=-1;
74 pjaser[ 3].xpos=3; pjaser[ 3].ypos=6; pjaser[ 3].owner=-1;
75 pjaser[ 4].xpos=4; pjaser[ 4].ypos=6; pjaser[ 4].owner=-1;
76 pjaser[ 5].xpos=5; pjaser[ 5].ypos=6; pjaser[ 5].owner=-1;
77 pjaser[ 6].xpos=6; pjaser[ 6].ypos=6; pjaser[ 6].owner=-1;
78 pjaser[ 7].xpos=7; pjaser[ 7].ypos=6; pjaser[ 7].owner=-1;
79 pjaser[ 8].xpos=8; pjaser[ 8].ypos=6; pjaser[ 8].owner=-1;
80 pjaser[ 9].xpos=0; pjaser[ 9].ypos=8; pjaser[ 9].owner=-1;
81 pjaser[10].xpos=8; pjaser[10].ypos=8; pjaser[10].owner=-1;
82 pjaser[11].xpos=1; pjaser[11].ypos=8; pjaser[11].owner=-1;
83 pjaser[12].xpos=7; pjaser[12].ypos=8; pjaser[12].owner=-1;
84 pjaser[13].xpos=1; pjaser[13].ypos=7; pjaser[13].owner=-1;
85 pjaser[14].xpos=7; pjaser[14].ypos=7; pjaser[14].owner=-1;
86 pjaser[15].xpos=2; pjaser[15].ypos=8; pjaser[15].owner=-1;
87 pjaser[16].xpos=6; pjaser[16].ypos=8; pjaser[16].owner=-1;
88 pjaser[17].xpos=3; pjaser[17].ypos=8; pjaser[17].owner=-1;
89 pjaser[18].xpos=5; pjaser[18].ypos=8; pjaser[18].owner=-1;
90 pjaser[19].xpos=4; pjaser[19].ypos=8; pjaser[19].owner=-1;
92 pjaser[20].xpos=0; pjaser[20].ypos=2; pjaser[20].owner=1;
93 pjaser[21].xpos=1; pjaser[21].ypos=2; pjaser[21].owner=1;
94 pjaser[22].xpos=2; pjaser[22].ypos=2; pjaser[22].owner=1;
95 pjaser[23].xpos=3; pjaser[23].ypos=2; pjaser[23].owner=1;
96 pjaser[24].xpos=4; pjaser[24].ypos=2; pjaser[24].owner=1;
97 pjaser[25].xpos=5; pjaser[25].ypos=2; pjaser[25].owner=1;
98 pjaser[26].xpos=6; pjaser[26].ypos=2; pjaser[26].owner=1;
99 pjaser[27].xpos=7; pjaser[27].ypos=2; pjaser[27].owner=1;
100 pjaser[28].xpos=8; pjaser[28].ypos=2; pjaser[28].owner=1;
101 pjaser[29].xpos=0; pjaser[29].ypos=0; pjaser[29].owner=1;
102 pjaser[30].xpos=8; pjaser[30].ypos=0; pjaser[30].owner=1;
103 pjaser[31].xpos=1; pjaser[31].ypos=0; pjaser[31].owner=1;
104 pjaser[32].xpos=7; pjaser[32].ypos=0; pjaser[32].owner=1;
105 pjaser[33].xpos=7; pjaser[33].ypos=1; pjaser[33].owner=1;
106 pjaser[34].xpos=1; pjaser[34].ypos=1; pjaser[34].owner=1;
107 pjaser[35].xpos=2; pjaser[35].ypos=0; pjaser[35].owner=1;
108 pjaser[36].xpos=6; pjaser[36].ypos=0; pjaser[36].owner=1;
109 pjaser[37].xpos=3; pjaser[37].ypos=0; pjaser[37].owner=1;
110 pjaser[38].xpos=5; pjaser[38].ypos=0; pjaser[38].owner=1;
111 pjaser[39].xpos=4; pjaser[39].ypos=0; pjaser[39].owner=1;
112 for (i=0;i<40;i++)
113 plan[pjaser[i].xpos*9+pjaser[i].ypos]=i;
115 // Load pictures, även de upp-och-ner-vända
116 bilder.push_back(QImage("bonde.png"));
117 bilder.push_back(QImage("lans.png"));
118 bilder.push_back(QImage("hast.png"));
119 bilder.push_back(QImage("lopare.png"));
120 bilder.push_back(QImage("torn.png"));
121 bilder.push_back(QImage("silver.png"));
122 bilder.push_back(QImage("guld.png"));
123 bilder.push_back(QImage("kung.png"));
124 bilder.push_back(QImage("bondeP.png"));
125 bilder.push_back(QImage("lansP.png"));
126 bilder.push_back(QImage("hastP.png"));
127 bilder.push_back(QImage("lopareP.png"));
128 bilder.push_back(QImage("tornP.png"));
129 bilder.push_back(QImage("silverP.png"));
131 bilder.push_back(QImage("Ubonde.png"));
132 bilder.push_back(QImage("Ulans.png"));
133 bilder.push_back(QImage("Uhast.png"));
134 bilder.push_back(QImage("Ulopare.png"));
135 bilder.push_back(QImage("Utorn.png"));
136 bilder.push_back(QImage("Usilver.png"));
137 bilder.push_back(QImage("Uguld.png"));
138 bilder.push_back(QImage("Ukung.png"));
139 bilder.push_back(QImage("UbondeP.png"));
140 bilder.push_back(QImage("UlansP.png"));
141 bilder.push_back(QImage("UhastP.png"));
142 bilder.push_back(QImage("UlopareP.png"));
143 bilder.push_back(QImage("UtornP.png"));
144 bilder.push_back(QImage("UsilverP.png"));
147 /* typer
148 0 = bonde
149 1 = lans
150 2 = springare
151 3 = löpare
152 4 = torn
153 5 = silver
154 6 = guld
155 7 = kung
156 8 = prmotoed bonde
157 9 = prmotoed lans
158 10 = prmotoed springare
159 11 = prmotoed löpare
160 12 = prmotoed torn
161 13 = promoted silver
164 connect(this,SIGNAL(showPlayerTurnSIG()),this,SLOT(showPlayerTurn()));
167 QString str;
168 serverPort = 31416;
170 if (QMessageBox::Yes == QMessageBox::question(this,"Är du server?","Skall du vara server eller ej?",QMessageBox::Yes |QMessageBox::No))
172 server = new QTcpServer(this);
173 QList<QHostAddress> ipnr = QNetworkInterface::allAddresses();
174 for (i=0;i<ipnr.size();i++)
176 if (ipnr[i] != QHostAddress::LocalHost)
177 serverIP = ipnr[i];
179 str = QInputDialog::getText(this,"Är detta ditt IP?","Är detta ditt IP nummer?",QLineEdit::Normal,serverIP.toString());
180 server->listen(serverIP,serverPort);
181 connect(server,SIGNAL(newConnection()),this,SLOT(newPlayerConnected()));
182 isServer=true;
184 else
186 str = QInputDialog::getText(this,"Ange IP till din motståndares dator","Ange IP till din motståndares dator");
187 serverIP = QHostAddress(str);
188 socket = new QTcpSocket(this);
189 socket->connectToHost(serverIP,serverPort);
190 connect(socket,SIGNAL(connected ()),this,SLOT(ConnectedToServer()));
191 isServer = false;
192 connect(socket, SIGNAL(readyRead()), this, SLOT(readMove()));
197 setStarter();
198 showPlayerTurn();
199 reloadPictures();
201 void MainWindow::ConnectedToServer()
203 qDebug()<<"Connectade till server";
206 void MainWindow::newPlayerConnected()
208 qDebug()<<"någon connnectade till mig. Ah! Det är min gamla nemesis.";
209 client = server->nextPendingConnection();
210 connect(client, SIGNAL(readyRead()), this, SLOT(readMove()));
213 void MainWindow::showPlayerTurn()
215 if (current==1)
216 ui.vemstur->setText("EJ din tur");
217 else
218 ui.vemstur->setText("Din tur");
221 void MainWindow::reloadPictures()
223 bilder.clear();
224 bilder.push_back(QImage("bonde.png"));
225 bilder.push_back(QImage("lans.png"));
226 bilder.push_back(QImage("hast.png"));
227 bilder.push_back(QImage("lopare.png"));
228 bilder.push_back(QImage("torn.png"));
229 bilder.push_back(QImage("silver.png"));
230 bilder.push_back(QImage("guld.png"));
231 bilder.push_back(QImage("kung.png"));
232 bilder.push_back(QImage("bondeP.png"));
233 bilder.push_back(QImage("lopareP.png"));
234 bilder.push_back(QImage("tornP.png"));
236 bilder.push_back(QImage("Ubonde.png"));
237 bilder.push_back(QImage("Ulans.png"));
238 bilder.push_back(QImage("Uhast.png"));
239 bilder.push_back(QImage("Ulopare.png"));
240 bilder.push_back(QImage("Utorn.png"));
241 bilder.push_back(QImage("Usilver.png"));
242 bilder.push_back(QImage("Uguld.png"));
243 bilder.push_back(QImage("Ukung.png"));
244 bilder.push_back(QImage("UbondeP.png"));
245 bilder.push_back(QImage("UlopareP.png"));
246 bilder.push_back(QImage("UtornP.png"));
247 for (int i=0; i<bilder.size();i++)
249 bilder[i] = bilder[i].scaled(sX,sY);
253 void MainWindow::paintEvent(QPaintEvent * parent)
255 qDebug()<<"Börja rita...";
256 QPainter p(this);
257 p.fillRect(0,0,sX*9,sY*9,background);
258 int x,y,i;
261 for (i=0;i<40;i++)
263 if (pjaser[i].outside)
264 { // rita utanför
265 p.drawImage(pjaser[i].xpos*sX, pjaser[i].ypos*sY,bilder[pjaser[i].picture()]);
267 else
268 { // rita på planen
269 p.drawImage(pjaser[i].xpos*sX, pjaser[i].ypos*sY,bilder[pjaser[i].picture()]);
272 p.setPen(blackp);
273 for (x=0;x<=9;x++)
274 for (y=0;y<=9;y++)
276 p.drawLine(x*sX,0,x*sX,y*sY);
277 p.drawLine(0,y*sY,x*sX,y*sY);
279 if (clX != -1 && clY != -1)
281 p.setPen(redp);
282 p.drawRect(clX*sX,clY*sY,sX,sY);
285 p.setPen(redp);
286 int kung;
287 if (schackadspelare == -1)
289 kung = 19;
291 else
293 kung = 39;
295 for (i=0;i<schackare.size();i++)
297 x=pjaser[schackare[i]].xpos;
298 y=pjaser[schackare[i]].ypos;
299 p.setPen(redp);
300 qDebug()<<"rita schack : "<<x<<y;
301 p.drawLine(x*sX+sX/2,y*sY+sY/2,pjaser[kung].xpos*sX+sX/2,pjaser[kung].ypos*sY+sY/2);
303 qDebug()<<".....sluta rita";
306 void MainWindow::gameOver()
308 if (winner ==-1)
309 QMessageBox::information(this,"Spelet slut","Datorn vann");
310 else
311 QMessageBox::information(this,"Spelet slut","Du vann");
312 exit(0);
315 void MainWindow::setStarter()
317 if (isServer)
319 current = -1; // server börjar alltid :-D
320 ignoreClick=false;
321 // TODO Fråga om handikapp m.m.
323 else
325 current = 1;
326 ignoreClick=true;
328 schack=0;
329 clX= -1;
330 winner =0;
331 clY= -1;
332 schackadspelare=0;
336 void MainWindow::mousePressEvent(QMouseEvent* event)
338 int pos;
339 int typ;
340 int a,b;
341 if (!ignoreClick)
343 int xpos = event->x();
344 int ypos = event->y();
345 xpos = xpos / sX;
346 ypos = ypos / sY;
347 if (xpos>=0 && xpos<=8 && ypos>=0 && ypos<=8)
349 if (clX == -1) // inget klickat tidigare och inte tom ruta
351 if (plan[xpos*9+ypos] != -1 && pjaser[plan[xpos*9+ypos]].owner == current)
353 clX = xpos;
354 clY = ypos;
355 //ui.move->setVisible(false);
358 else // has previously clicked figure
360 stopx = xpos;
361 stopy = ypos;
362 if (stopx==clX && stopy==clY)
364 clX = -1;
365 clY = -1; // "unselect" the last click
367 else
369 if (clX>9) // droppa pjäs
371 pos = stopx*9+stopy;
372 typ = pjaser[plan[clX*9+clY]].typ;
374 if (plan[pos] == -1)
376 if ( typ>2 || ( (typ == 0 || typ == 1) && clY != 4+4*current) ||
377 (typ == 2 && clY != 4+3*current) )
379 b=0;
380 if (typ==0)
381 for (a=0;a<9;a++)
382 if (plan[stopx*9+a]!= -1 && pjaser[plan[stopx*9+a]].typ==0 && pjaser[plan[stopx*9+a]].owner==current)
383 b++;
384 if (b==0)
386 doDrop(current,clX,clY,stopx,stopy);
391 else
393 if (plan[stopx*9+stopy] == -1) // tomt här
395 if ( checkMove(current,clX,clY,stopx,stopy,true) )
397 doMove();
400 else if (pjaser[plan[stopx*9+stopy]].owner == current)
402 clX = xpos; // byt pjäs
403 clY = ypos;
405 else // C H A R G E !!!
407 if (checkMove(current,clX,clY,stopx,stopy,true))
409 doMove();
416 else // klickade utanför spelplanen
418 pos = xpos*9 +ypos;
419 if (pos<300 && plan[pos] != -1 && pjaser[plan[pos]].owner == current)
421 //flytta in pjäsen om det nästa gång klickas på ledig ruta
422 clX = xpos;
423 clY = ypos;
425 else{
426 clX = -1;
427 clY = -1;
430 update();
434 // player är oftast current som skickas. checkschack säger om vi skall kolla om det är schack
435 bool MainWindow::checkMove(int player, int x1,int y1,int x2,int y2,bool checkschack) //kolla om gilltigt drag
437 // qDebug()<<"Spelare "<<player<<" vill flytta från "<<x1<<y1<<" till "<<x2<<y2;
438 int pjas = x1*9+y1;
439 int typ = pjaser[plan[pjas]].typ;
440 int dx,dy,y,x;
441 int fiende = plan[x2*9+y2]; // id på den som står på mål rutan
442 bool dragOK=true; // om draget, rent flyttningsmässigt är ok, kollar ej om schack hot avvärjs
444 if (fiende == -1)
445 dragOK = true; // behöver ej kolla om tomma rutor
446 else if (pjaser[fiende].owner == player)
447 return false; // där fanns en vänskaplig pjäs
449 // OBS! dragOK måste ha true värde när vi går in här...
450 // kolla om motståndaren är i schack, då är partiet vunnet!
451 // kolla om jag är i schack
452 // gör en massa...
454 // Kolla om draget är giltigt
456 dx = x2 - x1;
457 dy = y2 - y1;
459 // Varje if-sats skall sätta true på dragOK variabeln eller returnera false direkt
460 if (typ == 2) // häst
462 dragOK = ( (abs(x1-x2)==1) && (y2 == y1+2*player)); // okflytt flytt+2 för uppe, -2 för nere
464 else if (typ == 0) // bonde
466 dragOK = (dx==0) && (dy == player); // smidigt med -1 och 1 parametrar för spelaren
468 else if (typ == 1) // lans
470 if (dx!=0) return false;
471 for (y=y1+player; dragOK && y!=y2; y=y+player)
473 dragOK = plan[x1*9 + y] == -1;
476 else if (typ == 3 ) // löpare
478 if (abs(dx) != abs(dy))
479 return false;
480 dx = sgn(dx);
481 dy = sgn(dy);
482 x=x1+dx;
483 y=y1+dy;
484 while (x!=x2 && dragOK )
486 dragOK = plan[x*9+y] == -1;
487 x = x + dx;
488 y = y + dy;
491 else if (typ == 4) // torn
493 if (dy == 0)
495 dx = sgn(dx);
496 x=x1+dx;
497 while (x!=x2 && dragOK )
499 dragOK = plan[x*9+y1] == -1;
500 x = x + dx;
503 else if (dx == 0)
505 dy = sgn(dy);
506 y=y1+dy;
507 while (y!=y2 && dragOK )
509 dragOK = plan[x1*9+y] == -1;
510 y = y + dy;
513 else
514 return false;
516 else if (typ == 5) // silver
518 if (abs(dx)>1 || abs(dy)>1 || dy == 0 || (dx==0 && dy == -player) )
519 return false;
520 // resten är ok if (abs(dy*dx) == 1 || (dx==0 && dy=sgn(current) ) )
521 // dragOK = true;
523 else if (typ == 6 || typ == 8 || typ == 9 || typ == 10 || typ == 13) // guld
525 if (abs(dx)>1 || abs(dy)>1 || ( abs(dx)==1 && dy == -player) )
526 return false;
527 // resten är ok att göra.
529 else if (typ == 7) // knugen
531 if (abs(dx)>1 || abs(dy)>1 ||
532 abs(pjaser[19].xpos-pjaser[39].xpos)<2 &&
533 abs(pjaser[19].ypos-pjaser[39].ypos)<2 ) // kolla så inte för nära andra kungen)
534 return false;
535 // allt annat innebär att kungen flyttar 1 steg eftersom vi redan har gallrat bort
536 // möjligheten att stå kvar på samma plats
538 else if (typ == 11) //promoted löpare
540 if (abs(dx)>1 || abs(dy)>1)
542 if (abs(dx) != abs(dy))
543 return false;
544 dx = sgn(dx);
545 dy = sgn(dy);
546 x=x1+dx;
547 y=y1+dy;
548 while (x!=x1 && dragOK )
550 dragOK = plan[x*9+y] == -1;
551 x = x + dx;
552 y = y + dy;
555 // else, annars är det ett drag som godkänns för det är precis som för en kung
557 else if (typ == 12) // promoted torn
559 if (abs(dx)>1 || abs(dy)>1 )
561 if (dy == 0)
563 dx = sgn(dx);
564 x=x1+dx;
565 while (x!=x2 && dragOK )
567 dragOK = plan[x*9+y1] == -1;
568 x = x + dx;
571 else if (dx == 0)
573 dy = sgn(dy);
574 y=y1+dy;
575 while (y!=y2 && dragOK )
577 dragOK = plan[x1*9+y] == -1;
578 y = y + dy;
581 else
582 return false;
583 }//else, ok, eftersom det är som ett kung drag.
585 else
586 dragOK = false;
588 // snabb koll...
589 if (!dragOK)
591 //qDebug()<<"Draget är INTE ok, gör om, gör rätt!";
592 return dragOK;
595 // kolla om schackhot avvärjt m.m. TODO stäng av ritningen samtidigt?
596 // First, save some stuff for undo
597 // Make a pseudomove...
598 // pjas = x1*9+y1 piece
599 if (checkschack)
601 int fplats = x2*9+y2;
602 int fnummer = plan[fplats];
603 int plats = x1*9+y1;
604 int nummer = plan[plats];
605 if (fnummer != -1)
607 pjaser[fnummer].owner = current;
608 pjaser[fnummer].outside= true;
610 Pjas old = pjaser[nummer]; // kopiera över all data
612 plan[fplats] = nummer;
613 plan[plats] = -1;
614 pjaser[nummer].xpos = x2;
615 pjaser[nummer].ypos = y2;
617 if (isSchacked(current,false))
619 dragOK=false;
620 ui.message->setText("Du får ej flytta så för då blir du schackad");
622 else
624 dragOK=true;
625 ui.message->setText("Draget är okej");
628 // undo move
629 if (fnummer != -1)
631 pjaser[fnummer].owner = -current;
632 pjaser[fnummer].outside = false;
634 pjaser[nummer] = old;
635 plan[fplats] =fnummer;
636 plan[plats] = nummer;
638 return dragOK;
643 Undersök om spelaren player står i schack.
644 Sätter värden på schackadspelare och schackare listan om någon är schackad om setParameters
645 är true
646 returnerar true om*/
647 bool MainWindow::isSchacked(int player,bool setParameters)
649 // Kolla om någon av moståndar pjäserna kan nå kungen som tillhör player
650 //qDebug()<<"\t\tLetar schack";
651 int kung,kx,ky,i;
652 if (player == -1)
653 kung=19;
654 else
655 kung=39;
656 kx = pjaser[kung].xpos;
657 ky = pjaser[kung].ypos;
658 bool schack=false; // om schack
659 if (setParameters)
661 schackare.clear(); // ta bort alla tidigare schackare
662 schackadspelare = 0;
664 for (i=0;i<39;i++)
666 if ( (i != 19) && (pjaser[i].owner != player) && (!pjaser[i].outside) )// pjäs i tillhör den andra
668 // qDebug()<<"\t\tFörsök med pjäs "<<i<<" i position" <<pjaser[i].xpos<<pjaser[i].ypos<<" kung i "<<kx<<ky;
669 if ( checkMove(-player,pjaser[i].xpos,pjaser[i].ypos,kx,ky,false) )
670 { // vi kunde nå kungen med pjäs i
671 schack = true;
672 if (setParameters)
674 schackadspelare = player;
675 schackare.push_back(i);
680 //qDebug()<<"\t\tSlutat leta schack";
681 return schack;
684 void MainWindow::resizeEvent(QResizeEvent* event)
686 sX = (int)((width()-1)/14);
687 sY = (int)((height()-1)/9);
688 if (sX<sY)
689 sY=sX;
690 else
691 sX=sY;
692 reloadPictures();
695 void MainWindow::doMove() // do the move
697 int x,y,i;
698 int piece = plan[clX*9+clY]; //pjäsen där
699 if (plan[stopx*9+stopy] != -1)
700 { // ta pjäs, redan kollat så att detta är möjligt.
701 int tagen = plan[stopx*9+stopy];
702 // hitta ledig plats
703 x=10; y=4-4*current; i=0;
704 while (plan[x*9+y]!= -1)
706 i++;
707 x=10+(i%4);
708 if (i>0 && i%4==0)
709 y=y+current;
711 pjaser[tagen].xpos = x;
712 pjaser[tagen].ypos = y;
713 plan[x*9+y]=tagen;
714 pjaser[tagen].owner = current;
715 pjaser[tagen].promoted = false;
716 pjaser[tagen].outside= true;
717 if (pjaser[tagen].typ>7)
718 pjaser[tagen].typ -= 8; // ändra ner typ till lägre grad
720 plan[stopx*9 +stopy] = piece;
721 pjaser[piece].xpos = stopx;
722 pjaser[piece].ypos = stopy;
724 plan[clX*9+clY] = -1;
725 // Kolla om vi kan promota
726 if ( ((current==-1 && stopy<=2) || (current==1 && stopy>=6) ) && pjaser[piece].typ<6 && askIfPromote(did_promote) )
728 pjaser[piece].typ += 8;
729 did_promote=true;
731 else
732 did_promote=false;
733 update();
734 // Just nu är det current som gör draget, kolla om -current är schackad
736 if (isSchacked(-current,true)) // sätt schack flaggor
737 if (current == 1)
738 ui.message->setText("Du är schackad");
739 else
740 ui.message->setText("Datorn är schackad");
741 else
742 ui.message->setText("");
744 emit nextPlayerSIG();
747 bool MainWindow::askIfPromote(bool other_promoted) //
749 if (current==1)
751 return other_promoted;
753 else
755 return (QMessageBox::question(this,"Vill du promota?","Vill du promota? Det brukar vara bäst att göra?",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes) == QMessageBox::Yes);
760 void MainWindow::doDrop(int current,int clX,int clY,int stopx,int stopy)
762 int plats = clX*9+clY;
763 int fplats = stopx*9+stopy;
764 int nummer = plan[plats];
765 Pjas old = pjaser[nummer];
767 plan[fplats]=nummer;
768 plan[plats]=-1;
769 pjaser[nummer].outside=false;
770 pjaser[nummer].promoted = false;
771 pjaser[nummer].xpos=stopx;
772 pjaser[nummer].ypos=stopy;
773 if (isSchacked(current,false))
775 // draget hjälpte inte, du är fortfarande schackad
776 pjaser[nummer]=old;
777 plan[fplats]=-1;
778 plan[plats]=nummer;
780 else
782 isSchacked(-current,true); // kolla om den andra är schackad
783 did_promote=false;
784 emit nextPlayerSIG();
788 void MainWindow::readMove()
790 QDataStream in;
791 if (isServer)
793 in.setDevice(client);
794 in.setVersion(QDataStream::Qt_4_0);
795 if (client->bytesAvailable()<5*(int)sizeof(qint32))
796 return;
798 else
800 in.setDevice(socket);
801 in.setVersion(QDataStream::Qt_4_0);
802 if (socket->bytesAvailable()<5*(int)sizeof(qint32))
803 return;
807 int promote;
808 in>>clX>>clY>>stopx>>stopy>>promote;
809 did_promote = (promote!=0);
810 qDebug()<<"Tog emot "<<clX<<clY<<stopx<<stopy<<promote;
812 if (clX<9)
814 clY=8-clY;
815 clX=8-clX; // spegelvänt!
816 stopy=8-stopy; // de är ju upp och ner!
817 stopx=8-stopx;
818 doMove();
820 else
822 clY=8-clY;
823 // rör ej clX !!
824 stopy=8-stopy; // de är ju upp och ner!
825 stopx=8-stopx;
826 // Hur fan blir det med drop och stopy???
827 doDrop(current, clX,clY,stopx,stopy);
831 void MainWindow::nextPlayer()
833 update();
835 if (current == -1) // Det var din tur
837 qDebug()<<"kom in in nextPlayer och det är current = "<<current;
838 ignoreClick=true;
839 // förbered för att skicka data
841 QByteArray block;
842 QDataStream out(&block, QIODevice::WriteOnly);
843 out.setVersion(QDataStream::Qt_4_0);
844 out<<(qint32)clX<<(qint32)clY<<(qint32)stopx<<(qint32)stopy;
846 if(did_promote)
847 out<<(qint32)1;
848 else
849 out<<(qint32)0;
851 // skicka data
852 if (isServer)
854 client->write(block);
856 else
858 socket->write(block);
860 qDebug()<<"skickade "<<clX<<clY<<stopx<<stopy<<"1 eller 0";
861 current = -current;
862 clX = -1;
863 clY = -1;
864 emit showPlayerTurnSIG();
866 else
868 ignoreClick=false; // det var den andres tur, nu är det din tur
869 current = -current;
870 clX=-1;
871 clY=-1;
872 qDebug()<<"Lämnar nextPlayer() och på denna dator är det nu current = "<<current;
873 emit showPlayerTurnSIG();