一步一步实现五子棋1

原创 2013年12月04日 12:27:41



最近待业中,趁这段时间想实现一个VC版的五子棋软件,并且把每天的工作内容写出来当作对自己工作的总结,同时希望能达到抛砖引玉的效果,希望各位大侠多多指教。

首先建立一个MFC工程,如下图:

        


工程建好后我们先完成棋盘的绘制。这里我们使用GDI+来绘图。要使用GDI+,先要完成如下工作。

   (1)将以下代码加入到StdAfx.h头文件中:

#include <comdef.h>

#ifndef ULONG_PTR 

#define ULONG_PTR  unsignedlong*

#include "GdiPlus.h" 

using namespace Gdiplus;

#endif 

#pragma comment(lib,"gdiplus.lib")

(2) 在程序初始化部分加入以下代码:

// 装载GDI+ 

GdiplusStartupInput gdiplusStartupInput;     

ULONG_PTR  pGdiToken; 

GdiplusStartup(&pGdiToken,&gdiplusStartupInput,NULL);

(3) 在程序结束部分前加入如下代码:

// 卸载GDI+

GdiplusShutDown(pGidToken);

这样这个工程就可以使用GDI+了。

在OnPaint()中添加绘图部分代码如下:

void CFiveDlg::OnPaint()

{

    if (IsIconic())

    {

      

    }

    else

    {

       CRect rect;

       GetClientRect(&rect);

       

       // 获得绘制区的高宽

       m_width = rect.Width();

       m_height = rect.Height();

 

       // 根据高宽获得棋盘方格大小、左边界和上边界距离

       if (m_width>m_height)

       {

            m_blockSize= m_height / 16;

            m_top= m_blockSize;

            m_left= m_blockSize;

       }

       else

       {

            m_blockSize= m_width / 16;

            m_left= m_blockSize;

            m_top= (m_height - 14 *m_blockSize)/ 2;

       }

 

       CPaintDC dc(this);

       Graphics graphics(dc.m_hDC);

 

       // 绘制棋盘

       DrawChessBoard(&graphics);

 

       // 绘制棋子

       DrawChess(&graphics);

       

       CDialog::OnPaint();

    }

}


绘制棋盘的方法实现如下

void CFiveDlg::DrawChessBoard(Graphics *g)

{

   // 绘制棋盘背景

   Image image(L"img/board.png",FALSE);

   g->DrawImage(&image,m_left -m_blockSize / 2,m_top- m_blockSize / 2, 15 *m_blockSize, 15 * m_blockSize);

 

   // 绘制棋格

   Pen myPen(Color(255, 100, 100, 100), 1);

   for (inti = 0;i< 15; i++)

   {

       g->DrawLine(&myPen,m_left, m_top +m_blockSize* i,m_left+ m_blockSize * 14,m_top+ m_blockSize *i);

       g->DrawLine(&myPen,m_left +m_blockSize *i,m_top, m_left+ m_blockSize * i,m_top + m_blockSize* 14);

   }

}

 

绘制棋子的方法实现如下,这里只是简单的绘制了两颗棋子。

void CFiveDlg::DrawChess(Graphics *g)

{

   Image whiteChess(L"img/whitestone.png",FALSE);

   Image blackChess(L"img/blackstone.png",FALSE);

 

   int chessLeft= m_left - m_blockSize/ 2;

   int chessTop= m_top - m_blockSize/ 2;

   int chessSize= m_blockSize;

 

   g->DrawImage(&whiteChess,chessLeft+ 7 * m_blockSize,chessTop+ 7 * m_blockSize,chessSize,chessSize);

   g->DrawImage(&blackChess,chessLeft+ 6 * m_blockSize,chessTop+ 7 * m_blockSize,chessSize,chessSize);

}

 

好了,到这里就完成了棋盘的绘制了,看看运行之后的效果吧。

这棋盘和棋子可是我用Photoshop借鉴了N多教程后绘制的,怎么样,还不错吧!

一步一步实现五子棋2

上一章我们实现了棋盘的绘制,现在来实现用鼠标下棋的功能吧。 首先添加一个Engine类,然后添加若干方法和成员,代码如下: #ifndef FIVE_ENGINE_H #define FI...
  • ILSunny
  • ILSunny
  • 2013年12月04日 17:40
  • 734

一步一步实现五子棋6

最近一直忙于面试,杂事太多都没时间写代码了,今天抽出了点时间,完成了五子棋的博弈算法。         所谓博弈,就是指在一定的游戏规则约束下,基于直接相互作用的环境条件,参与者选择各自策略以实现利益...
  • ILSunny
  • ILSunny
  • 2013年12月15日 15:29
  • 1257

一步一步实现五子棋5

前面弱智版五子棋虽然实现了让电脑下棋,但是完全没有思考能力。下面我们就来为电脑提升智力,学会思考后再下棋。         计算机的思考能力体现在对盘面的分析上,通过分析可能形成的盘面,从中选择最优结...
  • ILSunny
  • ILSunny
  • 2013年12月10日 14:07
  • 730

一步一步实现五子棋4

完成上章之后本来准备进入五子棋的估值算法的,考虑了一下后还是觉得不要太着急,要符合本文一步一步的宗旨,保持清晰的思路。首先我们实现弱智版的人机对弈,理清人机对弈的基本流程。然后完成五子棋估值算法,让电...
  • ILSunny
  • ILSunny
  • 2013年12月09日 13:00
  • 889

一步一步实现五子棋3

昨天有面试,五子棋的工作暂停了一下,今天继续。 前面五子棋的棋盘棋子的绘制以及用鼠标下棋的功能已经实现了,下一步我们的工作就是让电脑一步一步学会如何下棋。首先要教会的是如何判断输赢,我们都知道当相同棋...
  • ILSunny
  • ILSunny
  • 2013年12月06日 11:32
  • 681

一步一步DIY jQuery库1

前一段时间,看到一篇系列文章《从零开始,DIY一个jQuery 1-3》三篇文章从头讲解如何DIY一个JQuery,感觉挺有意思。 我在前端已经有了一年的经验,jquery几乎是每天都会使用到,...
  • future_todo
  • future_todo
  • 2016年10月02日 21:49
  • 1205

一步一步学做一个CPU——1,准备工作

一,准备工作 参考: 罗老板的计算机结构与组成课程 http://xgxy.cug.edu.cn/rjgcx/lzw/COD/ Machine Structures. Spri...
  • wyq120547
  • wyq120547
  • 2014年06月17日 12:05
  • 1337

Android 从硬件到应用:一步一步向上爬 2 -- 运行 C 程序测试硬件驱动

编写C程序快速测试硬件驱动: 在Android 源码根目录下的external文件夹创建driver_test文件夹: cd external mkdir driver_test cd dri...
  • wu20093346
  • wu20093346
  • 2014年12月12日 20:53
  • 1689

一步一步写STL:空间配置器 (1)

侯捷说:追踪一流程序,并从中吸取养分,模仿着他写的程序,比那些自以为靠自己努力写出来的下三流程序价值高得多,至少我这么认为——世界上99.999%的程序,在STL面前都是下三流水平!   侯捷老师...
  • effective_coder
  • effective_coder
  • 2013年05月30日 02:01
  • 6050

一步一步学ROP之linux_x86篇

0x00    本文仅解释说明蒸米大神一步一步学ROP之linux_x86篇,读者应先阅读这篇文章,遇到问题再来看我这篇文章。    阅读完这两篇文章后,我们会理解ROP(返回导向编程),DEP(堆栈...
  • jltxgcy
  • jltxgcy
  • 2016年02月19日 11:16
  • 2442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一步一步实现五子棋1
举报原因:
原因补充:

(最多只允许输入30个字)