好用没用过C++做一个完整一点的东西了,今天开始希望靠我这点微薄的技术来完成这个小游戏。

我现在的水平应该算是菜鸟中的战斗鸡了,所以又很多东西在设计和技术方面肯定会有很大的缺陷,我做这个小游戏的目的单纯为了证明一下我到底还是不是个程序员。。。

这个小游戏是我小时候玩过的一种棋盘类游戏,可能只在我们那边才会知道,不过现在小孩估计已经很少玩了,搞不好要失传了。。。这个游戏名叫马虎吃小人。

大概介绍一下游戏,下面是游戏布局

方框代表老虎,三角形代表小人,每次只能向前后左右一个方向移动一个格,不能斜着走,小人先走。

老虎吃小人规则是老虎附近有小人且小人后面有空格,这样老虎调到空格位置,然后就吃掉小人

游戏大概就是这样,我的计划是先画出棋盘和棋子,然后编写下棋规则,双人对战完成后写单人对战。如果可能的话我会把它放到服务器上,这样可以远程登录就可以玩了。希望都能完成吧。

嗯。。。做人不能好高骛远,先从设计棋盘开始吧。

棋盘是5*5,做成固定大小的太死板了,就按照窗口大小设计吧。

棋盘上下左右距离边框30像素

新建一个单文档,名称为TigerEatPeople,棋盘代码如下

#define BOARD_LINE 5
#define EDG_DISTANCE 30

void CTigerEatPeopleView::DrawBoard(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
CPen pen1(PS_SOLID, 6, RGB(0, 0, 0));
pDC->SelectObject(&pen1); //求水平、垂直间隔
if (rect.bottom - rect.top < 60
|| rect.right - rect.left < 60)
{
return;
}
int space_horizontal = (int)((rect.bottom - rect.top - EDG_DISTANCE * 2) / 4);//水平
int space_vertical = (int)((rect.right - rect.left - EDG_DISTANCE * 2) / 4);//垂直
//画横线
for (int i = 0; i < BOARD_LINE; i++)
{
pDC->MoveTo(rect.left + EDG_DISTANCE, rect.top + EDG_DISTANCE + space_horizontal*i);
pDC->LineTo(rect.right - EDG_DISTANCE, rect.top + EDG_DISTANCE + space_horizontal*i);
}
//画竖线
for (int i = 0; i < BOARD_LINE; i++)
{
pDC->MoveTo(rect.left + EDG_DISTANCE + space_vertical*i, rect.top + EDG_DISTANCE);
pDC->LineTo(rect.left + EDG_DISTANCE + space_vertical*i, rect.bottom - EDG_DISTANCE);
} }

  

 

一个很low的棋盘就做好了

然后是画棋子,我的计划是写一个父类

父类的成员变量:name,type,color,chose_color,location,height,weight,isChonse,isMove

父类的方法:Move,PaintPiece

暂时就这些吧,想到再加。

emmm感觉自己把自己坑了,分明几分钟就能开始画棋子的。。。

设计完父类和子类,准备研究画棋子了,可以分成2部分:

1.坐标转换

把电脑客户端像素坐标转换为棋盘坐标,根据棋盘坐标画棋子

2.设计棋子

根据棋盘坐标,设计棋子样式。

void Tiger::PaintPiece(CDC *pDC, CRect rect)
{
Location t1, t2;//两个老虎的位置
int space_horizontal = (int)((rect.bottom - rect.top - EDG_DISTANCE * 2) / 4);//水平
int space_vertical = (int)((rect.right - rect.left - EDG_DISTANCE * 2) / 4);//垂直
t1.x = rect.left + 30 + space_vertical;
t1.y = rect.top + 30 + space_horizontal; t2.x = rect.left + 30 + space_vertical * 3;
t2.y = rect.top + 30 + space_horizontal; CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
CBrush brush(RGB(255,0,0));
CPen *oldpen = pDC->SelectObject(&pen);
CBrush *oldbrush = pDC->SelectObject(&brush);
pDC->Ellipse(t1.x - 20, t1.y - 20, t1.x + 20, t1.y + 20);
pDC->Ellipse(t2.x - 20, t2.y - 20, t2.x + 20, t2.y + 20); pDC->SelectObject(oldpen);
pDC->SelectObject(oldbrush); }

  

今天就先这样吧,今天的代码

链接:https://pan.baidu.com/s/1NVo6k64UhmTzVCXwHIbxOw 密码:pasm

C++ MFC棋牌类小游戏day1的更多相关文章

  1. C++ MFC棋牌类小游戏day6

    双人单机小游戏做完了,规则那部分还没介绍,暂时不打算介绍了,因为写的这个bug太多,我打算重新修改. 链接:https://pan.baidu.com/s/1XQKPSv0Tw36Qi2TeaRJiM ...

  2. C++ MFC棋牌类小游戏day5

    先整理一下之前的内容: 1.画了棋盘,把棋盘的每个点的状态都保存起来. 2.画棋子,分别用tiger类和people类画了棋子,并且保存了棋子的初始状态. 下面开始设计棋子的移动: 1.单机棋子,选中 ...

  3. C++ MFC棋牌类小游戏day4

    根据昨天的计划,今天开始做下面的内容. 1.鼠标点击事件 2.点击坐标进行处理.(坐标转换) 3.判断选中的位置是否有效. 4.确定选中的棋子,设置棋子的状态和棋子所在坐标的状态. 5.判断移动是否有 ...

  4. C++ MFC棋牌类小游戏day3

    今天开始设计小人棋子. 画法跟画虎一样,唯一不一样的是小人在刚开始会有重叠的情况,所以画起来可能比虎的棋子能够难一点. 我打算用Location结构体中的num来标记每个棋盘坐标存在棋子的个数,isH ...

  5. C++ MFC棋牌类小游戏day2

    反思了一下昨天的设计,觉得略有不足,我决定把棋盘做成单例模式.这样的话需要重新设计棋盘类,emmm,是新建棋盘类. Baord类 成员变量: Location  coordinate;//棋子坐标 b ...

  6. WEBGL学习笔记(七):实践练手1-飞行类小游戏之游戏控制

    接上一节,游戏控制首先要解决的就是碰撞检测了 这里用到了学习笔记(三)射线检测的内容了 以鸟为射线原点,向前.上.下分别发射3个射线,射线的长度较短大概为10~30. 根据上一节场景的建设,我把y轴设 ...

  7. [安卓] 12、开源一个基于SurfaceView的飞行射击类小游戏

    前言  这款安卓小游戏是基于SurfaceView的飞行射击类游戏,采用Java来写,没有采用游戏引擎,注释详细,条理比较清晰,适合初学者了解游戏状态转化自动机和一些继承与封装的技巧. 效果展示    ...

  8. android开发之网络棋牌类在线游戏开发心得(服务器端、Java) 好文章值得收藏

    标签: android服务器 2013-10-09 17:28 3618人阅读 评论(0) 收藏 举报 分类: android(11) 转自:http://blog.csdn.net/bromon/a ...

  9. Egret初体验–躲避类小游戏

    下面简单介绍一下我这个游戏:基本上就3个画面(准备再添加一个胜利的界面)开始画面,一个按钮,点击进入游戏游戏画面,滚动的背景,触摸移动的老鹰,从天而降的翔,以及右上角的时间条结束画面,显示结果,关注按 ...

随机推荐

  1. 【Linux 线程】同一个进程中的线程共享哪些资源

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线 ...

  2. MVC 的那点小事

    两年未见 一切从头再来.我猜到了故事的开头,找工作一如我想象的那般艰难,但是结果却比我预期的要好很多. 第一次开始用MVC 框架,比我想象的要简单的多,就像同事跟我说的,这只是个框架. 言归正传,前两 ...

  3. Compile、Make和Build的区别

    针对Java的开发工具,一般都有Compile.Make和Build三个菜单项,完成的功能的都差不多,但是又有区别.   编译,是将源代码转换为可执行代码的过程.编译需要指定源文件和编译输出的文件路径 ...

  4. android 下拉刷新框架PullToRefreshScrollView(com.handmark.pulltorefresh)

    很简单,实现OnRefreshListener这个监听器. mPullRefreshScrollView .setOnRefreshListener(new OnRefreshListener< ...

  5. Django模板如何用一个变量查找字典值

    mydict = {"key1":"value1", "key2":"value2"} 在Django模板中查找字典值的 ...

  6. 搭建FTP服务器 window7

    1.安装IIS组件,打开控制面板-->程序和功能,点击打开或关闭windows功能 找到Internet信息服务,勾选FTP服务器和Web管理工具下的IIS管理控制台进行安装ftp,如图所示 2 ...

  7. js Map和Set

    Map Map是一组键值对的结构,具有极快的查找速度.JavaScript的对象有个小问题,就是键必须是字符串.但实际上Number或者其他数据类型作为键也是非常合理的.为了解决这个问题,最新的ES6 ...

  8. phpstorm+xdebug调试代码

    1工具 #phpstorm 前面有文章介绍如何安装 #phpStudy 官网下的2018最新的安装包,php环境使用的也是最新的php7.0nts 2开启php Xdebug拓展 开启拓展,phpSt ...

  9. Numpy array分割

    1.纵向分割 >>> import numpy as np >>> A = np.arange(12).reshape((3, 4)) >>> p ...

  10. Mybatlis SQL 注入与防范

    SQL注射原理 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意)的SQL命令 ...