嵌入式 五子棋
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统原理与应用
五子棋游戏设计与实现
学院:信息工程学院
专业班级:通信工程
姓名:
学号:
目录
一丶系统分析与总体设计 (3)
1.选题的意义 (3)
2. 需求分析 (3)
3.总体设计 (4)
二丶系统的详细说明 (5)
三丶系统实现与调试 (6)
1.调试过程 (6)
2.系统运行的结果 (6)
四丶附有程序代码打印 (9)
一丶系统分析与总体设计
1.选题的意义
游戏软件是当今世界发展最迅速,最有影响力,最有潜力和活力的领域之一。
游戏软件深受广大青年人喜爱,而且在发达国家中老年人也有一部分喜欢游戏的。
因此游戏软件在很大程度上给予大部分人精神上的娱乐。
五子棋游戏更是吸引着不同年龄段的人群,无论男女老少都可以玩,都喜欢玩。
而当前微型计算机已经在广大人群中流行着。
用电脑下五子棋更是一种时尚。
五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。
发展于日本,流行于欧美。
容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。
已在各个游戏平台有应用。
2.需求分析
五子棋游戏功能划分
1绘制棋子
2绘制界面
3绘制期盼
4实现通过鼠标控制棋子是否落在棋盘上
5判断输赢
1.系统功能需求分析
游戏说明:游戏开始时,黑子先手(人先下)将一枚黑子落在棋盘的一个坐标上然后由白子下(电脑),如此轮流下子直至某一方横丶竖或者斜线方向上首先五子连线则判断该方获胜。
然后进行下一局,中途可以悔棋。
2.系统数据需求分析
在电脑和人进行五子棋游戏时,系统要记录电脑和人他们的操作一遍进行数据分析,其中棋子数和棋子位置的各个变量。
3.系统性能的需求分析
运行平台的技术可行性,操作可行性(鼠标的确定位置的问题)
3.总体设计
系统的开发环境
软件开发需求平台:windows xp ,windows 2000 windows 2003,windows 7
开发工具:microsoft Visual C++ 4.00
运行环境:windowsCE系统
系统的总体功能:
实现计算机与人之间的较量,共同在此程序运行下完成该游戏规则下的操作,从而得到一个结果。
其中人的操作可以悔棋和中断游戏重新开始游戏。
模块图:
功能的作用
新游戏:中断游戏或游戏结束后,重新开始下一局游戏。
悔棋:操作人失误后或者下子后觉得不合适可进行后退到前一步的操作。
二丶系统的详细说明
五子棋程序流程图如下图:
开始游戏后,黑子先下,数据处理正确后就可以调用悔棋的函数,然后有两个分支悔棋或者不悔棋继续。
不悔棋就直接判断输赢,横竖斜线上是否有五个同样的棋子。
有则可判该棋子方赢,显示相关界面并可以开始下一局。
如果没有怎白子下(电脑下),电脑会根据黑子的数量和位置下相关位置,然后系统再进行判断是否有五个相同的子在横竖斜线上,判断胜负,
就这样循环进行直至出现胜负,或者棋盘下满为止。
三丶系统实现与调试
1.调试过程
错误信息和解决方法:
因为在进行程序测试的时候前面步骤正确操作且程序没有错误,所以程序调试的时候没有出现错误。
2.系统运行的结果
功能说明:当模拟器界面出现五子棋棋盘时,可以通过鼠标控制在棋盘上下子,程序会根据鼠标的位置确定下子的位置,然后就能够调用悔棋和新游戏两个子程序,等分出胜负的时候程序就会根据胜负结果显示相应的界面。
运行的过程及结果截图如下:
1.电脑上的模拟器打开后如下图显示
2.对五子棋程序进行编译,编译进行中的现象如下图
3,编译后的界面如下图
4对编译好的程序进行运行,实验显示结果如下图
5出现输赢时,五子连成一线的结果显示图6人获胜是显示结果
7电脑获胜时显示结果
四丶附有程序代码打印
#include "stdafx.h"
#include "AdbonWZQ.h"
#include "AdbonWZQDlg.h"
#include "MSGDLG.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//主要下子定位执行函数
CAdbonWZQDlg::CAdbonWZQDlg(CWnd* pParent /*=NULL*/) : CDialog(CAdbonWZQDlg::IDD, pParent)
{
CBitmap b,c,d,e,f;
CSize x;
b.LoadBitmap(IDB_QP242);
x.cx =242;//446 ;
x.cy =242;//446;
qp.CreateCompatibleDC(NULL);
qp.SelectObject(&b);
qp.SetSize(x);
b.DeleteObject();
c.LoadBitmap(IDB_QZH16);
x.cx =16;// 27 ;
x.cy =16;//27 ;
qzh.CreateCompatibleDC(NULL);
qzh.SelectObject(&c);
qzh.SetSize(x);
c.DeleteObject();
d.LoadBitmap(IDB_QZB16);
x.cx = 16;//27 ;
x.cy =16;//27;
qzb.CreateCompatibleDC(NULL);
qzb.SelectObject(&d);
qzb.SetSize(x);
d.DeleteObject();
e.LoadBitmap(IDB_MASK17);
x.cx =16;// 27 ;
x.cy =16;//27;
mask.CreateCompatibleDC(NULL);
mask.SelectObject(&e);
mask.SetSize(x);
d.DeleteObject();
f.LoadBitmap(IDB_DEAD16);
x.cx=16;//27;
x.cy=16;//27;
dead.CreateCompatibleDC(NULL);
dead.SelectObject(&f);
dead.SetSize(x);
f.DeleteObject();
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }
//数据交换函数
void CAdbonWZQDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX);
}
//实现信息映射机制
BEGIN_MESSAGE_MAP(CAdbonWZQDlg, CDialog) ON_BN_CLICKED(IDC_BUTNEW, OnButnew)
ON_BN_CLICKED(IDC_BUTBACK, OnButback)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
//实现命令传递机制
END_MESSAGE_MAP()
// 函数中显示信息操作
BOOL CAdbonWZQDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 为下面执行设置标识
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
CenterWindow(GetDesktopWindow());
SetWindowPos(this,0,26,240,294,SWP_SHOWWINDOW);
CRect rcdlg,rcc;
GetClientRect(rcdlg);
CButton * m_ctrl=(CButton *)GetDlgItem(IDC_BUTNEW);
rcc.left=8;
rcc.top=rcdlg.Height()-28;
rcc.right=rcc.left+50;
rcc.bottom=rcc.top+23;
m_ctrl->SetWindowText(TEXT("新游戏"));
m_ctrl->MoveWindow(rcc);
m_ctrl=(CButton *)GetDlgItem(IDC_BUTBACK);
rcc.left=rcdlg.Width()-58;
rcc.right=rcc.left+50;
m_ctrl->MoveWindow(rcc);
m_ctrl->SetWindowText(TEXT("悔棋"));
CBitmap temp;
temp.LoadBitmap(IDB_HENT);
m_HenMemDC.CreateCompatibleDC(NULL);
m_HenMemDC.SelectObject(&temp);
temp.DeleteObject();
this->SetWindowText(L"五子棋v1.0");
runpath ="";
loadfile();
twzq.SetDc(&qp,&qzh,&qzb,&mask,&dead,this->GetDC());
twzq.NewGame();
GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble());
return TRUE;
}
//调用新开局函数
void CAdbonWZQDlg::OnButnew()
{
//这这里添加控制操纵代码
Invalidate();
twzq.NewGame();
GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble()); }
//调用悔棋函数
void CAdbonWZQDlg::OnButback()
{
//这这里添加控制操纵代码
twzq.goback();
GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble()); }
void CAdbonWZQDlg::loadfile()
{
twzq.AItype=2;
twzq.Model=0;
}
void CAdbonWZQDlg::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default
int x1,y1;
x1=(int)(point.x+2)/16 ;
y1=(int)(point.y+2-32)/16 ;
//没有下子时结束
if(!twzq.downzi(x1,y1))
{
return;
}
//一局结束后显现的信息
GetDlgItem(IDC_BUTBACK)->EnableWindow(twzq.getbackble());
//操作者输了后显示的信息
if (twzq.twinner.winner==1)
{
MessageBox(L"小样,输了吧,回去再练几年吧! ^_^ ^_^");
GetDlgItem(IDC_BUTBACK)->EnableWindow(FALSE);
twzq.draw();
}
//操作者赢了后显示的信息
if (twzq.twinner.winner==2)
{
MessageBox(L"-_- 你是不是作弊了啊,再来两盘..." );
GetDlgItem(IDC_BUTBACK)->EnableWindow(FALSE);
twzq.draw();
}
CDialog::OnLButtonDown(nFlags, point);
}
void CAdbonWZQDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
CRect closerect,dlgrect;
GetClientRect(&dlgrect);
if (point.x>=dlgrect.Width()-25 && point.x<dlgrect.Width()-8 && point.y>=3 && point.y<=20)
OnCancel();
CDialog::OnLButtonUp(nFlags, point);
}
//打印输出函数
void CAdbonWZQDlg::OnPaint()
{
CPaintDC dc(this);
// 添加信息代码
CClientDC hdc(this);
CRect rcdlg,rcx,closerect;
GetWindowRect(&rcdlg);
rcx.left=2;
rcx.top=2;
rcx.right=rcdlg.Width()-2;
rcx.bottom=rcdlg.Height()-2;
HBRUSH m_closebrush=::CreateSolidBrush(RGB(210,227,230));
HBRUSH m_oldclosebrush=(HBRUSH)hdc.SelectObject(m_closebrush);
hdc.RoundRect(rcx,CPoint(8,8));
hdc.SelectObject(m_oldclosebrush);
hdc.BitBlt(4,3,rcdlg.Width()-8,23,&m_HenMemDC,3,0,SRCCOPY);
//打印标题
CString temp;
temp="五子棋v1.0";
hdc.SetBkMode(0);
hdc.DrawText(temp,CRect(10,6,120,22),0);
//画关闭圆
closerect.left=rcdlg.Width()-25;
closerect.top=3;
closerect.right=rcdlg.Width()-8;
closerect.bottom=20;
m_closebrush=::CreateSolidBrush(RGB(242,232,207));
m_oldclosebrush=(HBRUSH)hdc.SelectObject(m_closebrush);
//hdc.SelectObject(m_closebrush);
CPen m_closepen;
m_closepen.CreatePen(PS_SOLID,1,RGB(252,212,207));
CPen *m_oldclosepen=hdc.SelectObject(&m_closepen); //hdc.SelectObject(&m_closepen);
hdc.Ellipse(closerect);
hdc.SelectObject(m_oldclosebrush);
hdc.SelectObject(m_oldclosepen);
m_oldclosepen->Detach();
m_oldclosepen->DeleteObject();
CSize size=hdc.GetTextExtent("X");
hdc.SetBkMode(TRANSPARENT);
hdc.DrawText("X",CRect((closerect.left+(closerect.Width()-size.cx)/2),(closerect.top+(closer ect.Height()-size.cy)/2),closerect.right,closerect.bottom),0);
CSize x;
x=qp.GetSize();
twzq.draw();
}。