chess换肤问题

2024-04-07 08:38
文章标签 问题 换肤 chess

本文主要是介绍chess换肤问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

chess换肤问题:设置flag控制变量没切换一次就递增一次 依次进行换肤。


// 象棋Dlg.cpp : implementation file

//


#include "stdafx.h"
#include "象棋.h"
#include "象棋Dlg.h"
#include "PieceBlackJu.h"
#include "math.h"
#include "Change.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


static int Checkerboard[9][10]; //用于记录棋盘格子的状态
static int TemCheckerboard[9][10];
int i, j, status, selpiece;         //在Onstart函数中进行初始化,并对变量进行备注
int m, n; //用于记录选中棋子的坐标
int flag=2;
BOOL Pstatus = true , movevalue, gameover;


/
// CAboutDlg dialog used for App About


class CAboutDlg : public CDialog
{
public:
CAboutDlg();


// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA


// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
//}}AFX_VIRTUAL


// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};


CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/
// CMyDlg dialog




CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_board = new CBitmap;
m_back = new CBitmap;


m_blackma = new CBitmap;
m_blackju = new CBitmap;
m_blackxiang = new CBitmap;
m_blackshi = new CBitmap;
m_blackjiang = new CBitmap;
m_blackpao = new CBitmap;
m_blackzu = new CBitmap;


m_redma = new CBitmap;
m_redju = new CBitmap;
m_redxiang = new CBitmap;
m_redshi = new CBitmap;
m_redshuai = new CBitmap;
m_redpao = new CBitmap;
m_redzu = new CBitmap;
m_select = new CBitmap;


//下面是实现位图的画法 添加棋子
m_board->m_hObject  = (HBITMAP)::LoadImage (NULL,"./1/qipan.bmp",IMAGE_BITMAP,460,525,LR_LOADFROMFILE);
    m_blackma->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackju->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_blackxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackjiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackjiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);


m_redma->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redju->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_redxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshuai->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redshuai.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_select->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/selected.bmp",IMAGE_BITMAP,51,51,LR_LOADFROMFILE);
m_back->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/mark.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_LBUTTONDOWN() //点击窗体,响应OnLButtonDown函数
ON_BN_CLICKED(ID_START, Onstart)      //点击ID_START属性的按钮,响应Onstart函数
ON_BN_CLICKED(IDC_BUTTONC, Onchanges)  
ON_WM_SETCURSOR()
ON_BN_CLICKED(IDC_GAVEUP, DoGaveUp)
ON_BN_CLICKED(IDC_QIUHE, DoTie)
ON_BN_CLICKED(IDC_HUIQI, DoUndo)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/
// CMyDlg message handlers


BOOL CMyDlg::OnInitDialog()
{
CDialog::OnInitDialog();


// Add "About..." menu item to system menu.


// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);


CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}


// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE;  // return TRUE  unless you set the focus to a control
}


void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}


// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.


void CMyDlg::OnPaint() 
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting


SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);


// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;


// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
//以下是实现棋盘背景的画法
CDC thmem3 ;
CClientDC dc(this);
thmem3.CreateCompatibleDC(&dc);
thmem3.SelectObject(m_board);
dc.BitBlt(0,0,460,525,&thmem3,0,0,SRCCOPY); 

CDialog::OnPaint();
}
}


//点击窗体响应函数
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
int curx = int ((point.x - 5) / 51); //对点击的点整数化,与绘制位图的坐标配合,实现棋盘定格
int cury = int ((point.y - 7) / 51);
CDC thmem4 ;
CClientDC dc(this);
thmem4.CreateCompatibleDC(&dc);
if(status % 2 == 0 && Pstatus && !gameover) //黑方第一次点击响应的IF语句
{
m = curx;
n = cury;
if(Checkerboard[curx][cury] == BLACK_JU) //如果点击的是黑色的车,则选中黑色车
{
selpiece = BLACK_JU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND); //在选定的棋子上覆盖一张m_select指向的图片,带到凸显选定棋子的目的
status ++;
}
else if(Checkerboard[curx][cury] == BLACK_MA)
{
selpiece = BLACK_MA;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == BLACK_XIANG)
{
selpiece = BLACK_XIANG;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == BLACK_SHI)
{
selpiece = BLACK_SHI;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == BLACK_JIANG)
{
selpiece = BLACK_JIANG;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == BLACK_PAO)
{
selpiece = BLACK_PAO;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == BLACK_ZU)
{
selpiece = BLACK_ZU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else
{
//
}
}
if(status % 2 == 0 && !Pstatus && !gameover) //红方第一次点击响应的IF语句
{
m = curx;
n = cury;
if(Checkerboard[curx][cury] == RED_JU) //如果点击的是红色的车,则选中红色车
{
selpiece = RED_JU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == RED_MA)
{
selpiece = RED_MA;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == RED_XIANG)
{
selpiece = RED_XIANG;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == RED_SHI)
{
selpiece = RED_SHI;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == RED_SHUAI)
{
selpiece = RED_SHUAI;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == RED_PAO)
{
selpiece = RED_PAO;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
else if(Checkerboard[curx][cury] == RED_ZU)
{
selpiece = RED_ZU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
status ++;
}
}
else if(status % 2 == 1 && Pstatus && !gameover) //黑方第二次点击响应的IF语句
{
if(Checkerboard[curx][cury] >=BLACK_JU && Checkerboard[curx][cury] <= BLACK_ZU)    //如果下次点击的是己方的棋子,则改变选中的棋子
{
m = curx;
n = cury;


//当下次点击是己方棋子时,重绘棋盘,将选定棋子的凸显效果转移至下一颗选定的棋子
CDC thmem5 ;
CClientDC dc(this);
thmem5.CreateCompatibleDC(&dc);
thmem5.SelectObject(m_board);
dc.BitBlt(0,0,460,525,&thmem5,0,0,SRCCOPY);
DoDraw();
if(Checkerboard[curx][cury] == BLACK_JU)
{
selpiece = BLACK_JU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == BLACK_MA)
{
selpiece = BLACK_MA;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == BLACK_XIANG)
{
selpiece = BLACK_XIANG;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == BLACK_SHI)
{
selpiece = BLACK_SHI;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == BLACK_JIANG)
{
selpiece = BLACK_JIANG;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == BLACK_PAO)
{
selpiece = BLACK_PAO;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == BLACK_ZU)
{
selpiece = BLACK_ZU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
}
else
{
if(selpiece == BLACK_JU) //如果选中的棋子是黑色车,则调用黑色车的move方法
{
PieceBlackJu BlackJu;
BlackJu.Tseatx = curx; //将第二次点击的坐标赋值给对象将来的坐标
BlackJu.Tseaty = cury;
BlackJu.seatx = m; //将第一次点击的坐标赋值给对象现在的坐标
BlackJu.seaty = n;
movevalue = BlackJu.Move(BlackJu);
}
else if(selpiece ==  BLACK_MA )       
{
PieceBlackMa BlackMa;
BlackMa.Tseatx = curx;
BlackMa.Tseaty = cury;
BlackMa.seatx = m;
BlackMa.seaty = n;
movevalue = BlackMa.Move(BlackMa);
}
else if(selpiece ==  BLACK_XIANG )       
{
PieceBlackXiang BlackXiang;
BlackXiang.Tseatx = curx;
BlackXiang.Tseaty = cury;
BlackXiang.seatx = m;
BlackXiang.seaty = n;
movevalue = BlackXiang.Move(BlackXiang);
}
else if(selpiece ==  BLACK_SHI )       
{
PieceBlackShi BlackShi;
BlackShi.Tseatx = curx;
BlackShi.Tseaty = cury;
BlackShi.seatx = m;
BlackShi.seaty = n;
movevalue = BlackShi.Move(BlackShi);
}
else if(selpiece ==  BLACK_JIANG )       
{
PieceBlackJiang BlackJiang;
BlackJiang.Tseatx = curx;
BlackJiang.Tseaty = cury;
BlackJiang.seatx = m;
BlackJiang.seaty = n;
movevalue = BlackJiang.Move(BlackJiang);
}
else if(selpiece ==  BLACK_ZU )       
{
PieceBlackZu BlackZu;
BlackZu.Tseatx = curx;
BlackZu.Tseaty = cury;
BlackZu.seatx = m;
BlackZu.seaty = n;
movevalue = BlackZu.Move(BlackZu);
}
else if(selpiece ==  BLACK_PAO )      
{
PieceBlackPao BlackPao;
BlackPao.Tseatx = curx;
BlackPao.Tseaty = cury;
BlackPao.seatx = m;
BlackPao.seaty = n;
movevalue = BlackPao.Move(BlackPao);
}
if(movevalue) //如果move方法返回的值为true则表示是合法操作
{
ChessPiece Judge;
for(i = 0; i < 9; i++)
for(j = 0; j <10; j ++)
{
TemCheckerboard[i][j] = Checkerboard[i][j];
}
Checkerboard[curx][cury] = Checkerboard[m][n]; //落子,用以前的坐标替换掉现在的坐标
Checkerboard[m][n] = 0; //将以前所在棋盘格状态置为0
status ++;

//重绘棋盘背景,实现棋子移动
CDC thmem2 ;
CClientDC dc(this);
thmem2.CreateCompatibleDC(&dc);
thmem2.SelectObject(m_board);
dc.BitBlt(0,0,460,525,&thmem2,0,0,SRCCOPY);

DoDraw();
GetDlgItem(IDC_HUIQI)->EnableWindow(true);
Judge.Judge();
ButtonColor();
Pstatus = !Pstatus; //切换下棋方
}
else
{
//MessageBox(TEXT("不能到达这里"),"出错啦!");
}
}
}
else if(status % 2 == 1 && !Pstatus && !gameover)
{
if(Checkerboard[curx][cury] >= RED_JU && Checkerboard[curx][cury] <= RED_ZU) //如果下次点击的是己方的棋子,则改变选中的棋子
{
m = curx;
n = cury;
CDC thmem6 ;
CClientDC dc(this);
thmem6.CreateCompatibleDC(&dc);
thmem6.SelectObject(m_board);
dc.BitBlt(0,0,460,525,&thmem6,0,0,SRCCOPY);
DoDraw();
if(Checkerboard[curx][cury] == RED_JU)
{
selpiece = RED_JU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == RED_MA)
{
selpiece = RED_MA;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == RED_XIANG)
{
selpiece = RED_XIANG;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == RED_SHI)
{
selpiece = RED_SHI;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == RED_SHUAI)
{
selpiece = RED_SHUAI;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == RED_PAO)
{
selpiece = RED_PAO;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
else if(Checkerboard[curx][cury] == RED_ZU)
{
selpiece = RED_ZU;
thmem4.SelectObject(m_select);
dc.BitBlt((m * 51)+2,(n * 51)+4,51,51,&thmem4,0,0,SRCAND);
}
}
else
{
if(selpiece == RED_JU)
{
PieceRedJu RedJu;
RedJu.Tseatx = curx;
RedJu.Tseaty = cury;
RedJu.seatx = m;
RedJu.seaty = n;
movevalue = RedJu.Move(RedJu);
}
else if(selpiece == RED_MA)            //生成红象对象
{
PieceRedMa RedMa;
RedMa.Tseatx = curx;
RedMa.Tseaty = cury;
RedMa.seatx = m;
RedMa.seaty = n;
movevalue = RedMa.Move(RedMa);
}
else if(selpiece == RED_XIANG)            //生成红象对象
{
PieceRedXiang RedXiang;
RedXiang.Tseatx = curx;
RedXiang.Tseaty = cury;
RedXiang.seatx = m;
RedXiang.seaty = n;
movevalue = RedXiang.Move(RedXiang);
}
else if(selpiece == RED_SHI)            //生成红象对象
{
PieceRedShi RedShi;
RedShi.Tseatx = curx;
RedShi.Tseaty = cury;
RedShi.seatx = m;
RedShi.seaty = n;
movevalue = RedShi.Move(RedShi);
}
else if(selpiece == RED_SHUAI)            //生成红象对象
{
PieceRedShuai RedShuai;
RedShuai.Tseatx = curx;
RedShuai.Tseaty = cury;
RedShuai.seatx = m;
RedShuai.seaty = n;
movevalue = RedShuai.Move(RedShuai);
}
else if(selpiece == RED_ZU)            //生成红象对象
{
PieceRedZu RedZu;
RedZu.Tseatx = curx;
RedZu.Tseaty = cury;
RedZu.seatx = m;
RedZu.seaty = n;
movevalue = RedZu.Move(RedZu);
}
else if(selpiece == RED_PAO)            //生成红象对象
{
PieceRedPao RedPao;
RedPao.Tseatx = curx;
RedPao.Tseaty = cury;
RedPao.seatx = m;
RedPao.seaty = n;
movevalue = RedPao.Move(RedPao);
}
if(movevalue)
{
ChessPiece Judge;
for(i = 0; i < 9; i++)
for(j = 0; j <10; j ++)
{
TemCheckerboard[i][j] = Checkerboard[i][j];
}
Checkerboard[curx][cury] = Checkerboard[m][n]; //落子
Checkerboard[m][n] = 0;
status ++;

//重绘棋盘背景,实现棋子移动
CDC thmem2 ;
CClientDC dc(this);
thmem2.CreateCompatibleDC(&dc);
thmem2.SelectObject(m_board);
dc.BitBlt(0,0,460,525,&thmem2,0,0,SRCCOPY);

DoDraw();
GetDlgItem(IDC_HUIQI)->EnableWindow(true);
Judge.Judge();
ButtonColor();
Pstatus = !Pstatus;
}
else
{
//MessageBox(TEXT("不能到达这里"),"出错啦!");
}
}
}
}


//棋盘绘制函数
void CMyDlg::DoDraw()
{
CDC thmem1 ;
CClientDC dc(this);
thmem1.CreateCompatibleDC(&dc);
for(i = 0; i < 9; i ++)
for(j = 0; j < 10; j++)
{
switch(Checkerboard[i][j])
{
case BLACK_JU :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_blackju);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case BLACK_MA :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_blackma);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case BLACK_XIANG :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_blackxiang);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case BLACK_SHI :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_blackshi);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case BLACK_JIANG :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_blackjiang);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case BLACK_PAO :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_blackpao);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case BLACK_ZU :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_blackzu);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case RED_JU :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_redju);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case RED_MA :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_redma);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case RED_XIANG :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_redxiang);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case RED_SHI :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_redshi);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case RED_SHUAI :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_redshuai);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case RED_PAO :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_redpao);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
case RED_ZU :
thmem1.SelectObject (m_back);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,MERGEPAINT);
thmem1.SelectObject(m_redzu);
dc.BitBlt((i * 51)+5,(j * 51)+7,45,45,&thmem1,0,0,SRCAND);
break;
default :
break;
}
}
}


HCURSOR CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}


//换肤
void CMyDlg::Onchanges()  //开始按钮
{     
if(flag==1)
{

//下面是实现位图的画法 添加棋子
m_board->m_hObject  = (HBITMAP)::LoadImage (NULL,"./1/qipan.bmp",IMAGE_BITMAP,460,525,LR_LOADFROMFILE);
    m_blackma->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackju->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_blackxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackjiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/blackjiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);


m_redma->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redju->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_redxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshuai->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/redshuai.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_select->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/selected.bmp",IMAGE_BITMAP,51,51,LR_LOADFROMFILE);
m_back->m_hObject = (HBITMAP)::LoadImage (NULL,"./1/mark.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Onstart();
flag++;
}
else if(flag==2)
{
//下面是实现位图的画法 添加棋子
m_board->m_hObject  = (HBITMAP)::LoadImage (NULL,"./2/qipan.bmp",IMAGE_BITMAP,460,525,LR_LOADFROMFILE);
    m_blackma->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/blackma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackju->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/blackju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_blackxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/blackxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/blackshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/blackpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/blackzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackjiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/blackjiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);


m_redma->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/redma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redju->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/redju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_redxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/redxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/redshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/redpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/redzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshuai->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/redshuai.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_select->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/selected.bmp",IMAGE_BITMAP,51,51,LR_LOADFROMFILE);
m_back->m_hObject = (HBITMAP)::LoadImage (NULL,"./2/mark.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Onstart();
flag++;
}
   else if(flag==3)
   {
    //下面是实现位图的画法 添加棋子
m_board->m_hObject  = (HBITMAP)::LoadImage (NULL,"./3/qipan.bmp",IMAGE_BITMAP,460,525,LR_LOADFROMFILE);
    m_blackma->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/blackma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackju->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/blackju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_blackxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/blackxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/blackshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/blackpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/blackzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_blackjiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/blackjiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);


m_redma->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/redma.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redju->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/redju.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
    m_redxiang->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/redxiang.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshi->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/redshi.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redpao->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/redpao.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redzu->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/redzu.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_redshuai->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/redshuai.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_select->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/selected.bmp",IMAGE_BITMAP,51,51,LR_LOADFROMFILE);
m_back->m_hObject = (HBITMAP)::LoadImage (NULL,"./3/mark.bmp",IMAGE_BITMAP,45,45,LR_LOADFROMFILE);
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Onstart();
   flag=1;
   }
}
//点击开始响应的函数
void CMyDlg::Onstart()  //开始按钮
{
//flag++;
//重绘棋盘背景,实现棋子移动
CDC thmem2 ;
CClientDC dc(this);
thmem2.CreateCompatibleDC(&dc);
thmem2.SelectObject(m_board);
dc.BitBlt(0,0,460,525,&thmem2,0,0,SRCCOPY);
// 棋盘数组初始化 
for(j = 0; j < 10; j ++)
for(i = 0; i < 9; i ++)
{
if(j == 0) //初始化第0行棋盘
{
if(i < 5)
{
Checkerboard[i][j] = i + 1; //依次跟车马象所在棋格赋值为123
}
else
{
Checkerboard[i][j] = 9 - i; //依次跟将士象所在棋格赋值为543
}
}
else if(j == 2)
{
if(i == 1 || i == 7)
{
Checkerboard[i][j] = 6;
}
else
{
Checkerboard[i][j] = 0; //为第2行其他非跑所在棋格赋值为0
}
}
else if(j == 3)
{
if(i % 2 == 0)
{
Checkerboard[i][j] = 7; //为卒所在棋格赋值为7
}
else
{
Checkerboard[i][j] = 0;
}
}
else if(j == 6)
{
if(i % 2 == 0)
{
Checkerboard[i][j] = 14;
}
else
{
Checkerboard[i][j] = 0;
}
}
else if(j == 7)
{
if(i == 1 || i == 7)
{
Checkerboard[i][j] = 13;
}
else
{
Checkerboard[i][j] = 0;
}
}
else if(j == 9)
{
if(i < 5)
{
Checkerboard[i][j] = i + 8;
}
else
{
Checkerboard[i][j] = 16 - i;
}
}
else
{
Checkerboard[i][j] = 0;
}
}
status = 0; //用于区分第一次点击和第二次点击的变量
selpiece = 0; //用于记录点击选中的棋子的变量
Pstatus = false; //用于切换下棋方得变量
movevalue = false; //用于储存move方法返回的值
gameover = false; //用于判断游戏是否结束
GetDlgItem(IDC_RENSHU)->EnableWindow(true);
GetDlgItem(IDC_QIUHE)->EnableWindow(true);
GetDlgItem(IDC_HUIQI)->EnableWindow(true);
DoDraw();
}


 BOOL PieceBlackJu::Move(PieceBlackJu &BlackJu)
 {
int i, j;
int min, max;
if(BlackJu.seatx == BlackJu.Tseatx && BlackJu.seaty != BlackJu.Tseaty)
{
min = min(BlackJu.seaty,BlackJu.Tseaty);
max = max(BlackJu.seaty,BlackJu.Tseaty);
i = BlackJu.seatx;
for(j = min +1; j <= max; j ++)
{
if(j == max) //循环执行到最后,则表明中间没子
{
return true;
break;
}
  else if(Checkerboard[i][j] == 0)//路径上无棋子的情况
  {
continue;
  }
else //路径上有棋子的情况
{
return false;
break;
}
}
}
else if(BlackJu.seaty == BlackJu.Tseaty && BlackJu.seatx != BlackJu.Tseatx)
{
min = min(BlackJu.seatx,BlackJu.Tseatx);
max = max(BlackJu.seatx,BlackJu.Tseatx);
j = BlackJu.seaty;
for(i = min +1; i <= max; i ++)
{
if(i == max) //循环执行到最后,则返回最后一点的值
{
return true;
break;
}
  else if(Checkerboard[i][j] == 0)//路径上无棋子的情况
  {
  continue;
  }
else //路径上有棋子的情况
{
return false;
break;
}
}
}
else
{
return false;
}
 }


BOOL PieceRedJu::Move(PieceRedJu &RedJu)
 {
int i, j;
int min, max;
if(RedJu.seatx == RedJu.Tseatx && RedJu.seaty != RedJu.Tseaty)
{
min = min(RedJu.seaty,RedJu.Tseaty);
max = max(RedJu.seaty,RedJu.Tseaty);
i = RedJu.seatx;
for(j = min +1; j <= max; j ++)
{
if(j == max) //循环执行到最后,则表明中间无子
{
return true;
break;
}
  else if(Checkerboard[i][j] == 0)//路径上无棋子的情况
  {
  continue;
  }
else //路径上有棋子的情况
{
return false;
break;
}
}
}
else if(RedJu.seaty == RedJu.Tseaty && RedJu.seatx != RedJu.Tseatx)
{
min = min(RedJu.seatx,RedJu.Tseatx);
max = max(RedJu.seatx,RedJu.Tseatx);
j = RedJu.seaty;
for(i = min +1; i <= max; i ++)
{
if(i == max) //循环执行到最后,则返回最后一点的值
{
return true;
break;
}
  else if(Checkerboard[i][j] == 0)//路径上无棋子的情况
  {
  continue;
  }
else //路径上有棋子的情况
{
return false;
break;
}
}
}
else
{
return false;
}
 }




//红马的move()函数
 BOOL PieceRedMa::Move(PieceRedMa &RedMa)
 {
//(x,y)表示原来马的坐标;(Tx,Ty)表示马可能走的坐标
int x = RedMa.seatx;
int tx = RedMa.Tseatx;
int y = RedMa.seaty;
int ty = RedMa.Tseaty;


if(Checkerboard[tx][ty] >= 0 && Checkerboard[tx][ty] <= 7)//当(tx,ty)为空(用0表示)或黑子(1~7表示)时,可下
{
if(Checkerboard[x +1 ][y] == 0 && tx ==x + 2 && ty == y + 1)//(x+1,y)为空,(tx,ty)=(x+2,y+1)
{
return true;
/*个人观点:用如下代码代替上一句return语句,然后直接初始化棋盘或许可以实现棋盘重绘。
Checkerboard[tx][ty]==BLACK_MA;
Checkerboard[x][y]==0;
*/
}
else if(Checkerboard[x + 1][y] == 0 && tx == x + 2 && ty == y - 1)//(x+1,y)为空:表示不蹩马脚;(tx,ty)=(x+2,y-1):马走斜日
{
return true;
}
else if(Checkerboard[x - 1][y] == 0 && tx == x - 2 && ty == y + 1)//(x-1,y)为空,(tx,ty)=(x-2,y+1)
{
return true;
}
else if(Checkerboard[x - 1][y] == 0 && tx == x-2 && ty == y - 1)//(x-1,y)为空,(tx,ty)=(x-2,y-1)
{
return true;
}
else if(Checkerboard[x][y + 1] == 0 && tx == x + 1 && ty == y + 2)//(x,y+1)为空,(tx,ty)=(x+1,y+2)
{
return true;
}
else if(Checkerboard[x][y + 1] == 0 && tx == x - 1 && ty == y + 2)//(x,y+1)为空,(tx,ty)=(x-1,y+2)
{
return true;
}


else if(Checkerboard[x][y - 1] == 0 && tx == x + 1 && ty == y - 2)//(x,y-1)为空,(tx,ty)=(x+1,y-2)
{
return true;
}
else if(Checkerboard[x][y - 1] == 0 && tx == x - 1 && ty == y - 2)//(x,y-1)为空,(tx,ty)=(x-1,y-2)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
 }


 BOOL PieceBlackMa::Move(PieceBlackMa &BlackMa)
 {
//(x,y)表示原来黑马的坐标;(Tx,Ty)表示黑马可能走的坐标
int x = BlackMa.seatx;
int tx = BlackMa.Tseatx;
int y = BlackMa.seaty;
int ty = BlackMa.Tseaty;


if(Checkerboard[tx][ty] == 0 || (Checkerboard[tx][ty] >= 8 && Checkerboard[tx][ty] <= 14))
{
if(Checkerboard[x + 1][y] == 0 && tx == x + 2 && ty == y + 1)//(x+1,y)为空:表示不蹩马脚;(tx,ty)=(x+2,y-1):马走斜日
{
return true;
/*个人观点:用如下代码代替上一句return语句,然后直接初始化棋盘或许可以实现棋盘重绘。
Checkerboard[tx][ty]==BLACK_MA;
Checkerboard[x][y]==0;
*/
}
else if(Checkerboard[x + 1][y] == 0 && tx == x + 2 && ty == y - 1)//(x+1,y)为空,(tx,ty)=(x+2,y-1)
{
return true;
}
else if(Checkerboard[x - 1][y] == 0 && tx == x - 2 && ty == y + 1)//(x-1,y)为空,(tx,ty)=(x-2,y+1)
{
return true;
}
else if(Checkerboard[x - 1][y] == 0 && tx == x - 2 && ty == y - 1)//(x-1,y)为空,(tx,ty)=(x-2,y-1)
{
return true;
}
else if(Checkerboard[x][y + 1] == 0 && tx == x + 1 && ty == y + 2)//(x,y+1)为空,(tx,ty)=(x+1,y+2)
{
return true;
}
else if(Checkerboard[x][y + 1] == 0 && tx == x - 1 && ty == y + 2)//(x,y+1)为空,(tx,ty)=(x-1,y+2)
{
return true;
}


else if(Checkerboard[x][y - 1] == 0 && tx == x + 1 && ty == y - 2)//(x,y-1)为空,(tx,ty)=(x+1,y-2)
{
return true;
}
else if(Checkerboard[x][y - 1] == 0 && tx == x - 1 && ty == y - 2)//(x,y-1)为空,(tx,ty)=(x-1,y-2)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
 }


BOOL PieceBlackXiang::Move(PieceBlackXiang &BlackXiang)
{
  if(BlackXiang.Tseaty <= 4)                                //是否越界判断
  {


if((BlackXiang.Tseatx - BlackXiang.seatx) == 2 && (BlackXiang.Tseaty - BlackXiang.seaty) == 2)//坐标都增加的情况
{
if(Checkerboard[BlackXiang.seatx + 1][BlackXiang.seaty + 1] == 0)
{
return true;
}
else
{
return false;
}
}
else if((BlackXiang.Tseatx - BlackXiang.seatx) == 2 && (BlackXiang.Tseaty-BlackXiang.seaty) == -2)
{
if(Checkerboard[BlackXiang.seatx + 1][BlackXiang.seaty - 1] == 0)
{
return true;
}
else
{
return false;
}
}
else if((BlackXiang.Tseatx - BlackXiang.seatx) == -2 && (BlackXiang.Tseaty - BlackXiang.seaty) == 2)
{


if(Checkerboard[BlackXiang.seatx - 1][BlackXiang.seaty + 1] == 0)
{
return true;
}
else
{
return false;
}
}
else if((BlackXiang.Tseatx - BlackXiang.seatx) == -2 && (BlackXiang.Tseaty-BlackXiang.seaty) == -2)
{


if(Checkerboard[BlackXiang.seatx - 1][BlackXiang.seaty - 1] == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
  }
  else
  {
 return false;
  }
}


BOOL PieceRedXiang::Move(PieceRedXiang &RedXiang)
{
  if(RedXiang.Tseaty >= 5)                                //是否越界判断
  {


if((RedXiang.Tseatx-RedXiang.seatx) == 2 && (RedXiang.Tseaty-RedXiang.seaty) == 2)//坐标都增加的情况
{
if(Checkerboard[RedXiang.seatx + 1][RedXiang.seaty + 1] == 0)
{
return true;
}
else
{
return false;
}
}
else if((RedXiang.Tseatx - RedXiang.seatx) == 2 && (RedXiang.Tseaty-RedXiang.seaty) == -2)
{
if(Checkerboard[RedXiang.seatx + 1][RedXiang.seaty-1] == 0)
{
return true;
}
else
{
return false;
}
}
else if((RedXiang.Tseatx - RedXiang.seatx) == -2 && (RedXiang.Tseaty - RedXiang.seaty) == 2)
{


if(Checkerboard[RedXiang.seatx - 1][RedXiang.seaty+1] == 0)
{
return true;
}
else
{
return false;
}
}
else if((RedXiang.Tseatx - RedXiang.seatx) == -2 && (RedXiang.Tseaty - RedXiang.seaty) == -2)
{


if(Checkerboard[RedXiang.seatx - 1][RedXiang.seaty-1] == 0)
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
  }
  else
  {
 return false;
  }
}


//士的move方法
BOOL PieceRedShi::Move(PieceRedShi &RedShi)
{
if((abs(RedShi.seatx - RedShi.Tseatx) == 1) && (abs(RedShi.seaty - RedShi.Tseaty) == 1) && (RedShi.Tseatx >=3 && RedShi.Tseatx <=5 && RedShi.Tseaty >=7 && RedShi.Tseaty <= 9))
return true;
else
return false;
}
BOOL PieceBlackShi::Move(PieceBlackShi &BlackShi)

if((abs(BlackShi.seatx-BlackShi.Tseatx) ==1 ) && (abs(BlackShi.seaty - BlackShi.Tseaty) == 1) && (BlackShi.Tseatx >=3 && BlackShi.Tseatx <= 5 && BlackShi.Tseaty >= 0 && BlackShi.Tseaty <= 2)) 
return true;
else
return false;
}


//将的move方法
BOOL PieceRedShuai::Move(PieceRedShuai &RedShuai)
{
if((RedShuai.Tseatx==RedShuai.seatx) && (Checkerboard[RedShuai.Tseatx][RedShuai.Tseaty] == BLACK_JIANG ) ) 
{
 
  for(int i=RedShuai.seaty-1; i > RedShuai.Tseaty; i-- )
{
                  if( Checkerboard[RedShuai.Tseatx][i]!=0 )//中间有子
  {
  return false;
  break;
  }
 else if(i==(RedShuai.Tseaty+1))           //中间无子
  {
                        return true;
  }
}


}
   else if(RedShuai.Tseatx >= 3 && RedShuai.Tseatx <= 5 && RedShuai.Tseaty >= 7 && RedShuai.Tseaty <= 9)
{
if((abs(RedShuai.Tseatx - RedShuai.seatx) == 1 && (RedShuai.Tseaty == RedShuai.seaty)) || (abs(RedShuai.Tseaty - RedShuai.seaty) == 1) && (RedShuai.Tseatx == RedShuai.seatx))
{
return true;
}
else
{
return false;
}
}
else 
{
return false;
}
}
BOOL PieceBlackJiang::Move(PieceBlackJiang &BlackJiang)
{
//老头子见面
    if((BlackJiang.Tseatx == BlackJiang.seatx) && (Checkerboard[BlackJiang.Tseatx][BlackJiang.Tseaty] == RED_SHUAI ) ) 
{
 
  for(int i = BlackJiang.seaty+1; i < BlackJiang.Tseaty; i ++ )
{
                  if(Checkerboard[BlackJiang.Tseatx][i] != 0 )//中间有子
  {
  return false;
  break;
  }
 else if(i == (BlackJiang.Tseaty-1))           //中间无子
  {
                        return true;
  }
  }
}
else if(BlackJiang.Tseatx >= 3 && BlackJiang.Tseatx <= 5 && BlackJiang.Tseaty >= 0 && BlackJiang.Tseaty <= 2)
{
if((abs(BlackJiang.Tseatx - BlackJiang.seatx) == 1 && (BlackJiang.Tseaty == BlackJiang.seaty)) || (abs(BlackJiang.Tseaty - BlackJiang.seaty) == 1) && (BlackJiang.Tseatx == BlackJiang.seatx))
{
return true;
}
else
{
return false;
}
}
else 
{
return false;
}
}




//卒的move方法
 BOOL PieceBlackZu::Move(PieceBlackZu &BlackZu)
{
if(BlackZu.Tseatx == BlackZu.seatx && BlackZu.Tseaty - BlackZu.seaty == 1)         //向前一步
{
   return true;
}
else if(BlackZu.Tseaty == BlackZu.seaty && abs(BlackZu.Tseatx - BlackZu.seatx) == 1)         //左右一步
{
   if(BlackZu.seaty >= 5 && BlackZu.seaty <= 9)           //过河
{
   return true;
}
else                             //没过河
{
   return false;
}
}
else                                 //既不是向前一步,也不是左右一步
{
   return false;
}
}


BOOL PieceRedZu::Move(PieceRedZu &RedZu)
{
if(RedZu.Tseatx == RedZu.seatx && RedZu.seaty - RedZu.Tseaty == 1)         //向前一步
{
   return true;
}
else if(RedZu.seaty == RedZu.Tseaty && abs(RedZu.seatx - RedZu.Tseatx) == 1)         //左右一步
{
   if(RedZu.seaty <= 4 && RedZu.seaty >= 0)             //过河
{
   return true;
}
else                             //没过河
{
   return false;
}
}
else                                 //既不是向前一步,也不是左右一步
{
   return false;
}
}


//炮的move方法
BOOL PieceBlackPao::Move(PieceBlackPao &BlackPao)
{
    int a,b;
int min,max,flag;
if(BlackPao.seatx == BlackPao.Tseatx && BlackPao.seaty != BlackPao.Tseaty)           //上下移动
{
   min = min(BlackPao.seaty , BlackPao.Tseaty);
max = max(BlackPao.seaty , BlackPao.Tseaty);
a = BlackPao.Tseatx;
flag = 0;
for(b = min + 1; b < max; b++)
   {
   if(Checkerboard[a][b] == 0)
{
   continue;
}
else
{
   flag++;
}
   }
}
else if(BlackPao.seatx != BlackPao.Tseatx && BlackPao.seaty == BlackPao.Tseaty)           //左右移动
{
   min = min(BlackPao.seatx , BlackPao.Tseatx);
max = max(BlackPao.seatx , BlackPao.Tseatx);
b = BlackPao.Tseaty;
flag = 0;
for(a = min + 1; a < max; a++)
   {
   if(Checkerboard[a][b] == 0)
{
   continue;
}
else
{
   flag++;
}
   }
}
else           //斜向移动
{
   return false;
}


a = BlackPao.Tseatx;
b = BlackPao.Tseaty;


if(flag == 1)           //中途有且只有一个棋子
{
   if(Checkerboard[a][b] != 0)           //新地址有对方的红色棋子
{
   return true;
}
else           //新地址没有棋子
{
   return false;
}
}
else           //中途没有棋子或不止一个棋子
{
   if(Checkerboard[a][b] != 0)           //新地址有棋子
{
   return false;
}
else           //新地址没有棋子
{
if(flag == 0)
{
  return true;
}
else
{
return false;
}
}
}
}


BOOL PieceRedPao::Move(PieceRedPao &RedPao)
{
    int a, b;
int min, max, flag;
if(RedPao.seatx == RedPao.Tseatx && RedPao.seaty != RedPao.Tseaty)           //上下移动
{
   min = min(RedPao.seaty, RedPao.Tseaty);
max = max(RedPao.seaty, RedPao.Tseaty);
a = RedPao.Tseatx;
flag = 0;
for(b = min + 1; b < max; b++)
   {
   if(Checkerboard[a][b] == 0)
{
   continue;
}
else
{
   flag++;
}
   }
}
else if(RedPao.seatx != RedPao.Tseatx && RedPao.seaty == RedPao.Tseaty)           //左右移动
{
   min = min(RedPao.seatx , RedPao.Tseatx);
max = max(RedPao.seatx , RedPao.Tseatx);
b = RedPao.Tseaty;
flag = 0;
for(a = min + 1; a < max; a++)
   {
   if(Checkerboard[a][b] == 0)
{
   continue;
}
else
{
   flag++;
}
   }
}
else           //斜向移动
{
   return false;
}


a = RedPao.Tseatx;
b = RedPao.Tseaty;


if(flag == 1)           //中途有且只有一个棋子
{
   if(Checkerboard[a][b] != 0)           //新地址有对方的黑色棋子
{
   return true;
}
else           //新地址没有棋子
{
   return false;
}
}
else           //中途没有棋子或不止一个棋子
{
   if(Checkerboard[a][b] != 0)           //新地址有棋子
{
   return false;
}
else           //新地址没有棋子
{
if(flag == 0)
{
  return true;
}
else
{
return false;
}
}
}
}


void ChessPiece::Judge()
{
int numjiang = 0, numshuai = 0;
for(i = 3; i <= 5; i++)
{
for(j = 0; j <= 2; j++) //扫描将所在区域
{
if(Checkerboard[i][j] == BLACK_JIANG)
{
numjiang ++;
break;
}
else if(Checkerboard[i][j] == RED_SHUAI)
{
numshuai ++;
break;
}
else
{
continue;
}
}
for(j = 7; j <= 9; j++) //扫描帅所在区域
{
if(Checkerboard[i][j] == 12)
{
numshuai ++;
break;
}
else if(Checkerboard[i][j] == 5)
{
numjiang ++;
break;
}
else
{
continue;
}
}
}
if(numjiang == 0) //如果将所在区域没有将的属性,则红方胜
{
MessageBox(TEXT("红方胜!"),"胜负已分");
gameover = true;
}
else if(numshuai == 0) //如果帅所在区域没有帅的属性,则黑方胜
{
MessageBox(TEXT("黑方胜!"),"胜负已分");
gameover = true;
}
else
{
//return true;
}
}


void CMyDlg::DoGaveUp()
{
if(Pstatus)
{
MessageBox(TEXT("黑方认输!"),"投降啦!");
gameover = true;
}
else
{
MessageBox(TEXT("红方认输!"),"投降啦!");
gameover = true;
}
ButtonColor();
}  


void CMyDlg::DoTie()
{
if(IDYES == AfxMessageBox("对方请求和棋,是否同意?",MB_YESNO))
  {
MessageBox(TEXT("双方和棋!"),"结果");
gameover = true;
GetDlgItem(ID_START)->EnableWindow(true);
// GetDlgItem(IDC_BUTTONC)->EnableWindow(true);

  }
else
{
MessageBox(TEXT("对方不同意和棋!"),"结果");
}
ButtonColor();
}


void CMyDlg::DoUndo()
{
if(IDYES == AfxMessageBox("对方请求悔棋,是否同意?",MB_YESNO))
{
for(i = 0; i < 9; i++)
for(j = 0; j <10; j ++)
{
Checkerboard[i][j] = TemCheckerboard[i][j];
}
CDC thmem7 ;
CClientDC dc(this);
thmem7.CreateCompatibleDC(&dc);
thmem7.SelectObject(m_board);
dc.BitBlt(0,0,460,525,&thmem7,0,0,SRCCOPY);
DoDraw();
GetDlgItem(IDC_HUIQI)->EnableWindow(false);
Pstatus = !Pstatus;
}
else
{
MessageBox(TEXT("对方不同意悔棋!"),"结果");
}
}


void CMyDlg::ButtonColor()
{
if(gameover)
{
GetDlgItem(IDC_RENSHU)->EnableWindow(false);
GetDlgItem(IDC_HUIQI)->EnableWindow(false);
GetDlgItem(IDC_QIUHE)->EnableWindow(false);
}
}




void CMyDlg::OnOK() 
{
// TODO: Add extra validation here

exit(0);
}


void CMyDlg::OnButton1() 
{
// TODO: Add your control notification handler code here

CDialog::OnCancel();
    CChange changedlg;
changedlg.DoModal();


}

这篇关于chess换肤问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882130

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte