#include "pch.h"
#include "ConnectFour.h"
#include "ChessFourBoardCanvas.h"
#include "SlotScriptCoreLoader.h"
#define ID_BUTTON_UNDO 0x0001
#define ID_BUTTON_RESET 0x0002
#define ID_BUTTON_SCRIPT 0x0003
using namespace SlotScript;
BOOL WINAPI script_call_WriteMessage(ISlotScriptHost* lpSender, const IObjectBase* lpLocalArray, TVariantData& Result)
{
CStringA str;
CChessFourBoardCanvas* lpChessBoard = (CChessFourBoardCanvas*)lpSender;
if (lpLocalArray->GetCount() == 1)
{
TVariantData varMessage = lpLocalArray->GetVariantValue(0);
if (varMessage.dwClassID >= SLOTSCRIPT_CLASSID_OBJECT)
{
str += varMessage.Value.lpObject->GetString();
str += "\r\n";
}
}
else if (lpLocalArray->GetCount() == 2)
{
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
str.AppendFormat("%d", lpChessBoard->m_ChessCells[j][i]);
}
str += "\r\n";
}
TVariantData varMessage = lpLocalArray->GetVariantValue(0);
if (varMessage.dwClassID >= SLOTSCRIPT_CLASSID_OBJECT)
{
str += varMessage.Value.lpObject->GetString();
str += "\r\n";
str += "\r\n";
}
}
return TRUE;
}
CStringArray arrayLogs;
BOOL WINAPI script_call_ShowMessage(ISlotScriptHost* lpSender, const IObjectBase* lpLocalArray, TVariantData& Result)
{
if (lpLocalArray->GetCount() == 1)
{
TVariantData varMessage = lpLocalArray->GetVariantValue(0);
if (varMessage.dwClassID >= SLOTSCRIPT_CLASSID_OBJECT)
{
arrayLogs.Add(varMessage.Value.lpObject->GetString());
return TRUE;
}
}
else if (lpLocalArray->GetCount() == 2)
{
TVariantData varCol = lpLocalArray->GetVariantValue(0);
TVariantData varMessage = lpLocalArray->GetVariantValue(1);
if (varCol.dwClassID == SLOTSCRIPT_CLASSID_INT64 && varMessage.dwClassID >= SLOTSCRIPT_CLASSID_OBJECT)
{
CString strTabs;
for (int i = 0; i < varCol.Value.lValue; i++)
{
strTabs += _T(" ");
}
arrayLogs.Add(strTabs + varMessage.Value.lpObject->GetString());
return TRUE;
}
}
return FALSE;
}
//虚拟下棋
BOOL WINAPI CChessFourBoardCanvas::call_ChessBoard_PlayTries(ISlotScriptHost* lpSender, const IObjectBase* lpLocalArray, TVariantData& Result)
{
CChessFourBoardCanvas* lpChessBoard = (CChessFourBoardCanvas*)lpSender;
if (lpLocalArray->GetCount() == 3)
{
TVariantData varCol = lpLocalArray->GetVariantValue(0);
TVariantData varStep = lpLocalArray->GetVariantValue(1);
TVariantData varValue = lpLocalArray->GetVariantValue(2);
if (varCol.dwClassID == SLOTSCRIPT_CLASSID_INT64 && varStep.dwClassID == SLOTSCRIPT_CLASSID_INT64 && varValue.dwClassID >= SLOTSCRIPT_CLASSID_OBJECT)
{
if (varCol.Value.lValue >= 0 && varCol.Value.lValue < 7 && varStep.Value.lValue < 120)
{
const CString strValue = varValue.Value.lpObject->GetString();
Result = CreateVariantData(lpChessBoard->PlayTries(varCol.Value.lValue, varStep.Value.lValue * 2 + (strValue == _T("人") ? 3 : 4)));
return TRUE;
}
}
}
return FALSE;
}
//清除虚拟下棋
BOOL WINAPI CChessFourBoardCanvas::call_ChessBoard_ClearTries(ISlotScriptHost* lpSender, const IObjectBase* lpLocalArray, TVariantData& Result)
{
CChessFourBoardCanvas* lpChessBoard = (CChessFourBoardCanvas*)lpSender;
if (lpLocalArray->GetCount() == 2)
{
TVariantData varStep = lpLocalArray->GetVariantValue(0);
TVariantData varValue = lpLocalArray->GetVariantValue(1);
if (varStep.dwClassID == SLOTSCRIPT_CLASSID_INT64 && varValue.dwClassID >= SLOTSCRIPT_CLASSID_OBJECT)
{
if (varStep.Value.lValue < 100)
{
const CString strValue = varValue.Value.lpObject->GetString();
lpChessBoard->ClearTries(varStep.Value.lValue * 2 + (strValue == _T("人") ? 3 : 4));
return TRUE;
}
}
}
return FALSE;
}
//读棋子
BOOL WINAPI CChessFourBoardCanvas::call_ChessBoard_Cell(ISlotScriptHost* lpSender, const IObjectBase* lpLocalArray, TVariantData& Result)
{
if (lpLocalArray->GetCount() == 2)
{
TVariantData ValueCol = lpLocalArray->GetVariantValue(0);
TVariantData ValueRow = lpLocalArray->GetVariantValue(1);
if (ValueRow.dwClassID == SLOTSCRIPT_CLASSID_INT64 && ValueCol.dwClassID == SLOTSCRIPT_CLASSID_INT64)
{
if ((ValueRow.Value.lValue >= 0 && ValueRow.Value.lValue) < 6 &&
(ValueCol.Value.lValue >= 0 && ValueCol.Value.lValue < 7))
{
CChessFourBoardCanvas* lpChessBoard = (CChessFourBoardCanvas*)lpSender;
BYTE Value = lpChessBoard->m_ChessCells[ValueCol.Value.lValue][ValueRow.Value.lValue];
Result = ::CreateString(Value == 0 ? _T("空") : ((Value % 2) == 1 ? _T("人") : _T("机")));
return TRUE;
}
Result = ::CreateString(_T("错"));
return TRUE;
}
}
return FALSE;
}
inline BOOL isChessCentre(const CPoint& ptCentre, float fRadius, int x, int y)
{
return (x - ptCentre.x) * (x - ptCentre.x) + (y - ptCentre.y) * (y - ptCentre.y) < fRadius * fRadius;
}
void CopyRectCover(Gdiplus::Bitmap* lpSrc, Gdiplus::Bitmap* lpDest, int x0, int y0, int x1, int y1, int nWidth, int nHeight)
{
for (int y = 0; y < nHeight; y++)
{
for (int x = 0; x < nWidth; x++)
{
Gdiplus::Color color;
lpSrc->GetPixel(x0 + x, y0 + y, &color);
lpDest->SetPixel(x1 + x, y1 + y, color);
}
}
}
void CopyRectAlpha(Gdiplus::Bitmap* lpSrc, Gdiplus::Bitmap* lpDest, int x0, int y0, int x1, int y1, int nWidth, int nHeight)
{
for (int y = 0; y < nHeight; y++)
{
for (int x = 0; x < nWidth; x++)
{
Gdiplus::Color color;
lpSrc->GetPixel(x0 + x, y0 + y, &color);
if (min(color.GetR(), min(color.GetG(), color.GetB())) < 0xFF)
{
lpDest->SetPixel(x1 + x, y1 + y, color);
}
}
}
}
const int ButtonWidth = 70;
const int ButtonHeight = 26;
CChessFourBoardCanvas::CChessFourBoardCanvas(CSlotScriptHost* lpSlotScriptHost, IHost* lpHost, LPCTSTR lpszDataPath)
:CChessBoardCanvas(lpSlotScriptHost, lpHost, lpszDataPath), m_lpBitmapRed(NULL), m_lpBitmapBlue(NULL), m_isRed(FALSE),
m_btnUndo(ID_BUTTON_UNDO, 520, 500, ButtonWidth, ButtonHeight, _T("悔 棋")),
m_btnReset(ID_BUTTON_RESET, 520 + ButtonWidth + 10, 500, ButtonWidth, ButtonHeight, _T("重下一局")),
m_btnScript(ID_BUTTON_SCRIPT, 520 + (ButtonWidth + 10) * 2, 500, ButtonWidth, ButtonHeight, _T("对弈算法"))
{
srand(time(NULL));
m_lpImageResourceBoard = new CImageResource(NULL, CHESSFOUR_BOARD);
m_lpImageResourceChess = new CImageResource(NULL, CHESSFOUR_CHESS);
m_nButtonCount = 0;
m_lpButtons[m_nButtonCount++] = &m_btnUndo;
m_lpButtons[m_nButtonCount++] = &m_btnReset;
m_lpButtons[m_nButtonCount++] = &m_btnScript;
this->AddMethodProcess(_T("棋子"), _T("cell"), call_ChessBoard_Cell);
this->AddMethodProcess(_T("虚拟下子"), _T("PlayTries"), call_ChessBoard_PlayTries);
this->AddMethodProcess(_T("清除虚拟下子"), _T("ClearTries"), call_ChessBoard_ClearTries);
this->AddMethodProcess(_T("写日志"), _T("writemessage"), script_call_WriteMessage);
this->AddMethodProcess(_T("显示日志"), _T("showmessage"), script_call_ShowMessage);
CPoint ChessCentres[8][8] = {
{CPoint(178, 120), CPoint(252, 120), CPoint(329, 120), CPoint(400, 120), CPoint(477, 120), CPoint(553, 120), CPoint(629, 120), CPoint(-99, -99)},
{CPoint(178, 182), CPoint(252, 182), CPoint(329, 182), CPoint(400, 182), CPoint(476, 182), CPoint(552, 182), CPoint(626, 182), CPoint(-99, -99)},
{CPoint(179, 245), CPoint(253, 245), CPoint(327, 245), CPoint(400, 245), CPoint(475, 245), CPoint(550, 245), CPoint(625, 245), CPoint(-99, -99)},
{CPoint(179, 308), CPoint(253, 308), CPoint(329, 308), CPoint(400, 308), CPoint(474, 308), CPoint(550, 308), CPoint(625, 308), CPoint(-99, -99)},
{CPoint(180, 369), CPoint(256, 369), CPoint(330, 369), CPoint(400, 369), CPoint(473, 369), CPoint(549, 369), CPoint(624, 369), CPoint(-99, -99)},
{CPoint(178, 432), CPoint(253, 431), CPoint(332, 430), CPoint(401, 430), CPoint(472, 430), CPoint(550, 432), CPoint(625, 431), CPoint(-99, -99)},
没有合适的资源?快使用搜索试试~ 我知道了~
VC写的人机对战的四子棋(对弈算法用中文脚本语言)
共45个文件
h:21个
cpp:7个
jpg:4个
需积分: 0 0 下载量 169 浏览量
2024-03-16
14:51:55
上传
评论
收藏 6.48MB ZIP 举报
温馨提示
中文脚本语言(SlotScript)写的四子棋对弈算法代码,VC+MFC写的操作界面源代码。演示怎么在应用中使用中文脚本语言引擎,怎么用GDI+怎么简单的动画效果(棋子下落的过程)。 适用于对中文编程有兴趣的开发者,以及想用VC和GDI+实现带简单动画效果的小游戏的开发者(注意,只是GDI+,最简单的绘图)。 由于代码编辑器中用到了商业组件,而源代码中不包含代码编辑器。如果在使用中遇到什么问题或有什么建议(特别是代码编辑器和SlotScript语言引擎)可以私信或给我发邮件,本人将尽量详细回答。
资源推荐
资源详情
资源评论
收起资源包目录
ConnectFour.zip (45个子文件)
Source
DynamicSortArray.h 6KB
ChessBoardCanvas.cpp 283B
ChessFourBoardCanvas.h 6KB
ChessFourBoardCanvas.cpp 26KB
framework.h 833B
ScriptInclude
INumberUnitManager.h 6KB
ISlotScriptCore.h 8KB
IMathExpression.h 7KB
IScriptBufferManager.h 12KB
IJsonReader.h 705B
BasicDataType.h 1007B
ISlotScriptHost.h 15KB
IOntology.h 4KB
IScriptBufferCore.h 10KB
IDataObject.h 8KB
MainFrm.cpp 13KB
ConnectFour.h 1KB
res
ConnectFour.rc2 678B
ChessFour.SlotScript 23KB
ConnectFour.ico 66KB
Buttons.jpg 20KB
ChessFour_Chess.jpg 11KB
ChessFour_Board.jpg 92KB
Resource.h 574B
pch.h 1KB
SlotScriptHost.h 13KB
ConnectFour.vcxproj 11KB
SlotScriptCoreLoader.h 4KB
MainFrm.h 2KB
ConnectFour.vcxproj.filters 4KB
ConnectFour.rc 15KB
SlotScriptHost.cpp 9KB
ChessBoardCanvas.h 901B
ConnectFour.sln 1KB
pch.cpp 4KB
ConnectFour.vcxproj.user 447B
SlotScriptCoreLoader.cpp 5KB
targetver.h 295B
ConnectFour.cpp 7KB
Bin
ConnectFour.exe 11.29MB
SlotScriptCore.dll 515KB
Styles
VisualStudio2015.dll 137KB
PuzzleGames.exe 5.96MB
Data
Script
四子棋.SlotScript 23KB
Images
ConnectFour.jpg 215KB
共 45 条
- 1
资源评论
裸码之道
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功