散分第二帖 极限编程20小时的游戏作品 欢迎大家来捧场

品茶 2011-09-02 12:50:13
加精
游戏规则:
5 X 5的方格中 有15只羊 3只狼
每回合狼可以空一格吃羊 也可以移动一格 吃光羊获胜
羊只能移动一格 围住所有狼获胜

基本功能已实现 希望有时间感兴趣的朋友一起讨论羊的AI
给出新思路或完善AI的朋友至少有20分

可以参考我写的AI


// Play.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "Play.h"

#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

//自定义全局变量
MYGDI g[18];//15只羊和3匹狼的图片
int i, n;//i为循环变量 n为选中之狼的编号
POINT p[18];//15只羊和3匹狼的坐标
POINT k[25];//关键点
RECT rect = {0, 0, 528, 550};
int cx, cy;//鼠标点击的坐标
bool isChoose = false;//是否选择了狼
bool isAction = true;//是否轮到狼行动
static TCHAR c[3];

// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
void CALLBACK timerProc(HWND hWnd, UINT msg, UINT id, DWORD dwTime);
bool NoHit();//碰撞检测
bool NoBody(int a);//障碍检测
bool eat();//吃羊检测
int Alive();//还有几只羊
bool SheepAction();//羊的行动
bool hold(int key);//是否已经占据该关键点
bool CanBeEat(int key);//判断移动后是否会被吃
bool UP(int key);//向上找羊
bool DOWN(int key);//向下找羊
bool LEFT(int key);//向左找羊
bool RIGHT(int key);//向右找羊
bool SaveTop(int key);//移动前上面是否安全
bool SaveBelow(int key);//移动前下面是否安全
bool SaveLeft(int key);//移动前左面是否安全
bool SaveRight(int key);//移动前右面是否安全
bool UPSAVE(int key);//移动后上面是否安全
bool DOWNSAVE(int key);//移动后下面是否安全
bool LEFTSAVE(int key);//移动后左面是否安全
bool RIGHTSAVE(int key);//移动后右面是否安全
bool WolfUp(int wolf);//判断狼的上方是否被围
bool WolfDown(int wolf);//判断狼的下方是否被围
bool WolfLeft(int wolf);//判断狼的左方是否被围
bool WolfRight(int wolf);//判断狼的右方是否被围
int getPos(int key);//根据狼或羊的编号获得位置编号
bool WolfCanAction();//判断是否还有狼可以行动

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;

// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_PLAY, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_PLAY));

// 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}



//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_PLAY));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;//MAKEINTRESOURCE(IDC_PLAY);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);
}

//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;

hInst = hInstance; // 将实例句柄存储在全局变量中

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 528, 550, NULL, NULL, hInstance, NULL);

if (!hWnd)
{
return FALSE;
}

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

// 初始化自定义全局变量
for (i = 0; i<18; i++)
{
if (i<15)
{
g[i].getFile(hWnd, _T("Images/羊.bmp"));
p[i].x = i % 5 * 102 + 2;
p[i].y = i / 5 * 102 + 2;
}
else
{
g[i].getFile(hWnd, _T("Images/狼.bmp"));
p[i].x = i % 5 * 102 + 104;
p[i].y = 410;
}
}

// 初始化关键点
for (i = 0; i<25; i++)
{
k[i].x = i % 5 * 102 + 2;
k[i].y = i / 5 * 102 + 2;
}

return TRUE;
}

//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static DBBUFFER buf(GetDC(hWnd), 528, 550);

switch (message)
{
case WM_CREATE:
SetTimer(hWnd, 1, 66, timerProc);
break;
case WM_LBUTTONDOWN:
cx = LOWORD(lParam);
cy = HIWORD(lParam);
if (isChoose)
{
// 狼的移动
if (cx>p[n].x && cy>p[n].y-102 &&cx<p[n].x+100 && cy<p[n].y-2)
{
//MessageBox(0, _T("上一"), 0, 0);
if (NoHit())
{
p[n].y -= 102;
isChoose = false;
isAction = false;
}
}
if (cx>p[n].x && cy>p[n].y+102 &&cx<p[n].x+100 && cy<p[n].y+202)
{
//MessageBox(0, _T("下一"), 0, 0);
if (NoHit())
{
p[n].y += 102;
isChoose = false;
isAction = false;
}
}
if (cx>p[n].x-102 && cy>p[n].y &&cx<p[n].x-2 && cy<p[n].y+100)
{
//MessageBox(0, _T("左一"), 0, 0);
if (NoHit())
{
p[n].x -= 102;
isChoose = false;
isAction = false;
}
}
if (cx>p[n].x+102 && cy>p[n].y &&cx<p[n].x+202 && cy<p[n].y+100)
{
//MessageBox(0, _T("右一"), 0, 0);
if (NoHit())
{
p[n].x += 102;
isChoose = false;
isAction = false;
}
}

// 吃羊
if (cx>p[n].x && cy>p[n].y-204 &&cx<p[n].x+100 && cy<p[n].y-104)
{
//MessageBox(0, _T("吃上"), 0, 0);
if (NoBody(0))
{
if (eat())
{
p[n].y -= 204;
isChoose = false;
isAction = false;
}
}
}
if (cx>p[n].x && cy>p[n].y+204 &&cx<p[n].x+100 && cy<p[n].y+304)
{
//MessageBox(0, _T("吃下"), 0, 0);
if (NoBody(1))
{
if (eat())
{
p[n].y += 204;
isChoose = false;
isAction = false;
}
}
}
if (cx>p[n].x-204 && cy>p[n].y &&cx<p[n].x-104 && cy<p[n].y+100)
{
//MessageBox(0, _T("吃左"), 0, 0);
if (NoBody(2))
{
if (eat())
{
p[n].x -= 204;
isChoose = false;
isAction = false;
}
}
}
if (cx>p[n].x+204 && cy>p[n].y &&cx<p[n].x+304 && cy<p[n].y+100)
{
//MessageBox(0, _T("吃右"), 0, 0);
if (NoBody(3))
{
if (eat())
{
p[n].x += 204;
isChoose = false;
isAction = false;
}
}
}
}
else
{
for (i = 15; i<18; i++)
{
if (cx>p[i].x && cy>p[i].y && cx<p[i].x+100 && cy<p[i].y+100)
{
n = i;
isChoose = true;
/*c[0] = '1';
c[1] = n%10+'0';
c[2] = '\0';
MessageBox(0, c, 0, 0);*/
break;
}
}
}
if(!isAction)
{
// 羊的AI待完善
if (Alive())
{
if(SheepAction())
{
if (WolfCanAction())
{
isAction = true;
}
else
{
MessageBox(0, _T("以后别说自己是狼"), 0, 0);
PostQuitMessage(0);
}
}
else
{
MessageBox(0, _T("最后的羊也走投无路了."), 0, 0);
PostQuitMessage(0);
}
}
else
{
MessageBox(0, _T("狼吃饱了.羊死光了."), 0, 0);//有了[MessageBox(0, _T("最后的羊也走投无路了."), 0, 0);]这句后 就不会执行到这里了吧
PostQuitMessage(0);
}
}
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
FillRect(buf, &rect, (HBRUSH)GetStockObject(/*WHITE_BRUSH*/BLACK_BRUSH));
for (i = 0; i<18; i++)g[i].draw(buf, p[i].x, p[i].y);
buf.flush();
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
KillTimer(hWnd, 1);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;

case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}

// 自定义定时器
void CALLBACK timerProc(HWND hWnd, UINT msg, UINT id, DWORD dwTime)
{
InvalidateRect(hWnd, NULL, FALSE);
}


源码地址:http://blog.csdn.net/teatimel/article/details/6742603
...全文
14521 349 打赏 收藏 转发到动态 举报
写回复
用AI写文章
349 条回复
切换为时间正序
请发表友善的回复…
发表回复
My_Void 2014-03-23
  • 打赏
  • 举报
回复
好厉害 !!
一点不剩 2013-11-26
  • 打赏
  • 举报
回复
虽然看不懂,但是还是学习了不少
aiversonwk 2013-05-25
  • 打赏
  • 举报
回复
看起来觉得不错啊,楼主
tianlang200810 2013-05-21
  • 打赏
  • 举报
回复
代码很多,很厉害,向楼主学习
chaofengwang09 2012-05-30
  • 打赏
  • 举报
回复
膜拜 学习
Paganini1212 2012-03-20
  • 打赏
  • 举报
回复
各种支持!
gz_eddie_htc 2011-12-10
  • 打赏
  • 举报
回复
20小时~很好很强大~
感觉在继续 2011-12-06
  • 打赏
  • 举报
回复
学习,表示敬佩!太强了
Xxx 2011-09-19
  • 打赏
  • 举报
回复
头文件在哪里。。。
kkkmoving 2011-09-19
  • 打赏
  • 举报
回复
表示佩服
xmx89757 2011-09-18
  • 打赏
  • 举报
回复
支持支持
蓓大神 2011-09-18
  • 打赏
  • 举报
回复
学习了!
Redsoxy 2011-09-18
  • 打赏
  • 举报
回复
晕了。。。。。
hym_dn 2011-09-18
  • 打赏
  • 举报
回复
顶礼膜拜
livedjsky 2011-09-18
  • 打赏
  • 举报
回复
学习学习
  • 打赏
  • 举报
回复
呃 看着真的很累!
zhijializhangcao 2011-09-17
  • 打赏
  • 举报
回复
占L
回来再看
Reage-- 2011-09-17
  • 打赏
  • 举报
回复
我不是我们玩的大炮吃小子吗 这没有创意竟然该了
zyjtxdy 2011-09-17
  • 打赏
  • 举报
回复
您真能写啊
追忆次风暴 2011-09-17
  • 打赏
  • 举报
回复
支持你
加载更多回复(305)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧