📄 main.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 + -