一步一步实现五子棋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多教程后绘制的,怎么样,还不错吧!

相关文章推荐

带你一步步走入Paxos的世界 -- 序列1

说起Paxos,很多人都知道,并且大家对它的看法基本都是“晦涩难懂”。除了Lamport那2篇鼎鼎大名的原生paper,网上文章也很多。但看来看去,总觉得“云山雾罩”,也不知道为什么要这么做,以及它到...

三思笔记之一步一步学Oracle part1

  • 2016年05月31日 14:42
  • 60MB
  • 下载

一步一坑定制Android虚拟机1·引子

趁着自己业余时间想要搞事情的前提下,把学习定制化Android内核和功能的这一过程弄成一个系列文章。...
  • jlvsjp
  • jlvsjp
  • 2017年04月15日 04:46
  • 303

HDU 3068 2017 Multi-University Training Contest - Team 1 1006 Fuction: 循环节+最后一步

题意:给出一个0..n-1的全排列a,给出一个0..m-1的全排列b,现在要求计算函数F(定义域0..n-1 值域0..m-1)的个数,使得对所有的0..n-1的 i 都有 F(i)=b(F(ai))...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一步一步实现五子棋1
举报原因:
原因补充:

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