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

📄 main.cpp

📁 利用c++编写的带人工智能的跳棋程序。屏幕的中央是棋盘
💻 CPP
字号:
#include "_ChessB.h"
#include "_Gamer.h"
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#include<assert.h>
#include<iostream.h>
#define LEFT 120
#define TOP  40
#define HEIGHT 400
#define WIDTH  400
extern void draw_InitGraph();						// 配置图形环境
extern void draw_ShowBoard(_Nodes *);					// 显示棋盘
extern void draw_GamerControl(int);					// 提示游戏者下棋
extern void draw_SellectChessman(_Nodes *,int);				// 选中棋子
extern void draw_MoveChess(_Nodes *,int*,int);				// 走棋的画面 
extern void draw_Movesellect(_Nodes *,int);				// 下棋的选择框
extern void draw_ShowWin(int);						// 显示获胜
extern void draw_EndGame();						// 游戏结束画面
_Message GamerMenu();							// 开局的选单
void CreateGamers(_Gamer**,_Message);					// 创建游戏者
void ResetBoardAndGamer(_ChessBoard*,_Gamer**,_Gamer*,int&);		// 重置棋盘和游戏者
void EndGame(_Gamer **,_ChessBoard *);					// 游戏结束的处理
void main()
{
	_ChessBoard *Chessboard=new _ChessBoard(LEFT,TOP,HEIGHT,WIDTH);
													  // 生成棋盘,传给棋盘大小位置坐标
	_Gamer *gamers[2]={NULL,NULL};					// 游戏者指针初始化
	int gamerCount=0;						// 游戏者人数先置为0
	_Gamer *Nowplayer=NULL; 					// 当前游戏者(指针,通过指向不同
									// 的游戏者达到轮流下棋的控制目的)
	int NowplayerIndex=0;						// 当前的游戏者序号
	_Message msg;							// 定义一个消息变量
	draw_InitGraph();						// 初始化图形界面
	while(1) 							// 整个游戏运行的循环
	{
		msg=GamerMenu();					// 游戏选单,
		gamerCount=2;						// 全部游戏者数目
		CreateGamers(gamers,msg);				// 创建游戏者
		ResetBoardAndGamer(Chessboard,gamers,Nowplayer,NowplayerIndex);
									// 重置棋盘和游戏者
		draw_Movesellect(Chessboard->AllNodes(),60);		// 显示选择框
		Nowplayer=gamers[0];					// 把当前游戏者置为游戏者中的第一个
		while(1) 						// 一局对战的循环(轮流下棋)
		{
		while(1) // 游戏者一次操作的循环(如果操作违规,则重新开始操作)
		{
			draw_GamerControl(NowplayerIndex);		// 提示游戏者下棋的信息
			msg=Nowplayer->Input(); 			// 游戏者输入,返回消息
			switch(msg.wparam) 				// 查看消息类型
			{
				case SELLECT : 				// 选子
				if(Chessboard->JudgeSellect(Nowplayer->gamerID,	msg.lparam))
				{ 					// 当前游戏者是否有权选这个子,若是,当前游戏者得到这个子
					Nowplayer->Sellect=msg.lparam;
									// 画出选择的棋子
					draw_SellectChessman(Chessboard->AllNodes(),msg.lparam);
				}
				else msg.wparam=REINPUT; 		// 否则,重新选子
				break;
				case MOVECHESSMAN: 			// 移动
				if(Chessboard->JudgeSellect(Nowplayer->gamerID,msg.lparam))
				{ 					// 先判断游戏者是否能改变选择的棋子,若是,当前游戏者得到这个子
					Nowplayer->Sellect=msg.lparam;
					draw_SellectChessman(Chessboard->AllNodes(),msg.lparam);//画用户选择的棋子
				}
				else if(Chessboard->JudgeMove(Nowplayer->gamerID, Nowplayer->Sellect,msg.lparam))
									// 游戏者是否能移动棋子参数为:
									// 游戏者,起点,终点.
					{ 	 			// 若是,消息为下一个游戏者操纵,画图.
						Chessboard->MoveIt(Nowplayer->Sellect,msg.lparam);
						msg.wparam=NEXT;	//轮到下一游戏者走
						draw_MoveChess(Chessboard->AllNodes(),Chessboard->MoveRoad(),msg.lparam);
						cleardevice();
									// 重画棋盘
						draw_ShowBoard(Chessboard->AllNodes());
						//setcolor(YELLOW);							// 设置前景色为红色
						//circle(Nodes[msg.lparam].cood.x,Nodes[msg.lparam].cood.y,10);
					}
					else msg.wparam=REINPUT; 	// 否则,重新输入
				break;
				case MOVESELLECT:
					draw_Movesellect(Chessboard->AllNodes(),msg.lparam);
				break;
				case REGRET:
					Chessboard->back();		// 悔棋
					msg.wparam=REINPUT;
					cleardevice();
									// 重画棋盘
					draw_ShowBoard(Chessboard->AllNodes());

				break;
			default: break;
			}

			if(msg.wparam!=REINPUT&&msg.wparam!=MOVESELLECT)// 如果不是重新输入并且也不是移动选择框,则跳出输入的循环部分
			 break;
		}							// 游戏者一次操作的结束
		if(msg.wparam==NEXT)
			if(Chessboard->Decide(Nowplayer->gamerID))
			{
				msg.wparam=WIN;

			}
							// 是否游戏者胜出
			else			 			// 未胜出,则转换游戏者
			{
				Nowplayer->Sellect=-1;			// 游戏者所选的子置-1
				if(NowplayerIndex==1) 			// 如果是第二个玩家
					  {
						  Nowplayer=gamers[0];	// 变成第一个
						  NowplayerIndex=0;
					  }
				else
					  {
									// 下一个游戏者
						  NowplayerIndex++;
						  Nowplayer=gamers[NowplayerIndex];
					  }
			}
		if (msg.wparam==WIN)	break;
		if (msg.wparam==EXIT)
		{
			setcolor(RED);
			settextstyle(1,0,5);
			outtextxy(10,90,"Do you really want to quit?");
			outtextxy(10,100,"('y' or 'n')");
			char dec=getch();
			if (dec=='y'||dec=='Y')   break;
			else
			{
				msg.wparam=NEXT;
				cleardevice();
				draw_ShowBoard(Chessboard->AllNodes());
			}
		}
		if (msg.wparam==RESTART)
		{
			setcolor(YELLOW);
			settextstyle(1,0,15);
			outtextxy(10,90,"Do you really want to restart?");
			outtextxy(10,100,"('y' or 'n')");
			char dec=getch();
			if (dec=='y'||dec=='Y')		break;
			else
			{
				msg.wparam=NEXT;
				cleardevice();
				draw_ShowBoard(Chessboard->AllNodes());
			}
		}

									// 如果退出或是重新开始或是一方胜利,则退出一次游戏循环
	} 								// 一局游戏的结束

	 if(msg.wparam==WIN)						// 胜利的处理
		 {
			draw_ShowWin(NowplayerIndex);

			break;
		 }
	 else if(msg.wparam==EXIT)					// 退出的处理
		{
			  break;
		}
		  else if (msg.wparam==RESTART)
			{
				cleardevice();
			}
	}								// 整个游戏的结束
	EndGame(gamers,Chessboard);					// 游戏结束的处理
}

void EndGame(_Gamer **gamers,_ChessBoard *Chessboard)
{
	for(int i=0;i<6;i++)						// 释放游戏者的内存空间
		if(gamers[i])
			delete gamers[i];
	if(Chessboard)							// 释放棋盘
		delete Chessboard;
	draw_EndGame();							// 游戏结束画面
}
_Message GamerMenu()
{
	_Message msg;
	char a,b;
	setcolor(WHITE);
	settextstyle(0,0,1);
	outtextxy(100,100,"Welcome to our conquer chess world!");
	outtextxy(100,110,"Gamer1 is up and Gamer2 is dowm!Please sellect……");
	outtextxy(100,150,"Do you want to conrtrol Gamer1?('y' or 'n')");
	a=getche();							// 选择是否操纵游戏者1
	outtextxy(100,200,"Do you want to conrtrol Gamer2?('y' or 'n')");
	b=getche();							// 选择是否操纵游戏者2
	msg.wparam=a-89;						// 利用差值来决定是否操纵
	msg.lparam=b-89;
	return msg;
}
void CreateGamers(_Gamer** gamers,_Message msg)
{
	int i,j=0;
	for(i=0;i<2;i++) 						// 清除目前的所有游戏者
		if(gamers[i])
			delete gamers[i],gamers[i]=NULL;
	if (msg.wparam==0||msg.wparam==32)
		gamers[0]=new _Human();
	else    gamers[0]=new _Robot();
	if (msg.lparam==0||msg.wparam==32)
		gamers[1]=new _Human();
	else    gamers[1]=new _Robot();
}

void ResetBoardAndGamer(_ChessBoard *Chessboard,_Gamer **gamers,_Gamer *Nowplayer,int&NowplayerIndex)
{
	int **IDs;
	cleardevice();
	IDs=Chessboard->Reset(); 					// 棋盘的重置,预置到新开局的状态
	_Robot *tGamer;
	for(int i=0;i<2;i++)						// 为每个游戏者初始化
	{
		gamers[i]->Init(IDs[i],Chessboard->AllNodes()); 	// 游戏者预置到新开局状态
		if( gamers[i]->GamerType == 0)               		// 每个robot取得当前棋盘的信息
		{
			tGamer=(_Robot *)gamers[i];
			tGamer->GetCondition(IDs,2);
		}
	}
	Nowplayer=gamers[0]; 						// 设定当前游戏者
	NowplayerIndex=0;					 	// 当前游戏者的序号
}

⌨️ 快捷键说明

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