Qt编写的简单象棋程序 chessbroad.cpp
2018-03-23 05:12
351 查看
#include "chessbroad.h" #include <qtextcodec.h> ChessBroad::ChessBroad(QWidget *parent) : QWidget(parent) { //g[0][1]=0; key = 0; for(int i=0; i < NUMX+1; i++) for(int j=0; j < NUMY+1; j++) { g[i][j] = 0; } //黑棋 g[0][0]=24;//车 g[0][1]=22;//马 g[0][2]=20;//象 g[0][3]=18;//士 g[0][4]=17;//将 g[0][5]=19;//士 g[0][6]=21;//象 g[0][7]=23;//马 g[0][8]=25;//车 g[2][1]=26;//炮 g[2][7]=27;//炮 g[3][0]=28;//卒 g[3][2]=29;//卒 g[3][4]=30;//卒 g[3][6]=31;//卒 g[3][8]=32;//卒 //红棋 g[6][0]=12;//兵 g[6][2]=13;//兵 g[6][4]=14;//兵 g[6][6]=15;//兵 g[6][8]=16;//兵 g[7][1]=10;//炮 g[7][7]=11;//炮 g[9][0]=8;//车 g[9][1]=6;//马 g[9][2]=4;//相 g[9][3]=2;//士 g[9][4]=1;//帅 g[9][5]=3;//士 g[9][6]=5;//相 g[9][7]=7;//马 g[9][8]=9;//车 } void ChessBroad::paintEvent(QPaintEvent *e) { QPainter* paint = new QPainter(this); float max, min; int flag; if(this->width() >= this->height()) { max = this->width(); min = this->height(); flag = 0; } else { max = this->height(); min = this->width(); flag = 1; } float check ; if(flag == 0) { check = min/(NUMY+2); paint->drawLine((max-(NUMX*check))/2, check, (max-(NUMX*check))/2, min-check); paint->drawLine((max-(NUMX*check))/2+check*NUMX, check, (max-(NUMX*check))/2+check*NUMX, min-check); for(int i = 1; i < NUMX; i++)//间断的竖线; { paint->drawLine((max-(NUMX*check))/2+check*i, check, (max-(NUMX*check))/2+check*i, check+check*4); paint->drawLine((max-(NUMX*check))/2+check*i, check+check*5, (max-(NUMX*check))/2+check*i, min-check); } for(int i = 0; i <= NUMY; i++) { paint->drawLine((max-(NUMX*check))/2, check+i*check, (max-(max-(NUMX*check))/2), check+i*check); } paint->drawLine( (max-NUMX*check)/2+3*check, check, (max-NUMX*check)/2+5*check, 3*check); paint->drawLine( (max-NUMX*check)/2+3*check, 3*check, (max-NUMX*check)/2+5*check, check); paint->drawLine( (max-NUMX*check)/2+3*check, 8*check, (max-NUMX*check)/2+5*check, 10*check); paint->drawLine( (max-NUMX*check)/2+3*check, 10*check, (max-NUMX*check)/2+5*check, 8*check); } if(flag == 1) { check = min/(NUMX+2); paint->drawLine(check, (max-(check*NUMY))/2, check, (max-(check*NUMY))/2+NUMY*check); paint->drawLine(check+NUMX*check, (max-(check*NUMY))/2, check+NUMX*check, (max-(check*NUMY))/2+NUMY*check); for(int i = 1; i < NUMX; i++)//竖线 { paint->drawLine( check+i*check, (max-(check*NUMY))/2, check+i*check, (max-(check*NUMY))/2+4*check); paint->drawLine( check+i*check, (max-(check*NUMY))/2+check*5, check+i*check, (max-(check*NUMY))/2+NUMY*check); } for(int i = 0; i <= NUMY; i++)//横线 { paint->drawLine(check, (max-(NUMY*check))/2+i*check, check+NUMX*check, (max-(NUMY*check))/2+i*check); } paint->drawLine( check*4, (max-(NUMY*check))/2, check*6, (max-(NUMY*check))/2+check*2); paint->drawLine( check*4, (max-(NUMY*check))/2+check*2, check*6, (max-(NUMY*check))/2); paint->drawLine( check*4, (max-(NUMY*check))/2+check*7, check*6, (max-(NUMY*check))/2+check*9); paint->drawLine( check*4, (max-(NUMY*check))/2+check*9, check*6, (max-(NUMY*check))/2+check*7); } if( flag == 0 ) { paint->setPen(QPen( Qt::red, 1, Qt::DotLine)); for(int i=0; i <= NUMX+1; i++) { paint->drawLine((max-NUMX*check)/2-check/2+i*check, check/2, (max-NUMX*check)/2-check/2+i*check, min-check/2);//竖线 } for(int i=0; i <= NUMY+1; i++) { paint->drawLine((max-NUMX*check)/2-check/2, check/2+check*i, (max-NUMX*check)/2+NUMX*check+check/2, check/2+check*i); } paint->setPen(QPen( Qt::black, 1, Qt::SolidLine)); } if( flag == 1 ) { paint->setPen(QPen( Qt::red, 1, Qt::DotLine)); for(int i=0; i <= NUMX+1; i++) { paint->drawLine( check/2+check*i, (max-NUMY*check)/2-check/2, check/2+check*i, (max-NUMY*check)/2+NUMY*check+check/2); } for(int i=0; i <= NUMY+1; i++) { paint->drawLine( check/2, (max-NUMY*check)/2-check/2+i*check, min-check/2, (max-NUMY*check)/2-check/2+i*check); } paint->setPen(QPen( Qt::black, 1, Qt::SolidLine)); } //画红车 /* QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));//对QString型可以使用汉字 QString text("车"); paint->setPen(Qt::red); paint->setFont(QFont("Arial", check/2)); paint->drawEllipse( 0, 0, check, check); paint->drawText(0, 0, check, check, Qt::AlignCenter, text); */ QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312")); paint->setFont(QFont("Arial", check/2)); if( flag == 0 ) { for(int i = 0; i < NUMY+1; i++) for(int j = 0; j < NUMX+1; j++) { if( g[i][j]/17 == 0) { paint->setPen(Qt::red); } if( g[i][j]/17 == 1) { paint->setPen(Qt::blue); } if( g[i][j] != 0) { paint->drawEllipse( (max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check); switch( g[i][j] ) { case 1: { QString text("帅"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 2: case 3: { QString text("仕"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 4: case 5: { QString text("相"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 6: case 7: { QString text("马"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 8: case 9: { QString text("车"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 10: case 11: { QString text("炮"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 12: case 13: case 14: case 15: case 16: { QString text("兵"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 17: { QString text("将"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 18: case 19: { QString text("士"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 20: case 21: { QString text("象"); 4000 paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 22: case 23: { QString text("马"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 24: case 25: { QString text("车"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 26: case 27: { QString text("炮"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } case 28: case 29: case 30: case 31: case 32: { QString text("卒"); paint->drawText((max-NUMX*check)/2+j*check-check/2, check/2+i*check, check, check, Qt::AlignCenter, text); break; } } } } //放到flag里比较好 if( key != 0 ) { for(int i = 0; i < NUMY+1; i++) for(int j = 0; j <NUMX+1; j++) { if(g[i][j] == key) { qWarning("%d %d",i,j); paint->setPen(Qt::green); paint->drawRect( (max-((NUMX+1)*check))/2+j*check, check/2+i*check, check, check); } } } } if( flag == 1 ) { for(int i = 0; i < NUMY+1; i++) for(int j = 0; j < NUMX+1; j++) { if( g[i][j]/17 == 0) { paint->setPen(Qt::red); } if( g[i][j]/17 == 1) { paint->setPen(Qt::blue); } if( g[i][j] != 0) { paint->drawEllipse( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check); switch( g[i][j] ) { case 1: { QString text("帅"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 2: case 3: { QString text("仕"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 4: case 5: { QString text("相"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 6: case 7: { QString text("马"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 8: case 9: { QString text("车"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 10: case 11: { QString text("炮"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 12: case 13: case 14: case 15: case 16: { QString text("兵"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 17: { QString text("将"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 18: case 19: { QString text("士"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 20: case 21: { QString text("象"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 22: case 23: { QString text("马"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 24: case 25: { QString text("车"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 26: case 27: { QString text("炮"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } case 28: case 29: case 30: case 31: case 32: { QString text("卒"); paint->drawText( check/2+j*check, (max-NUMX*check)/2+i*check-check, check, check, Qt::AlignCenter, text); break; } } } } if(key != 0) { for(int i=0; i < NUMY+1; i++) for(int j=0; j<NUMX+1; j++) { if(g[i][j] == key) { qWarning("%d %d",i,j); paint->setPen(Qt::green); paint->drawRect( check/2+j*check, (max-((NUMY+1)*check))/2+i*check, check, check); } } } } paint->~QPainter(); } void ChessBroad::mousePressEvent(QMouseEvent *e) { float max, min; int flag; if(this->width() >= this->height()) { max = this->width(); min = this->height(); flag = 0; } else { max = this->height(); min = this->width(); flag = 1; } float check ; if( flag == 0 ) { check = min/(NUMY+2); if((e->pos().x() > (max-(NUMX+1)*check)/2)&&(e->pos().x() < max-(max-(NUMX+1)*check)/2)&&(e->pos().y() > check/2)&&(e->pos().y() < (min-check/2))) { int px = (e->pos().y()-check/2)/check; int py = (e->pos().x()-(max-(NUMX+1)*check)/2)/check; //落子 if(key != 0) { int x, y; for(int i=0; i<NUMY+1; i++) for(int j=0; j<NUMX+1; j++) { if( g[i][j] == key ) { x = i; y = j; } } switch(key) {//红方 case 1://帅 { int x1, y1; for(int i=0; i<NUMY+1; i++) for(int j=0; j<NUMX+1; j++) { if(g[i][j] == 17) { x1 = i; y1 = j; } } qWarning("%d %d", x1, y1); if((y1 == y)) { int i; for( i = 1; (i <= x-x1)&&(g[x-i][y] == 0); i++); qWarning("%d", i); if((i == x-x1)&&(g[px][py] == 17)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if((((px == x+1)&&(py == y))||((px == x-1)&&(py == y)) ||((px == x)&&(py ==y+1))||((px == x)&&(py == y-1))) &&((px >=7)&&(py >= 3)&&(py <= 5))) { if((g[px][py]/17 != 0)&&(g[px][py] != 0))//吃子 { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 2://仕 case 3: { if(((px >=7)&&(py >= 3)&&(py <= 5)) &&(((px == x+1)&&(py == y+1))||((px == x-1)&&(py == y-1))||((px == x+1)&&(py == y-1))||((px == x-1)&&(py == y+1)))) { if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 4://相 case 5: { if((((px == x+2)&&(py == y+2)&&(g[x+1][y+1] == 0))||((px == x-2)&&(py == y-2)&&(g[x-1][y-1] == 0)) ||((px == x+2)&&(py == y-2)&&(g[x+1][y-1] == 0))||((px ==x-2)&&(py == y+2)&&(g[x-1][y+1] == 0))) &&(px >= 5)) { if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 6://马 case 7: { if(((px == x+2)&&(py == y+1)&&(g[x+1][y] == 0))||((px == x+2)&&(py == y-1)&&(g[x+1][y] == 0)) ||((px == x-2)&&(py == y+1)&&(g[x-1][y] == 0))||((px == x-2)&&(py == y-1)&&(g[x-1][y] == 0)) ||((px == x+1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x+1)&&(py == y-2)&&(g[x][y-1] == 0)) ||((px == x-1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x-1)&&(py == y-2)&&(g[x][y-1] == 0))) { if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 8://车 case 9: { if(px == x) { if(py > y) { int i; for( i=1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if(py < y) { int i; for( i=y-py-1; (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } if(py == y) { if(px > x) { int i; for( i=1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] 18838 = key; g[x][y] = 0; key = 17; } } } if(px < x) { int i; for( i=x-px-1; (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } break; } case 10://炮 case 11: { if(px == x) { if(g[px][py] == 0) { if(py > y) { int i; for( i = 1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if(py < y) { int i; for( i = (y-py-1); (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if((g[px][py]/17 != 0)&&(g[px][py] != 0)) {//吃子 //qWarning("%d %d",px,py); if(py > y)//向右吃子 { int i, j; for( i = 1; (i < py-y)&&(g[x][y+i] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != py-y) { for(j = i+1; (j < py-y)&&(g[x][y+j] == 0); j++); qWarning("%d",j); if(j == py-y) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if(py < y)//向左吃子 { int i, j; for( i = 1; (i < y-py)&&(g[x][y-i] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != y-py) { for( j = i+1; (j < y-py)&&(g[x][y-j] == 0); j++); qWarning("%d",j); if(j == y-py) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } } if(py == y) { if(g[px][py] == 0) { if(px > x) { int i; for( i = 1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if(px < x) { int i; for( i = (x-px-1); (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if((g[px][py]/17 != 0)&&(g[px][py] != 0)) { if(px > x) { int i, j; for( i = 1; (i < px-x)&&(g[x+i][y] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != px-x) { for(j = i+1; (j < px-x)&&(g[x+j][y] == 0); j++); qWarning("%d",j); if(j == px-x) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if(px < x)//向上吃子 { int i, j; for( i = 1; (i < x-px)&&(g[x-i][y] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != x-px) { for( j = i+1; (j < x-px)&&(g[x-j][y] == 0); j++); qWarning("%d",j); if(j == x-px) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } } break; } case 12://兵 case 13: case 14: case 15: case 16: { //qWarning("%d %d", px, py); if((px == 5)&&(px == (x-1))&&(py == y)) { if(((g[px][py]/17 != key/17)&&(g[px][py] != 0))||(g[px][py] == 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if(px < 5) { if(((px == x)&&(py == y+1))||((px == x)&&(py == y-1)) ||((px == x-1)&&(py == y))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } break; } case 17://黑将 { int x1, y1; for(int i=0; i<NUMY+1; i++) for(int j=0; j<NUMX+1; j++) { if(g[i][j] == 1) { x1 = i; y1 = j; } } qWarning("%d %d", x1, y1); if(y1 == y) { int i; for( i = 1; (i <= x1-x)&&(g[x+i][y] == 0); i++); qWarning("%d", i); if((i == x1-x)&&(g[px][py] == 1)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } if((((px == x+1)&&(py == y))||((px == x-1)&&(py == y)) ||((px == x)&&(py ==y+1))||((px == x)&&(py == y-1))) &&((px <= 2)&&(py >= 3)&&(py <= 5))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0))//吃子 { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } break; } case 18://士 case 19: { qWarning("%d %d",px,py); qWarning("%d",g[x][y]); qWarning("%d",g[px][py]); if(((px <= 2)&&(py >= 3)&&(py <= 5)) &&(((px == x+1)&&(py == y+1))||((px == x-1)&&(py == y-1))||((px == x+1)&&(py == y-1))||((px == x-1)&&(py == y+1)))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { qWarning("e"); g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } qWarning("%d %d",px,py); qWarning("%d",g[x][y]); qWarning("%d",g[px][py]); if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } qWarning("%d %d",px,py); qWarning("%d",g[x][y]); qWarning("%d",g[px][py]); break; } case 20://象 case 21: { if((((px == x+2)&&(py == y+2)&&(g[x+1][y+1] == 0))||((px == x-2)&&(py == y-2)&&(g[x-1][y-1] == 0)) ||((px == x+2)&&(py == y-2)&&(g[x+1][y-1] == 0))||((px ==x-2)&&(py == y+2)&&(g[x-1][y+1] == 0))) &&(px <= 4)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } break; } case 22://马 case 23: { if(((px == x+2)&&(py == y+1)&&(g[x+1][y] == 0))||((px == x+2)&&(py == y-1)&&(g[x+1][y] == 0)) ||((px == x-2)&&(py == y+1)&&(g[x-1][y] == 0))||((px == x-2)&&(py == y-1)&&(g[x-1][y] == 0)) ||((px == x+1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x+1)&&(py == y-2)&&(g[x][y-1] == 0)) ||((px == x-1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x-1)&&(py == y-2)&&(g[x][y-1] == 0))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } break; } case 24://车 case 25: { if(px == x) { if(py > y) { int i; for( i=1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if(py < y) { int i; for( i=y-py-1; (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } } if(py == y) { if(px > x) { int i; for( i=1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if(px < x) { int i; for( i=x-px-1; (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } } break; } case 26://炮 case 27: { if(px == x) { if(g[px][py] == 0) { if(py > y) { int i; for( i = 1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } if(py < y) { int i; for( i = (y-py-1); (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) {//吃子 //qWarning("%d %d",px,py); if(py > y)//向右吃子 { int i, j; for( i = 1; (i < py-y)&&(g[x][y+i] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != py-y) { for(j = i+1; (j < py-y)&&(g[x][y+j] == 0); j++); qWarning("%d",j); if(j == py-y) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if(py < y)//向左吃子 { int i, j; for( i = 1; (i < y-py)&&(g[x][y-i] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != y-py) { for( j = i+1; (j < y-py)&&(g[x][y-j] == 0); j++); qWarning("%d",j); if(j == y-py) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } } } if(py == y) { if(g[px][py] == 0) { if(px > x) { int i; for( i = 1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { g[px][py] = key; g[x][y] = 0; key = 1; } } if(px < x) { int i; for( i = (x-px-1); (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { g[px][py] = key; g[x][y] = 0; key = 1; } } } if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { if(px > x) { int i, j; for( i = 1; (i < px-x)&&(g[x+i][y] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != px-x) { for(j = i+1; (j < px-x)&&(g[x+j][y] == 0); j++); qWarning("%d",j); if(j == px-x) { g[px][py] = key; g[x][y] = 0; key = 1; } } } if(px < x)//向上吃子 { int i, j; for( i = 1; (i < x-px)&&(g[x-i][y] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != x-px) { for( j = i+1; (j < x-px)&&(g[x-j][y] == 0); j++); qWarning("%d",j); if(j == x-px) { g[px][py] = key; g[x][y] = 0; key = 1; } } } } } break; } case 28://卒 case 29: case 30: case 31: case 32: { //qWarning("%d %d", px, py); if((px == 4)&&(px == (x+1))&&(py == y)) { if(((g[px][py]/17 != key/17)&&(g[px][py] != 0))||(g[px][py] == 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } if(px > 4) { if(((px == x)&&(py == y+1))||((px == x)&&(py == y-1)) ||((px == x+1)&&(py == y))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } break; } } } if((g[px][py] != 0)&&(key == 0))//第一次点击棋子 { key = g[px][py]; } if((key != 0)&&(key/17 == g[px][py]/17)&&(g[px][py] != 0))//再次点击的颜色与选中的颜色相同,框住点选的棋子。 { key = g[px][py]; } } } if( flag == 1) { check = min/(NUMX+2); if((e->pos().x() > check/2)&&(e->pos().x() < (min - check/2))&&(e->pos().y() > (max-(NUMY+1)*check)/2)&&(e->pos().y() < max-(max-(NUMY+1)*check)/2)) { int px = (e->pos().y()-(max-(NUMY+1)*check)/2)/check; int py = (e->pos().x()-check/2)/check; //落子从flag==0完全复制 if(key != 0) { int x, y; for(int i=0; i<NUMY+1; i++) for(int j=0; j<NUMX+1; j++) { if( g[i][j] == key ) { x = i; y = j; } } switch(key) {//红方 case 1://帅 { int x1, y1; for(int i=0; i<NUMY+1; i++) for(int j=0; j<NUMX+1; j++) { if(g[i][j] == 17) { x1 = i; y1 = j; } } qWarning("%d %d", x1, y1); if((y1 == y)) { int i; for( i = 1; (i <= x-x1)&&(g[x-i][y] == 0); i++); qWarning("%d", i); if((i == x-x1)&&(g[px][py] == 17)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if((((px == x+1)&&(py == y))||((px == x-1)&&(py == y)) ||((px == x)&&(py ==y+1))||((px == x)&&(py == y-1))) &&((px >=7)&&(py >= 3)&&(py <= 5))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0))//吃子 { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 2://仕 case 3: { if(((px >=7)&&(py >= 3)&&(py <= 5)) &&(((px == x+1)&&(py == y+1))||((px == x-1)&&(py == y-1))||((px == x+1)&&(py == y-1))||((px == x-1)&&(py == y+1)))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 4://相 case 5: { if((((px == x+2)&&(py == y+2)&&(g[x+1][y+1] == 0))||((px == x-2)&&(py == y-2)&&(g[x-1][y-1] == 0)) ||((px == x+2)&&(py == y-2)&&(g[x+1][y-1] == 0))||((px ==x-2)&&(py == y+2)&&(g[x-1][y+1] == 0))) &&(px >= 5)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 6://马 case 7: { if(((px == x+2)&&(py == y+1)&&(g[x+1][y] == 0))||((px == x+2)&&(py == y-1)&&(g[x+1][y] == 0)) ||((px == x-2)&&(py == y+1)&&(g[x-1][y] == 0))||((px == x-2)&&(py == y-1)&&(g[x-1][y] == 0)) ||((px == x+1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x+1)&&(py == y-2)&&(g[x][y-1] == 0)) ||((px == x-1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x-1)&&(py == y-2)&&(g[x][y-1] == 0))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } break; } case 8://车 case 9: { if(px == x) { if(py > y) { int i; for( i=1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if(py < y) { int i; for( i=y-py-1; (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } if(py == y) { if(px > x) { int i; for( i=1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if(px < x) { int i; for( i=x-px-1; (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } break; } case 10://炮 case 11: { if(px == x) { if(g[px][py] == 0) { if(py > y) { int i; for( i = 1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if(py < y) { int i; for( i = (y-py-1); (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) {//吃子 //qWarning("%d %d",px,py); if(py > y)//向右吃子 { int i, j; for( i = 1; (i < py-y)&&(g[x][y+i] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != py-y) { for(j = i+1; (j < py-y)&&(g[x][y+j] == 0); j++); qWarning("%d",j); if(j == py-y) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if(py < y)//向左吃子 { int i, j; for( i = 1; (i < y-py)&&(g[x][y-i] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != y-py) { for( j = i+1; (j < y-py)&&(g[x][y-j] == 0); j++); qWarning("%d",j); if(j == y-py) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } } if(py == y) { if(g[px][py] == 0) { if(px > x) { int i; for( i = 1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if(px < x) { int i; for( i = (x-px-1); (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { if(px > x) { int i, j; for( i = 1; (i < px-x)&&(g[x+i][y] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != px-x) { for(j = i+1; (j < px-x)&&(g[x+j][y] == 0); j++); qWarning("%d",j); if(j == px-x) { g[px][py] = key; g[x][y] = 0; key = 17; } } } if(px < x)//向上吃子 { int i, j; for( i = 1; (i < x-px)&&(g[x-i][y] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != x-px) { for( j = i+1; (j < x-px)&&(g[x-j][y] == 0); j++); qWarning("%d",j); if(j == x-px) { g[px][py] = key; g[x][y] = 0; key = 17; } } } } } break; } case 12://兵 case 13: case 14: case 15: case 16: { //qWarning("%d %d", px, py); if((px == 5)&&(px == (x-1))&&(py == y)) { if(((g[px][py]/17 != key/17)&&(g[px][py] != 0))||(g[px][py] == 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } } if(px < 5) { if(((px == x)&&(py == y+1))||((px == x)&&(py == y-1)) ||((px == x-1)&&(py == y))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; key = 17; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; key = 17; } } } break; } case 17://黑将 { int x1, y1; for(int i=0; i<NUMY+1; i++) for(int j=0; j<NUMX+1; j++) { if(g[i][j] == 1) { x1 = i; y1 = j; } } qWarning("%d %d", x1, y1); if(y1 == y) { int i; for( i = 1; (i <= x1-x)&&(g[x+i][y] == 0); i++); qWarning("%d", i); if((i == x1-x)&&(g[px][py] == 1)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } if((((px == x+1)&&(py == y))||((px == x-1)&&(py == y)) ||((px == x)&&(py ==y+1))||((px == x)&&(py == y-1))) &&((px <= 2)&&(py >= 3)&&(py <= 5))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0))//吃子 { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } break; } case 18://士 case 19: { if(((px <= 2)&&(py >= 3)&&(py <= 5)) &&(((px == x+1)&&(py == y+1))||((px == x-1)&&(py == y-1))||((px == x+1)&&(py == y-1))||((px == x-1)&&(py == y+1)))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } break; } case 20://象 case 21: { if((((px == x+2)&&(py == y+2)&&(g[x+1][y+1] == 0))||((px == x-2)&&(py == y-2)&&(g[x-1][y-1] == 0)) ||((px == x+2)&&(py == y-2)&&(g[x+1][y-1] == 0))||((px ==x-2)&&(py == y+2)&&(g[x-1][y+1] == 0))) &&(px <= 4)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = key; g[x][y] = 0; } if(g[px][py] == 0) { g[px][py] = key; g[x][y] = 0; } } break; } case 22://马 case 23: { if(((px == x+2)&&(py == y+1)&&(g[x+1][y] == 0))||((px == x+2)&&(py == y-1)&&(g[x+1][y] == 0)) ||((px == x-2)&&(py == y+1)&&(g[x-1][y] == 0))||((px == x-2)&&(py == y-1)&&(g[x-1][y] == 0)) ||((px == x+1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x+1)&&(py == y-2)&&(g[x][y-1] == 0)) ||((px == x-1)&&(py == y+2)&&(g[x][y+1] == 0))||((px == x-1)&&(py == y-2)&&(g[x][y-1] == 0))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } break; } case 24://车 case 25: { if(px == x) { if(py > y) { int i; for( i=1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if(py < y) { int i; for( i=y-py-1; (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } } if(py == y) { if(px > x) { int i; for( i=1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if(px < x) { int i; for( i=x-px-1; (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } } break; } case 26://炮 case 27: { if(px == x) { if(g[px][py] == 0) { if(py > y) { int i; for( i = 1; (i < (py-y))&&(g[x][y+i] == 0); i++); if(i == (py-y)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } if(py < y) { int i; for( i = (y-py-1); (i > 0)&&(g[x][y-i] == 0); i--); if(i == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) {//吃子 //qWarning("%d %d",px,py); if(py > y)//向右吃子 { int i, j; for( i = 1; (i < py-y)&&(g[x][y+i] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != py-y) { for(j = i+1; (j < py-y)&&(g[x][y+j] == 0); j++); qWarning("%d",j); if(j == py-y) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if(py < y)//向左吃子 { int i, j; for( i = 1; (i < y-py)&&(g[x][y-i] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != y-py) { for( j = i+1; (j < y-py)&&(g[x][y-j] == 0); j++); qWarning("%d",j); if(j == y-py) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } } } if(py == y) { if(g[px][py] == 0) { if(px > x) { int i; for( i = 1; (i < (px-x))&&(g[x+i][y] == 0); i++); if(i == (px-x)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } if(px < x) { int i; for( i = (x-px-1); (i > 0)&&(g[x-i][y] == 0); i--); if(i == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { if(px > x) { int i, j; for( i = 1; (i < px-x)&&(g[x+i][y] == 0); i++); qWarning("%d %d",px, py); qWarning("%d",i); if(i != px-x) { for(j = i+1; (j < px-x)&&(g[x+j][y] == 0); j++); qWarning("%d",j); if(j == px-x) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } if(px < x)//向上吃子 { int i, j; for( i = 1; (i < x-px)&&(g[x-i][y] == 0); i++); qWarning("%d %d", px, py); qWarning("%d", i); if(i != x-px) { for( j = i+1; (j < x-px)&&(g[x-j][y] == 0); j++); qWarning("%d",j); if(j == x-px) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } } } break; } case 28://卒 case 29: case 30: case 31: case 32: { //qWarning("%d %d", px, py); if((px == 4)&&(px == (x+1))&&(py == y)) { if(((g[px][py]/17 != key/17)&&(g[px][py] != 0))||(g[px][py] == 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } if(px > 4) { if(((px == x)&&(py == y+1))||((px == x)&&(py == y-1)) ||((px == x+1)&&(py == y))) { if((g[px][py]/17 != key/17)&&(g[px][py] != 0)) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } if(g[px][py] == 0) { g[px][py] = g[x][y]; g[x][y] = 0; key = 1; } } } break; } } }//end落子 if((g[px][py] != 0)&&(key == 0)) { key = g[px][py]; } if((key != 0)&&(key/17 == g[px][py]/17)&&(g[px][py] != 0)) { key = g[px][py]; } } } //for(int i = 0; i < NUMY+1; i++) // for(int j = 0; j< NUMX+1; j++) // { // qWarning("%d", g[i][j]); // } qWarning("%d",key); update(); } ChessBroad::~ChessBroad() { }
相关文章推荐
- Qt编写的简单象棋程序 chessbroad.h main.cpp
- 利用QT编写一个简单爬虫程序
- 使用 acl_cpp 库编写多线程程序
- Qt5编写的一个推力传感器静态性能计算程序
- 学习用CMake来编写Qt程序
- QT(1)-Qt Creator 编写多窗口程序
- Qt编写串口通信程序全程图文讲解
- 基于Qt编写TCP通讯程序测试程序之超级详细教程
- Qt4 For Dev-Cpp的最简单配置
- c++编写简单的计算器程序
- Linux 上简单的MeeGo 开发 QT 程序(适用于刚入门同学)
- 用C语言编写一个Linux下的简单shell程序
- 【C++】简单的多个cpp组合程序
- Qt之base64编码最简单程序
- QT4.5编写程序在arm开发板上无法显示中文的问题
- Qt编写串口通信程序全程图文讲解
- C编写的 简单图书录入程序.
- ubuntu下编写简单的helloworld程序
- PHP日历程序编写(简单实现)
- 编写简单的C/S聊天程序