⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 用qt写的网络五子棋程序
💻 CPP
字号:
#include "Main.h"ChessBoard::ChessBoard(QWidget *parent,char *name)        :QWidget(parent,name){       	mChessboardPixmap=new QPixmap("chessboard_xmp");     	mWhiteChessPixmap= new QPixmap("white_xmp");	mBlackChessPixmap= new QPixmap("black_xmp");	    	mChessSize=QSize((mSize.width()-mLeftMargin-mRightMargin)/15,(mSize.height()-mLeftMargin-mRightMargin)/15);     	setBackgroundPixmap(*mChessboardPixmap);      	mStartButton=new QPushButton(this, 0);	mStartButton->setText("Start");	mStartButton->setGeometry(252, 579, 120, 50);	mGameInfoLabel=new QLabel ( this,  0,  0 ); 	mGameStatusLabel=new QLabel ( this,  0,  0 ); 	mWhiteLabel=new QLabel ( this,  0,  0 ); 	mBlackLabel=new QLabel ( this,  0,  0 ); 	mMySideLabel=new QLabel( this, 0, 0);	mGameStatusLabel->setGeometry(17,9,192,60);	mGameStatusLabel->setText(QString("Idle"));	mGameStatusLabel->setFont( QFont( "Helvetica", 16 ) );		mMySideLabel->setGeometry(17,70,192,47);	mMySideLabel->setText(QString("Your side:"));	mMySideLabel->setFont( QFont( "Helvetica", 12 ) );			mWhiteLabel->setGeometry(17,118,192,47);	mWhiteLabel->setText(QString("White :"));	mWhiteLabel->setFont( QFont( "Helvetica", 12 ) );	mBlackLabel->setGeometry(17,166,192,46);	mBlackLabel->setText(QString("Black :"));	mBlackLabel->setFont( QFont( "Helvetica", 12 ) );		mGameInfoLabel->setGeometry(17,213,192,45);	mGameInfoLabel->setText(QString("Game info:"));	mGameInfoLabel->setFont( QFont( "Helvetica", 12 ) );		mLeftMargin=268;	mRightMargin=17;	mTopMargin=22;	mBottomMargin=100;		connect( mStartButton, SIGNAL(clicked ()), this, SLOT(sstartclicked()) );	}void ChessBoard::init(){  	 setGeometry(mPosition.x(), mPosition.y(), mSize.width(), mSize.height());     }void ChessBoard::paintEvent(QPaintEvent* ){	mGameInfoLabel->setText(QString("Now turn:")+mGameLogic.mCurrentTurn);	     QPainter paint( this );     QRect temptRect;	 mChessSize=QSize(34,34);     temptRect=QRect(mPosition.x(),                   mPosition.y(),                   mSize.width(),                   mSize.width());			int i;	//逐个画棋子		for( i=0; i<225; i++)	{		if(mGameLogic.mChessRecord.mRecord[i].mPoint.x()<0)			break;		temptRect=QRect(convertGridToMouse(mGameLogic.mChessRecord.mRecord[i].mPoint)				,mChessSize);		if(mGameLogic.mChessRecord.mRecord[i].mTurn==0)		{     			paint.drawPixmap(temptRect,*mWhiteChessPixmap);		}		else		{			paint.drawPixmap(temptRect,*mBlackChessPixmap);		}		}	}void ChessBoard::mousePressEvent(QMouseEvent *e){	//鼠标点下后表示落子	//调用游戏逻辑判断合法性,舒赢等	if(mGameLogic.mGameState!='p')//'p'-playing表示正在下棋		return; 	QPoint p=convertMouseToGrid(e->pos());	if(p.x()<=0||p.y()<=0)		return;		if(!mGameLogic.PutNewChess( p.x(), p.y() , 1)  )//1表示是自己下的, 0表示是对方下的	{		printf("in mouse press Event cannot put chess\n");		return;	}	//本地显示棋子,		PutChessToFace(p);			//将坐标发送给对方,递交给HallMaster来完成发送	char tempt[3];	Message msg;	msg.mRequest=QString("bchessput");	snprintf(tempt,3,"%d", p.x());	msg.mContent=QString(tempt);	snprintf(tempt,3,"%d", p.y());	msg.mContent2=QString(tempt);		emit sendmsgtomain(msg);			//}//根据棋盘大小,将p点坐标转换为15*15棋盘的坐标QPoint ChessBoard::convertMouseToGrid(const QPoint p){	int x=p.x()-mLeftMargin;	int y=p.y()-mTopMargin;	if( (x<=0)		||(y<=0)		||(x>=(mSize.width()-mLeftMargin-mRightMargin))		||(y>=(mSize.height()-mTopMargin-mBottomMargin)))		return(QPoint(-1,-1));	QPoint g;            int sizex=mChessSize.width();	int sizey=mChessSize.height();        g.setX(x/sizex+1);         g.setY(y/sizey+1);       	//if(g.x()<=0||g.y()<=0)	//	printf( "int convertMouseToGrid size:(%d, %d) mouse x, y: (%d, %d) grid x,y: (%d , %d)\n ",sizex, sizey, p.x(), p.y(), g.x(), g.y());        return g;  }QPoint ChessBoard::convertGridToMouse(const QPoint g){	QPoint p;	if(g.x()<=0||g.y()<=0)		return QPoint(-1,-1);	 int sizex=mChessSize.width();	int sizey=mChessSize.height();      	int x=g.x()*sizex-sizex;	int y=g.y()*sizey-sizey;	x+=mLeftMargin;	y+=mTopMargin;        p.setX(x); //转换后减一个偏移把棋子中心处鼠标坐标转换为矩形左上角坐标        p.setY(y);		if(g.x()<=0||g.y()<=0)	printf("int convertGridToMouse size:(%d ,%d) grid x,y : %d,%d mouse x, y:%d,%d \n",sizex, sizey, g.x(), g.y(), p.x(), p.y());                return p;	}void ChessBoard::sstartclicked(){		//游戏界面Start按钮被按下,更新label	if(mGameLogic.mGameState!='f')		return;	mGameStatusLabel->setText("Waiting");	mGameLogic.mGameState='w';    //w表示等待	clearBoard();	//send invitation to the other side;	if(mMyDesk.mWhiteID.compare("-1")==0||mMyDesk.mBlackID.compare("-1")==0)		return;	Message msg;	msg.mRequest=QString("bsendinvite");	emit sendmsgtomain( msg );		}void ChessBoard:: clearBoard(){	mGameLogic.clearChessInfo();	} void ChessBoard:: setPos(QPoint p){             mPosition=p;}void ChessBoard:: setSize(QSize s){             mSize=s;}void ChessBoard::setMyside(QString side){	mMyside=side;}void ChessBoard::PutChessToFace(QPoint p){	QPoint chessp=convertGridToMouse(p);	if(chessp.x()<mLeftMargin||chessp.y()<mTopMargin)		return;	QRect tmpt=QRect(chessp, mChessSize);		repaint(tmpt, FALSE);	//判断输赢	int i=0;	//找到当前棋子	while(mGameLogic.mChessRecord.mRecord[i++].mPoint.x()!=-1);			if(i>=8)	{		int x=mGameLogic.mChessRecord.mRecord[i-2].mPoint.x();		int y=mGameLogic.mChessRecord.mRecord[i-2].mPoint.y();		int turn=mGameLogic.mChessRecord.mRecord[i-2].mTurn;		if(mGameLogic.JudgeWin(x, y, turn))		{			printf("win! side %d\n",turn);			//更新label			if(turn==1&&mGameLogic.mMyside.compare("black")==0)				mGameStatusLabel->setText("You Win!");			else if(turn==0&&mGameLogic.mMyside.compare("white")==0)				mGameStatusLabel->setText("You Win!");			else 				mGameStatusLabel->setText("You Lose!");			mGameLogic.mGameState='f';		}						}	mGameInfoLabel->setText(QString("Now turn:")+mGameLogic.mCurrentTurn);	}void ChessBoard:: sdisposemsg(Message msg){	QString req=msg.mRequest;		if(!req.compare("hagreeinvite"))	{		//收到对方同意下棋的回复		HandleAgree();	}	else if(!req.compare("hputchess"))	{		//收到对方落子坐标		HandlePutchess(msg);	}	else if(!req.compare("hchangeseat"))	{		//座位更换				HandleChangeseat(msg);	}	else if(!req.compare("hupdatedesk"))	{		//座位更换		HandleUpdatedesk(msg);	}	else if(!req.compare("hreplyinvite"))	{		//		HandleInvite();	}	else if(!req.compare("hmyid"))	{		mMyID=msg.mContent;	}	else 		printf("in chessboard::sdisposemsg, unknown request!\n");					}//收到对方同意下棋的回复void ChessBoard::HandleAgree(){		//设置mGameLogic 的参数	mGameLogic.mGameState='p';		//修改游戏状态label	mGameStatusLabel->setText(QString("Playing"));			repaint();}//处理本方落子消息void ChessBoard::HandlePutchess( Message msg){	//将msg.mContent转换为棋盘坐标	QString qstr;	QPoint point;	int n=0;	char tempt[100];	snprintf(tempt, msg.mContent.length()+1, "%s", msg.mContent.ascii());//snprintf 第二个表示长度的参数,似乎包含了字符串结束字符'\0'	char *ptr;	ptr=strstr(&tempt[0], "#");	if(ptr==NULL)	{		printf("getting x chess grid error!\n");		return;	}	*ptr='\0';	qstr=QString(&tempt[n]);	n+=ptr-&tempt[n]+1;	point.setX(qstr.toInt());		ptr=strstr(&tempt[n], "#");	if(ptr==NULL)	{		printf("getting y chess grid error!\n");		return;	}	*ptr='\0';	qstr=QString(&tempt[n]);	n+=ptr-&tempt[n]+1;	point.setY(qstr.toInt());	//重绘,并添加新棋子,游戏逻辑,比如轮到谁等在putnewchess里修改	mGameLogic.PutNewChess(point.x(), point.y(), 0);	PutChessToFace(point);}  //处理换座(坐下)成功消息void ChessBoard::HandleChangeseat(Message msg){	mGameLogic.mMyside=msg.mContent;	mGameLogic.mCurrentTurn=QString("black");	mGameLogic.mGameState='f';	mMySideLabel->setText(QString("Your side:") + msg.mContent);	}//更新本桌信息void ChessBoard::HandleUpdatedesk(Message msg){	//找到左右两边ID	QString whiteid=msg.mContent;	QString blackid=msg.mContent2;	//设置Label属性及mydesk	mMyDesk.mWhiteID=whiteid;	mMyDesk.mBlackID=blackid;	mWhiteLabel->setText(QString("White:")+whiteid);	mBlackLabel->setText(QString("Black:")+blackid);	}void ChessBoard :: HandleInvite(){	Message msg;	//reply by judging from current game state;	//the logic is: only when the current state is waiting can the chessboard send agree feedback 	//under other circumstances, no reply would be sended (reply only if agree, agree only if i'm waiting)		if(mGameLogic.mGameState=='w')	{		msg.mRequest=QString("bagreeinvite");		mGameLogic.mGameState='p';		mGameStatusLabel->setText("Playing");		emit sendmsgtomain(msg);	}}ChatBox::ChatBox(QWidget *parent,char *name)      :QWidget(parent,name){  }void ChatBox::init(){        	mChatLineEdit=new QLineEdit(this,0);  	mChatListBox=new QListBox(this,0,0);  	mChatListBox->setGeometry(0,0,mSize.width(),mSize.height()-40);  	mChatLineEdit->setGeometry(0,mSize.height()-30,mSize.width(),30);   	 setGeometry(mPosition.x(),mPosition.y(),mSize.width(),mSize.height());   	connect( mChatLineEdit, SIGNAL(returnPressed ()),this, SLOT(schatlinereturned()) );  			 }void ChatBox::ShowMessage(QString str){  	mChatListBox->insertItem(str,-1);}  void ChatBox::schatlinereturned(){	QString str=mChatLineEdit->text();	ShowMessage(str);	mChatLineEdit->clear();	Message msg;	msg.mRequest=QString("cchat");	msg.mContent=str;	emit sendmsgtomain(msg);}void ChatBox:: sshowchat(Message msg){	 ShowMessage(msg.mContent);}Main::Main(QWidget *parent,char *name)       :QWidget(parent,name)       {	//设置个部件位置,大小 	 mSize=QSize(800,641); 	 mChessBoardPos=QPoint(0,0); 	 mChessBoardSize=QSize(800,641); 	 mChatBoxPos=QPoint(13,292); 	 mChatBoxSize=QSize(195,333); 	  	 mChessBoard=new ChessBoard(this,0);	 mChatBox=new ChatBox(this,0);	//将位置,大小传递给部件      	mChatBox->setPos(mChatBoxPos);  	mChatBox->setSize(mChatBoxSize);  	mChessBoard->setPos(mChessBoardPos);  	mChessBoard->setSize(mChessBoardSize);	//调用各个部件的init()以完成部件的位置等设置		  	mChessBoard->init();	mChatBox->init();  	QWidget::setMaximumSize(mSize);  	QWidget::setMinimumSize(mSize);  		//以下设置个label的属性		connect( this, SIGNAL(sendmsgtoboard( Message ) ), mChessBoard, SLOT( sdisposemsg( Message ) ) );	connect( this, SIGNAL(sendmsgtochat( Message ) ), mChatBox, SLOT( sshowchat( Message ) ) );	connect( mChessBoard ,SIGNAL(sendmsgtomain (Message )), this, SLOT(sdisposemsg( Message )) );	connect( mChatBox, SIGNAL(sendmsgtomain( Message ) ), this, SLOT( sdisposemsg( Message ) ) );		 }void Main :: sdisposemsg(Message msg){	QString req=msg.mRequest;	Message mymsg;	if(!req.compare("hagreeinvite"))	{		//收到对方同意下棋的回复或者有人邀请等待中的自己叫给ChessBoard处理		sendmsgtoboard(msg);	}	else if(!req.compare("hputchess"))	{		//收到对方落子坐标叫给ChessBoard处理		sendmsgtoboard(msg);	}	else if(!req.compare("hchangeseat"))	{		//换座成功,统一重新显示棋盘画面				sendmsgtoboard(msg);	}	else if(!req.compare("hupdatedesk"))	{		//座位信息更新,叫给Chessboard		sendmsgtoboard(msg);	}	else if(!req.compare("hreplyinvite"))	{		//hall master inquiries if main agrees to play, game relevant, pass it to chessboard		sendmsgtoboard(msg);	}	else if(!req.compare("bagreeinvite"))	{		//chessboard agrees the invitation, send it to the inviter;		emit sendmsgtohall(msg);	}	else if(!req.compare("bsendinvite"))	{		//send invite to the other side;		emit sendmsgtohall(msg);	}	else if(!req.compare("bchessput"))	{		emit sendmsgtohall(msg);	}	else if(!req.compare("hmyid"))	{		emit sendmsgtoboard(msg);	}	else if(!req.compare("cchat"))	{		emit sendmsgtohall(msg);	}	else if(!req.compare("recvchat"))	{		emit sendmsgtochat(msg);	}	else 		printf("main::sdisposemsg, unknown request!\n");		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -