DS课设【坦克大战最短路】
还是决定写点东西简单记录下这次编码。
一、想法
还没放假的时候只想着用C#实现,算法图论方面觉得图论方向会靠谱些,但一直没有什么好点子。C#以前也没学过,自信来源于MFC的学习经历(以前也是用它做了C语言课设)。C#应该是没有MFC那么复杂的,心想看几天应该就可以上手一些小东西了,事实证明也如此。
寒假时间相对以前更长,也并不着急做课设。开始一段是刷题+学习Kinect+顺带了解Kinect,后来在刷题过程中遇到这题,还蛮有意思的,当即就写了个“坦克大战最短路简单设计”:
坦克大战最短路
算法:优先队列+广度优先搜索
用户自定义地图
1. 设置地图大小起点和终点 设置弹药
2. 设置铁墙、土墙、河水
3.
模式一:用户自己走
模式二:自动给出最短路
对比
坦克方法:
1. 调整方向
2. 开枪
事件:
判断是否达到
是否可以走
是否打到墙(子弹能可以穿过河)
游戏是否结束
人性化:
背景音乐
子弹效果
保存地图
当前最短
爆炸效果
二、实现
当时也没有十足把握能实现它,搁置了几天。期间看了一些关于C#项目开发的教学视频,也是跟着例程做了下,心里有底了,首先实现UI是没有问题的。
然后就有了下面这个详细设计文档:
一、界面
1、地图
大小 12*12 每个方格 边长60个像素
左上角为原点(0,0)
2、对象
坦克(Tank)
砖块(Brick) 1次打破
钢墙(Steel) 2次打破
河水(River) 子弹可以穿过,坦克不可以
星星(Star)
子弹(Bullet)
3、菜单
添加对象
手动模式
自动模式
4、显示
当前消耗
帮助
二、类设计
1.游戏父类 GameObject
属性:
x,y,width,height,image
方法:
构造函数(初始化)
Draw();
GetRectangle();
2.墙壁父类 WallFather:GameObject
属性:
+life
方法:
构造函数(初始化)
重写Draw();
IsOver();
3.River&Star父类 RSFather:GameObject
方法:
构造函数(初始化)
重写Draw();
4.Bullet :GameObject
属性:
+power
方法:
构造函数(初始化)
重写Draw();
5.Tank:GameObject
属性:
方法:
重写Draw(g);
Move();
Fire();
6.SingleObject
方法:
GetSingle();
Draw();
Check();
三、事件响应
于是照着这个,一个一个类的实现了。在这个过程中,颇有面向对象的意思在里面,以前写MFC程序的时候感触没这么明显。
1.新建一个VC++ win32 DLL
2.添加头文件"" 在头文件中加入以下代码:
#ifndef DLL_EXPORT
#define DECLDIR __declspec(dllimport)
#else
#define DECLDIR __declspec(dllexport)
#endif
3.添加源程序,添加以下代码:
#define DLL_EXPORT //先定义宏
#include "Dll.h"//这个头文件必须在#define DLL_EXPORT后面
4.编写自己需要的函数:
extern "C"
{
DECLDIR 返回值 函数名(参数...)
{
}
}
5.添加必要的头文件,不需要main函数,编译即可
6.建立一个C#工程,将生成的Dll文件(在Debug目录下)扔到C#工程Bin
目录下。
7.在C#中添加如下代码:
(1). 命名空间
using System.Runtime.InteropServices;
(2).声明
[DllImport("CppDll.dll", SetLastError = true)]
private static extern 返回值 函数名(参数...);
8.然后这个函数就可以直接在C#工程中使用了
这期间,特别要注意的是C++和C#之间数据类型的对应关系!! 这里着实费了一番功夫。
附上C++与C#数据类型对照表:
C++ C#
=====================================
WORD ushort
DWORD uint
UCHAR int/byte 大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte
UCHAR* string