JIANGSU TEACHERS UNIVERSITY OF TECHNOLOGY
本科毕业设计(论文)
Visual C++程序设计与应用报告
——小兔子走迷宫游戏
学院名称: 计算机工程学院
专 业: 计算机技术与应用
班 级: 09计2Z
2009年 06月
Visual C++程序设计与应用教程游戏设计与开发
摘 要:随着计算机技术的普及和发展,计算机的应用已经渗透到国民经济与人们生活的各个方面,掌握一门计算机编程语言已成为现代大学生应该具备的基本技能之
一。Visual C++软件使用是《Visual C++程序设计与应用教程》课程学习中的基础内容。
本文首先对Visual C++程序设计与应用教程的开发背景、开发工具等进行概述,并从学习者特征、教学内容和功能等方面进行详细需求分析,然后对小兔子走迷宫游戏程序设计的总体设计、开发实现方法和关键技术进行具体介绍,包括大小地图和方向键控制等。
关键词:计数器,Counter,刷新画面,Refresh screen
Visual C + + programming and application design and
development tutorial game
Abstract: With the popularization and development of computer technology, computer applications have penetrated into the national economy and all aspects of people's lives, to master a computer programming language has become a modern university should have one of the basic skills. Visual C + + software is a
This article first Visual C + + programming tutorial and application development background, development tools overview, and from the characteristics of learners, teaching content and function, and so a detailed needs analysis, and then rabbit maze game programming overall design, development and implementation of specific key technologies introduced, including the size of the map and the arrow keys to control
Keywords: Counter, Counter, refresh the screen, Refresh screen
目录
序言 ........................................................... 1
第1章 概 述 ................................................. 2
1.1 系统开发背景和意义 .............................................. 2
1.2 开发流程 ........................................................ 2
1.3 开发工具介绍 .................................................... 4
1.3.1 Visual C++6.0程序编辑软件 ................................ 4
1.3.2 Adobe photoshop CS3 ...................................... 4
第2章 小兔子走迷宫设计 ....................................... 6
2.1 小兔子走迷宫的阐述 .............................................. 6
2.1.1 设计理念 ................................................. 6
2.1.2 具备的功能 ............................................... 6
第3章 系统功能实现 ........................................... 7
3.1 模块编码设计 .................................................... 7
3.1.1 上下左右控制键的定义 ..................................... 7
3.1.2 游戏程序图片处理程序 .................................... 12
3.2 开发过程中存在的问题与解决情况 ................................. 16
结束语 ........................................................ 17
参考文献 ...................................................... 19
致谢 .......................................................... 20
附录 小兔子走迷宫游戏部分程序 ................................ 21
序言
Visual C++(简称VC++)是20世纪90年代中期由美国微软公司推出的一个强大的Windows应用程序开发平台,是“真正的程序员”首选的开发工具之一,也是有志于程序设计的程序员、大中专院校学生进入高级程序设计领域的首选软件之一。
随着社会发展,人们生活节奏加快,计算机的更新,地球村已不再是一个遥不可及的梦想。我们可以通过计算机获取各种我们想要的信息,查找各种资料,如文献期刊、教育论文、产业信息、留学计划、求职求才、气象信息、海外学讯、论文检索等。您甚至可以坐在电脑前,让电脑带您到世界各地作一次虚拟旅游。只要我们掌握了在计算机这片浩瀚的信息海洋中遨游的方法,您就能在生活中得到无限的信息宝藏。
作为计算机科学与技术班的学生,《Visual C++程序设计与应用教程》这一门科学深深的吸引着我们,原先不管是国内还是国外都喜欢把这个系分为计算机软件理论、计算机系统、计算机技术与应用。后来又合到一起,变成了现在的计算机科学与技术。我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易,但计算机专业的优势是:我们掌握许多其他专业并不“深究”的东西,例如,游戏的编程,算法,体系结构,软件的熟练运用等等。
第1章 概 述
1.1 系统开发背景和意义
随着信息技术的飞速发展,各种学习资源越来越受到人们的重视,特别是游戏教程。它以其逼真的画面,简单精练的操作,人性化的开发脑智力不断受到青少年学者的青睐。而迷宫则是儿童智力游戏的一种,它可以锻炼人的思维能力。当我们在一个迷宫中时怎样避免重复的走一些路,避免怎样走投无路,无路可走,什么样的迷宫可以走,怎样就知道迷宫无出口了,通过动脑子想办法,既丰富了大脑又加强了胆识。
网络的快速发展,使得越来越多的人参与到游戏程序制作的行列之中。社会对游戏编程人员的需求越来越大,其中以VC编程最为显著。Visual C++是由美国微软公司推出的一个强大的Windows应用程序开发平台。它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。它由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。为此,各大高职院校纷纷开设了游戏编程的相关课程。计算机应用专业也不例外。但是该软件的学习除了老师课堂讲授外,还需要学生课后的自学练习。
迷宫是家喻户晓的益智小游戏,选择这个题目一是为了能够运用这学期所学习的知识,二是我们从小就接触到这个游戏,它的实现方法吸引着我们。我们希望通过探索实践去实现它,在这次学习中从实践和实际的项目中提高我们的编程能力。
1.2 开发流程
整个程序的编辑流程图如图1-1所示,分为六个步骤:
1. 查阅文献,确定教程内容。通过查阅VC游戏程序制作的相关书籍,观看相关视频资料,确定游戏内容,并进行本游戏程序的编写。
2. 迷宫地图及其他图片的处理。设计主界面。运用Adobe photoshop CS3图形处理软件设计,制作本视频教程的主界面。
调整
、修
改
图1-1 开发流程图
3. 初期化迷宫数组函数
4. 寻找路径函数
5. 测试程序。对程序的各个部分进行测试,找出程序中的不足之处。针对出现的
问题,进行修改。
6. 完善教程。对于教程中的不足之处,再次进行完善。
1.3 开发工具介绍
本游戏程序主要采用了Visual C++6.0程序编辑软件和Adobe photoshop CS3图片处理软件。利用Visual C++6.0进行主要程序模块的编写。利用Adobe photoshop CS3对游戏中的图片进行编辑,然后写入主程序模块中,最后形成一个完整的小兔子走迷宫游戏程序。
1.3.1 Visual C++6.0程序编辑软件
isual C++是由美国微软公司推出的一个强大的Windows应用程序开发平台。它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。它由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。
1.3.2 Adobe photoshop CS3
Photoshop CS3是由微软公司推出的,与DW和FLASH合称为软件三剑客,它有着图片处理的各项功能,与之前的版本最大的改变是工具箱,变成可伸缩的,可为长单条和短双条。性能峰值很高,能够在基于 Intel 和 PowerPC 的 Macintosh 计算机上和在 Microsoft Windows XP 和 Windows Vista 系统上的本机性能。图1-2是Adobe photoshop CS3主操作界面。图1-3是Adobe photoshop CS3编辑后的背景图片。
图1-2 Adobe photoshop CS3主操作界面
图1-3 Adobe photoshop CS3编辑后的背景图片
第2章 小兔子走迷宫设计
2.1 小兔子走迷宫的阐述
2.1.1 设计理念
能够效率很高的把游戏运行,游戏中,迷宫地图分为两块,分别是左右两块,左边是小地图,右边是大地图,兔子可以根据方向键进行选择,当碰到障碍物时,就不能前进,必须返回,出口只有一个。
2.1.2 具备的功能
利用方向键兔子走动,左边为小地图,右边大地图。
第3章 系统功能实现
3.1 模块编码设计
3.1.1 上下左右控制键的定义
// Download by http://www.codefans.net
#include
#include
#include
#include
#include
extern unsigned int g_I;
int //全局计数器 UpIdx[]={1,2,1,2,4,3,4};//7个
void CRabbit::New(CBmp24*p,int w,int h,CMazeView*pView)
{
m_v=5;
m_Direct=0;
m_Wait=4;
m_pMazeView=pView;
CAnimCtrl::New(p,0,0);
m_x
m_y
}
int
{
if(IsMultiKey())m_v=4;//斜着走,速度分量减小,保证合速度差不多
else{m_v=5;}//单一方向走
if(Key_Up)MoveUp();
if(Key_Down)MoveDown();
if(Key_Left) MoveLeft();
= (w-2)*64+32; = (h-2)*64+40; CRabbit::Play(void*)
if(Key_Right)MoveRight();
}
int CRabbit::bHitLeft()
{ if(m_x-m_v
int i = ( m_x - m_v )/64;
if(m_Wait>10) { } m_Wait++; if(bSucceed()) return 1; return 0; //是否撞到左边 switch(m_Direct) { case 0://向下 m_pBmp=&DownWaitBmp; SetFlip(0); break; case 1://向上 m_pBmp=&UpWaitBmp; SetFlip(0); break; case 2://向右 m_pBmp=&LeftWaitBmp; SetFlip(1); break; case 3://向左 } if(g_I%10==0) SetIdx((g_I/10)); m_pBmp=&LeftWaitBmp; SetFlip(0); break;
if( g_MazeMap[i][j]
return 1;
j = ( m_y + RABBIT_CY )/64;
if( g_MazeMap[i][j]
}
int CRabbit::bHitRight()
{
int i = ( m_x + m_v + RABBIT_CX)/64;
int j = m_y/64;
if( g_MazeMap[i][j]
return 1;
j = ( m_y + RABBIT_CY )/64;
if( g_MazeMap[i][j]
}
int CRabbit::bHitTop()
{
if(m_y-m_v
int i = m_x /64;
int j = ( m_y - m_v ) /64;
if( g_MazeMap[i][j]
return 1;
i = ( m_x + RABBIT_CX ) /64;
if( g_MazeMap[i][j]
}
int CRabbit::bHitBottom()
{
return 1; return 0; //是否撞到右边 return 1; return 0; //是否撞到上边 return 1; return 0; //是否撞到下边
int j = ( m_y + m_v + RABBIT_CY ) /64;
if( g_MazeMap[i][j]
return 1;
i = ( m_x + RABBIT_CX ) /64;
if( g_MazeMap[i][j]
}
int CRabbit::bSucceed()
{
}
void CRabbit::MoveLeft()
{
m_pBmp=&LeftRabbitBmp;
if(!bHitLeft())
{
}
SetIdx(g_I);
SetFlip(0);
m_Wait=0;
m_Direct=3;
}
void CRabbit::MoveRight()
{
return 1; return 0; //是否已经胜利 if( m_x GetX() + PM_CX/2 > m_x) &m_pMazeView->AddXY(-m_v,0); (m_pMazeView->GetX()-m_v > 0) )
m_pBmp=&LeftRabbitBmp;
if(!bHitRight())
{
AddXY(m_v,0);
if( ( m_pMazeView->GetX() + PM_CX/2 GetX()+m_v m_MaxX) )
}
SetIdx(g_I);
SetFlip(1);
m_Wait=0;
m_Direct=2;
}
void CRabbit::MoveUp()
{
m_pBmp=&UpRabbitBmp;
if(!bHitTop())
{
AddXY(0,-m_v);
if(( m_pMazeView->GetY() + PM_CY/2 > m_y ) && (m_pMazeView->GetY() - m_v >0 ) )
}
SetIdx(g_I);
SetFlip(0);
m_Wait=0;
m_Direct=1;
}
void CRabbit::MoveDown()
{ } m_pMazeView->AddXY(m_v,0); { } m_pMazeView->AddXY(0,-m_v);
{
m_pBmp=&DownRabbitBmp;
if(!bHitBottom())
{
}
SetIdx(g_I);
SetFlip(0);
m_Wait=0;
m_Direct=0;
}
void CRabbit::Draw(CBmp24*p)
{
int x =m_x - m_pMazeView->GetX() +PM_X-RABBIT_VX;
int y = m_y - m_pMazeView->GetY() +PM_Y-RABBIT_VY;
m_pBmp->DrawBmp(p,x,y,m_Idx,m_EffectFlag);
}
CRabbit::CRabbit(){}
CRabbit::~CRabbit(){}
3.1.2 游戏程序图片处理程序
// WorkThread.cpp: implementation of the CWorkThread class.
// Download by http://www.codefans.net
//////////////////////////////////////////////////////////////////////
#include
#include
#include
AddXY(0,m_v); if(( m_pMazeView->GetY() + PM_CY/2 GetY()+ { } m_pMazeView->AddXY(0,m_v); m_v m_MaxY ) )
#include
#include
#include
#include
#include
#include
#include
//======================================================================================
CAnimCtrl
CAnimCtrl BkAnim1,BkAnim2; foregroundAnim;
//背景图片控制 //前景图片控制 //游戏前奏上的左右出口标志 CAnimCtrlEx
CAnimCtrlEx
CPreRabbit
CRabbit LeftExit,RightExit; Cloudy; //播放云雾效果 PreRabbit; //游戏前奏中的兔子 MyRabbit;
MazeView;
//兔子控制 //迷宫视野控制 CMazeView unsigned int g_I=0; //全局计数器
//==================================================================================
DWORD WorkFun(void*,CThread*p)
{
CBmp24* pBmp;
int m_State=PRE_GAME_INIT;
LoadAnimDate();
Sleep(30);
ClearAllKey();
while(!p->IsStop())
{
ReadKey(); switch(m_State) {
case PRE_GAME_INIT://游戏前奏初始画 g_AnimList.ClearAllAnim(); PreRabbit.New(&DownWaitBmp,288,230); PreRabbit.SetHide(1); PreRabbit.SetDepth(1);//设置图片的显示的深度 BkAnim1.New(&BkBmp,0,100); BkAnim2.New(&BkBmp,320,100); BkAnim2.SetFlip(1); LeftExit.New(&LeftExitBmp,-5,240,g_LeftExitFrm,FRAME_REPEAT); RightExit.New(&LeftExitBmp,590,240,g_LeftExitFrm,FRAME_REPEAT); Cloudy.New(&CloudyBmp,0,0,g_CloudyFrm,FRAME_PLAY_ONCE); Cloudy.SetHide(1); RightExit.SetFlip(1); g_MemDC.FadeOut(); m_State=CLOUDY_PLAY_INIT; break; case CLOUDY_PLAY_INIT://雨雾效果初始化 Cloudy.SetHide(0); m_State=CLOUDY_PLAY; break; case CLOUDY_PLAY://播放云雾效果之后,显示兔子 if(Cloudy.Play(0)) { } break; Cloudy.Delete(); PreRabbit.SetHide(0); m_State=PRE_GAME_PLAY; case PRE_GAME_PLAY://游戏前奏 LeftExit.Play(0); RightExit.Play(0);
if(PreRabbit.Play(0)) { } m_State=MAZE_GAME_INIT; g_MemDC.FadeIn(); break; case MAZE_GAME_INIT://迷宫游戏初始化 g_AnimList.ClearAllAnim(); MazeView.New(g_MazeWidth,g_MazeHeight);//视野类里创建了迷宫,和迷宫出口等
MyRabbit.New(&DownWaitBmp,g_MazeWidth,g_MazeHeight,&MazeView);//自己控制的兔子
} //===========刷新画面 foregroundAnim.New(&foregroundBmp,0,0);//罩在地图上的框图 g_MemDC.FadeOut(); m_State=MAZE_GAME_PLAY; break; case MAZE_GAME_PLAY://控制兔子走迷宫 MazeView.Play(0);//其实,视野在播放迷宫出口的动画 if(MyRabbit.Play(0))//控制兔子走迷宫 { } m_State=PRE_GAME_INIT; g_MemDC.FadeIn(); break;
====================================================
pBmp=g_MemDC.GetBmp(); g_AnimList.ShowAllAnim(pBmp);//将所有的动画图片都先画到g_MemDC的m_ScreenBmp
g_MemDC.Draw();//画到m_hMemDC
//=============全局计数器
==================================================
}
return 0;
} g_I++; if(g_I>0xfffe) g_I=0;
3.2 开发过程中存在的问题与解决情况
由于各种各样的原因,在开发过程中,我遇到了许多技术上的问题,但是通过与指导老师的沟通,再加上自己的努力终于把问题一一解决了,例如:
1. 在主程序中,不能很快的找到数据定义的类型。通过老师的指导知道,直
接右击然后有直接查找,就省掉一部分时间去一个个程序的查找
2. 由于程序复杂,在定义类型时总是混乱。经过两人分析,同学一起商讨,
理清了思路,先画分析图,再定义
结束语
1. 案例设计说明总结
迷宫游戏,一种益智游戏,深受大人小孩的喜欢,我们模拟编写了一个迷宫游戏程序,我们通过这次程序设计增强了自己的实践动手能力,充分利用自己在课堂上学习到的知识,增强自己的团队合作精神,不断积蓄自己的知识,熟练掌握各种编程技巧。
为了设计小游戏程序,并且使游戏能够具备充实性和有趣性,我们小组研究了许多这方面的资料,主要包括:游戏故事、游戏界面设计、游戏操作控制等。我们小组的游戏规模虽然不大,也是我们初次学习,利用我们课上所学和翻书查阅的知识编写了这个小兔子走迷宫的小游戏。主要实现迷宫图从文件的读入,然后显示在屏幕上,小兔子的行走,碰撞的判断等等。
2.案例设计的体会
通过几个星期的努力,总算把程序设计给完成了,这是一坚苦而又漫长的过程。看着我们的劳动成果,很欣慰!在这短短的实践中,虽然编得不是很完善,但不管怎么样,对我们来说这就是一个突破。还记得刚开始时,进展可以用一筹莫展来形容,可是我们还是坚持下来了,在这期间,我明白了人是在与他人交往中认识世界,在交流中不断调整和修正自己的错误,从而使之更全面,更透彻。
整个程序实践设计终于完成了,完成得好辛苦,好艰难,但还是顺利的完成了。我们付出了很多心血和汗水,但我认为我们得到的更多。如果没有同学们的互相帮助,这次课程设计就不会这么顺利,这种同舟共济的团队精神深深震撼了我,《礼记学记》上也有讲过:“独学面无友,则孤漏而寡闻”。在此过程中,我体会到了失败后的失落,同时也体会到了成功后的喜悦,也许在以后的学习生活中我会更加体会到这一点,也明白了集体的智慧是伟大的。同时,也离不开老师的监督和指导。我不知道如果没有各位老师们的监督和指导,我会有什么样的成果,但我可以肯定的说,是老师的无私付出提升了我融入其中的心血的价值。所以在此我们非常感谢老师的指导。
由于本次设计时间及我们小组的能力有限,所以该程序设计还有许多不尽如人意的地方,游戏实现所采用的技术有待于进一步的改进。具体有以下几点可以改善:
⑴ 案例设计的典型性原则还需进一步体现,画面缺乏凝聚力。 ⑵ 设计材料还需要进一步查找添加,使其更具丰富有趣。
⑶ 案例设计的可实现性原则需要进一步落实,因为前期的脚本设计遇到“可实现性”这一原则就修改了好多次,才能切实进行素材收集。
参考文献
[1] 罗伟坚. Visual C++经典游戏程序设计. 人民邮电出版社.2006
[2] 陈清华.Visual C++课程设计案例精选与编程指导.东南大学出版社 2004 [3] 魏亮, 李春葆编著.Visual C++程序设计例学与实践.清华大学出版社 .2006 [4] 郑阿奇. Visual C++ 实用教程(第2版). 电子工业出版社.2003 [5] 向世明. visual c++数字图象与图形处理 电子工业出版社 2005 [6] 荣钦科技.VISUAL C++游戏设计.北京科海电子出版社 2005
[7] 张宏林VISUAL C++数字图像模式识别技术及工程实践 人民邮电出版社 2004 [8] 汪晓华等VISUAL C++网络通信协议分析与应用实现 人民邮电出版社 2004 [9] 刘长明等.VISUAL C++实践与提高--多媒体篇 中国铁道出版社 2003 [10] 陈坚等.VISUAL C++网络高级编程.人民邮电出版社 2003
致谢
这是我们第一次团队组合编程,无论是从知识学习还是合作精神,收获都很大。课程设计中感受到我们自在的知识还不够充实,需要学习的东西还很多,不能总是局限于书本。在课程设计中出现问题时,应该及时与同组成员交流,多交流才能使学到的东西更深入到心里,总之,这是一次不错的锻炼,在过程中学到的学习方法是受益终生的!
课程设计结束了,但感觉收获了很多,不仅仅是完成了任务,更让我了解到身边同学的好,老师的好,这不仅仅是一个课程设计,以后还要面对各种各样的困难和挑战,只要坚持,找到正确的方法,相信一切困难都会克服的。
另外,我们要感谢赵老师对我们程序不足之处的指导以及一些操作,让我们更进一步了解到了Visual C++的魅力,让我们再以后的学习中更加坚定的走完IT这条道路。
附录 小兔子走迷宫游戏部分程序
AnimDate.h
#ifndef _ANIMDATE_H__ #define _ANIMDATE_H__ #pragma once
//================================================================================== #include
//===============================================================================
void LoadAnimDate();//加载所有的图片
//============================================================================== extern CBmp24 extern CBmp24
BkBmp;
//背景图片 //前景图片 //向左走的兔子
//向下走的兔子
foregroundBmp; LeftRabbitBmp; DownRabbitBmp; UpRabbitBmp; LeftWaitBmp; DownWaitBmp; UpWaitBmp; LeftExitBmp; UpExitBmp; CloudyBmp; MazeWall[5];
extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CBmp24
//向上走的兔子 //向左等待的兔子 //向下等待的兔子
//向上等待的兔子
//向左的出口 //向上的出口
//用来播放云雾效果的图片 //用来拼凑迷宫的5张图片
//=================================================================================
extern SAnimFrame extern SAnimFrame extern SAnimFrame
g_LeftExitFrm[]; //向左的迷宫出口动画帧 g_UpExitFrm[]; g_CloudyFrm[];
//向上的迷宫出口动画帧 //云雾效果动画帧
//================================================================================== #endif CreateMap.h
#ifndef _CREATEMAP_H_ #define _CREATEMAP_H_ #pragma once
//=============================================================================== #include
//===============================================================================
void CreateMap(int w,int h,POINT* pExit); 返回出口
//================================================================================== extern int extern int #define #define extern int
g_MazeWidth; g_MazeHeight;
//迷宫地图宽度 //迷宫地图高度
//迷宫的最大宽度 //迷宫的最大高度
//描述迷宫地图数组
//创建大小为w*h的迷宫地图,pExit
MAX_MAZE_WIDTH MAX_MAZE_HEIGHT
100 100
g_MazeMap[][MAX_MAZE_HEIGHT+1];
//=================================================================================== #endif
CreateMap.cpp
// Download by http://www.codefans.net #include
#include
//==================================================================================== int int int
g_MazeWidth; g_MazeHeight;
//迷宫地图宽度 //迷宫地图高度
//迷宫
g_MazeMap[MAX_MAZE_WIDTH+1][MAX_MAZE_HEIGHT+1]={0};
地图数组
//=======================迷宫地图的随机创建模块
========================================================== typedef struct {
int tag; int x,y;
//在数组里标记的数字
//在数组中的位置g_MazeMap[x][y]; //x,y的移动方向
//在一个方向上连续挖地图的长度
//x的最大值 //y的最大值
int vx,vy; int step; int maxX; int maxY;
}SDigMap;
//====================================================================
void ClearMap(int w,int h)//将表示迷宫地图的数组置零 {
g_MazeWidth=w; g_MazeHeight=h; int i,j;
for(i=0;i
for(j=0;j
}
}
g_MazeMap[i][j]=0;
srand(time(0));
//=====================================================================================
void DigIt(SDigMap *p)//将该处挖掉,即打标记 { }
//=====================================================================================
void Walk(SDigMap *p)//挖地图的坐标前移 {
p->x
p->y
+= p->vx; += p->vy;
g_MazeMap[
p->x ][ p->y ] = p->tag;
}
//=====================================================================================
int IsNextDigged(int x,int y,int vx,int vy,SDigMap *p)//判断下一个坐标是否被给该对象挖掉 { }
//==========================================================================================
void HitWall(SDigMap *p)//挖地图的坐标如撞墙,则反向 {
if( p->x + p->vx x + p->vx > p->maxX)
if( g_MazeMap[ x + vx ][ y + vy ] == p->tag ) return 1; else
return 0;
p->vx = -p->vx;
}
if( p->y + p->vy y + p->vy > p->maxY)
p->vy = -p->vy;
//======================================================================================
int CanNextBeDigged(SDigMap *p)//检测下一个点是否可以挖 {
int x = p->x + p->vx;
int y = p->y + p->vy; //下一点的坐标
//与原方向转弯的方向
int vx = p->vy; int vy = p->vx;
//判断当前点的下一个点的三个邻点是否被自己挖过,如果被自己挖过,下一点不
能挖了,否则把自己挖通了
if( IsNextDigged( x, y, p->vx, p->vy, p ) ) return 0;//前一点是否被挖 if( IsNextDigged( x, y, vx, vy, p ) ) return 0;//左一点是否被挖 if( IsNextDigged( x, y, -vx, -vy, p ) ) return 0;//右一点是否被挖 return 1; }
//====================================================================================
void Jump(SDigMap *p)//跳过下一点,跳到下一点的周围三个点上 {
int vx=p->vy; int vy=p->vx;
//与原方向转弯的两个方向 //先走到下一点上 //周围都没被挖,看来可以被挖
Walk(p);
if( IsNextDigged( p->x, p->y, p->vx, p->vy, p ) ) //前一点被挖,走过去 {
Walk(p); }
else if(IsNextDigged( p->x, p->y, vx, vy, p )) //左一点被挖,走过去 {
p->x += vx;
p->y += vy; }
else if(IsNextDigged( p->x, p->y, -vx, -vy, p)) //右一点被挖,走过去 {
p->x -= vx;
p->y -= vy; } }
//=====================================================================================
int IsLinked(SDigMap *p)//检查是否挖通 {
int vx=p->vy;
int vy=p->vx;//与原方向转弯的两个方向
//如果改点的三个邻点,既不是自身标记又不是0,则该点被别的SDigMap
挖过,既已经挖通了
if( g_MazeMap[ p->x+vy ][ p->y+vx ] != p->tag &&
g_MazeMap[ p->x+vy ][p->y+vx ] !=0 ) return 1; //前一个点是否被别的挖
if( g_MazeMap[ p->x+vx ][ p->y+vy ] != p->tag &&
g_MazeMap[ p->x+vx ][ p->y+vy ] != 0 ) return 1; //左一个点是否被别的挖
if( g_MazeMap[ p->x-vx ][ p->y-vy ] != p->tag &&
g_MazeMap[ p->x-vx ][ p->y-vy ] != 0 ) return 1;//右一个点是否被别的挖 }
//=====================================================================================
void RandomVxy(SDigMap *p)//产生随机方向
return 0;
{
int vx=p->vy;
int vy=p->vx;
int k=rand()%50;
//将随机数3个空间,原方向必将改变
if( 0
{ p->vx = -vx;
}
if( 10
{
p->vx = -vy;
p->vy = -vx; p->vy = -vy;
} } if( 30vx = vy; p->vy = vx;
//=====================================================================================
int ContinuouslyDig( SDigMap *p )//连续挖
{
int i=0; RandomVxy( p );//产生一个随机方向 p->step =1+rand()%2;//随机产生在该方向上挖的连续步长
while( i
step )
{
HitWall( p ); //首先检测是否撞墙,如果撞墙方向取反
//对于下一点的三种策略:1走过 2走过去挖掉 3跳过去 if(IsNextDigged(p->x,p->y,p->vx,p->vy,p))//检测下一点是否被自己挖过 Walk(p);//已经被挖,走过去 else if( CanNextBeDigged( p ) )//没有被挖,是否可以挖 {
} Walk( p );//可以挖,走过去, DigIt( p );//挖掉 if( IsLinked( p ) ) return 1;//如果挖通,跳出循环,并返回
} else Jump( p );//不可以挖,跳过去 i++;
} return 0;
//=====================================================================================
int bSeed(int x,int y)//是否可以作为种子
{
}
//=====================================================================================
void ImproveMap(int w,int h)//改善迷宫
{
int i,j;
//改点和四个邻点都没被挖,则可以从该点开始挖地图 if( g_MazeMap[x][y] != 0 ) return 0; if( g_MazeMap[x-1][y] != 0 ) return 0; if( g_MazeMap[x][y-1] != 0 ) return 0; if( g_MazeMap[x+1][y] != 0 ) return 0; if( g_MazeMap[x][y+1] != 0 ) return 0; return 1;
int bLink=0; //判断地图是否挖通 y vx vy step maxX maxY w-2, h-2};//标号为1,从坐标(1,1)开//SDigMap: tag x SDigMap m={ 3, 1, 1, 1, 0, 1,
始挖
for( i=1; i
if(bSeed( i, j )==1)
{ m.tag=tag; m.x=i; m.y=j; tag++; DigIt(&m); bLink=0; while( !bLink )
bLink=ContinuouslyDig( &m );
}
//=====================================================================================
void RandomExit(SDigMap *p,int w,int h,POINT* pExit)//pExit返回迷宫出口
{
//设置随即出口,随机出口位置可为左上角,坐下角,右上角 int k=rand()%60; if( 0x=1; p->y=1;
} }
} } pExit->y=1; else if( 30x][pExit->y]=1;//先将迷宫出口挖掉 p->x=w-2; p->y=1; pExit->x=w-2; pExit->y=0; p->x=1; p->y=h-2; pExit->x=0; pExit->y=h-2;
//========================================================================================
void CreateMap(int w,int h,POINT* pExit)//创建迷宫地图,地图大小为w*h,pExit返回出口坐标
{
//SDigMap: tag x y vx 1, vy 0, step maxX 1, w-2, maxY h-2};//SDigMap m1={ 1, 1, 1,
标号为1,从坐标(1,1)开始挖
SDigMap m2={ 2, w-2, h-2, -1, 0, 1, w-2, h-2};//标号为2,从坐标(N,N)开始挖
int bLink=0; //判断地图是否挖通
ClearMap(w,h);//首先,全部清零 RandomExit(&m1,w,h,pExit);//随机设置老鼠出口 DigIt( &m1 ); //初始点先挖掉 DigIt( &m2 );//老鼠在右下角 while( !bLink )//从两边同时挖,先挖出从开始处到出口的通路 { bLink = ContinuouslyDig( &m1 );//从入口开始的挖图对象,随机方向,随机步长,返回是否挖通
} ImproveMap(w,h);//改进地图,将大片没被挖的地方,多挖出一些通道,让地图更加if(!bLink) bLink=ContinuouslyDig( &m2 );//从迷宫最深处开始的挖图对像 迷人,嘿嘿!
}
JIANGSU TEACHERS UNIVERSITY OF TECHNOLOGY
本科毕业设计(论文)
Visual C++程序设计与应用报告
——小兔子走迷宫游戏
学院名称: 计算机工程学院
专 业: 计算机技术与应用
班 级: 09计2Z
2009年 06月
Visual C++程序设计与应用教程游戏设计与开发
摘 要:随着计算机技术的普及和发展,计算机的应用已经渗透到国民经济与人们生活的各个方面,掌握一门计算机编程语言已成为现代大学生应该具备的基本技能之
一。Visual C++软件使用是《Visual C++程序设计与应用教程》课程学习中的基础内容。
本文首先对Visual C++程序设计与应用教程的开发背景、开发工具等进行概述,并从学习者特征、教学内容和功能等方面进行详细需求分析,然后对小兔子走迷宫游戏程序设计的总体设计、开发实现方法和关键技术进行具体介绍,包括大小地图和方向键控制等。
关键词:计数器,Counter,刷新画面,Refresh screen
Visual C + + programming and application design and
development tutorial game
Abstract: With the popularization and development of computer technology, computer applications have penetrated into the national economy and all aspects of people's lives, to master a computer programming language has become a modern university should have one of the basic skills. Visual C + + software is a
This article first Visual C + + programming tutorial and application development background, development tools overview, and from the characteristics of learners, teaching content and function, and so a detailed needs analysis, and then rabbit maze game programming overall design, development and implementation of specific key technologies introduced, including the size of the map and the arrow keys to control
Keywords: Counter, Counter, refresh the screen, Refresh screen
目录
序言 ........................................................... 1
第1章 概 述 ................................................. 2
1.1 系统开发背景和意义 .............................................. 2
1.2 开发流程 ........................................................ 2
1.3 开发工具介绍 .................................................... 4
1.3.1 Visual C++6.0程序编辑软件 ................................ 4
1.3.2 Adobe photoshop CS3 ...................................... 4
第2章 小兔子走迷宫设计 ....................................... 6
2.1 小兔子走迷宫的阐述 .............................................. 6
2.1.1 设计理念 ................................................. 6
2.1.2 具备的功能 ............................................... 6
第3章 系统功能实现 ........................................... 7
3.1 模块编码设计 .................................................... 7
3.1.1 上下左右控制键的定义 ..................................... 7
3.1.2 游戏程序图片处理程序 .................................... 12
3.2 开发过程中存在的问题与解决情况 ................................. 16
结束语 ........................................................ 17
参考文献 ...................................................... 19
致谢 .......................................................... 20
附录 小兔子走迷宫游戏部分程序 ................................ 21
序言
Visual C++(简称VC++)是20世纪90年代中期由美国微软公司推出的一个强大的Windows应用程序开发平台,是“真正的程序员”首选的开发工具之一,也是有志于程序设计的程序员、大中专院校学生进入高级程序设计领域的首选软件之一。
随着社会发展,人们生活节奏加快,计算机的更新,地球村已不再是一个遥不可及的梦想。我们可以通过计算机获取各种我们想要的信息,查找各种资料,如文献期刊、教育论文、产业信息、留学计划、求职求才、气象信息、海外学讯、论文检索等。您甚至可以坐在电脑前,让电脑带您到世界各地作一次虚拟旅游。只要我们掌握了在计算机这片浩瀚的信息海洋中遨游的方法,您就能在生活中得到无限的信息宝藏。
作为计算机科学与技术班的学生,《Visual C++程序设计与应用教程》这一门科学深深的吸引着我们,原先不管是国内还是国外都喜欢把这个系分为计算机软件理论、计算机系统、计算机技术与应用。后来又合到一起,变成了现在的计算机科学与技术。我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易,但计算机专业的优势是:我们掌握许多其他专业并不“深究”的东西,例如,游戏的编程,算法,体系结构,软件的熟练运用等等。
第1章 概 述
1.1 系统开发背景和意义
随着信息技术的飞速发展,各种学习资源越来越受到人们的重视,特别是游戏教程。它以其逼真的画面,简单精练的操作,人性化的开发脑智力不断受到青少年学者的青睐。而迷宫则是儿童智力游戏的一种,它可以锻炼人的思维能力。当我们在一个迷宫中时怎样避免重复的走一些路,避免怎样走投无路,无路可走,什么样的迷宫可以走,怎样就知道迷宫无出口了,通过动脑子想办法,既丰富了大脑又加强了胆识。
网络的快速发展,使得越来越多的人参与到游戏程序制作的行列之中。社会对游戏编程人员的需求越来越大,其中以VC编程最为显著。Visual C++是由美国微软公司推出的一个强大的Windows应用程序开发平台。它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。它由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。为此,各大高职院校纷纷开设了游戏编程的相关课程。计算机应用专业也不例外。但是该软件的学习除了老师课堂讲授外,还需要学生课后的自学练习。
迷宫是家喻户晓的益智小游戏,选择这个题目一是为了能够运用这学期所学习的知识,二是我们从小就接触到这个游戏,它的实现方法吸引着我们。我们希望通过探索实践去实现它,在这次学习中从实践和实际的项目中提高我们的编程能力。
1.2 开发流程
整个程序的编辑流程图如图1-1所示,分为六个步骤:
1. 查阅文献,确定教程内容。通过查阅VC游戏程序制作的相关书籍,观看相关视频资料,确定游戏内容,并进行本游戏程序的编写。
2. 迷宫地图及其他图片的处理。设计主界面。运用Adobe photoshop CS3图形处理软件设计,制作本视频教程的主界面。
调整
、修
改
图1-1 开发流程图
3. 初期化迷宫数组函数
4. 寻找路径函数
5. 测试程序。对程序的各个部分进行测试,找出程序中的不足之处。针对出现的
问题,进行修改。
6. 完善教程。对于教程中的不足之处,再次进行完善。
1.3 开发工具介绍
本游戏程序主要采用了Visual C++6.0程序编辑软件和Adobe photoshop CS3图片处理软件。利用Visual C++6.0进行主要程序模块的编写。利用Adobe photoshop CS3对游戏中的图片进行编辑,然后写入主程序模块中,最后形成一个完整的小兔子走迷宫游戏程序。
1.3.1 Visual C++6.0程序编辑软件
isual C++是由美国微软公司推出的一个强大的Windows应用程序开发平台。它不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。它由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Microsoft的主力软件产品。
1.3.2 Adobe photoshop CS3
Photoshop CS3是由微软公司推出的,与DW和FLASH合称为软件三剑客,它有着图片处理的各项功能,与之前的版本最大的改变是工具箱,变成可伸缩的,可为长单条和短双条。性能峰值很高,能够在基于 Intel 和 PowerPC 的 Macintosh 计算机上和在 Microsoft Windows XP 和 Windows Vista 系统上的本机性能。图1-2是Adobe photoshop CS3主操作界面。图1-3是Adobe photoshop CS3编辑后的背景图片。
图1-2 Adobe photoshop CS3主操作界面
图1-3 Adobe photoshop CS3编辑后的背景图片
第2章 小兔子走迷宫设计
2.1 小兔子走迷宫的阐述
2.1.1 设计理念
能够效率很高的把游戏运行,游戏中,迷宫地图分为两块,分别是左右两块,左边是小地图,右边是大地图,兔子可以根据方向键进行选择,当碰到障碍物时,就不能前进,必须返回,出口只有一个。
2.1.2 具备的功能
利用方向键兔子走动,左边为小地图,右边大地图。
第3章 系统功能实现
3.1 模块编码设计
3.1.1 上下左右控制键的定义
// Download by http://www.codefans.net
#include
#include
#include
#include
#include
extern unsigned int g_I;
int //全局计数器 UpIdx[]={1,2,1,2,4,3,4};//7个
void CRabbit::New(CBmp24*p,int w,int h,CMazeView*pView)
{
m_v=5;
m_Direct=0;
m_Wait=4;
m_pMazeView=pView;
CAnimCtrl::New(p,0,0);
m_x
m_y
}
int
{
if(IsMultiKey())m_v=4;//斜着走,速度分量减小,保证合速度差不多
else{m_v=5;}//单一方向走
if(Key_Up)MoveUp();
if(Key_Down)MoveDown();
if(Key_Left) MoveLeft();
= (w-2)*64+32; = (h-2)*64+40; CRabbit::Play(void*)
if(Key_Right)MoveRight();
}
int CRabbit::bHitLeft()
{ if(m_x-m_v
int i = ( m_x - m_v )/64;
if(m_Wait>10) { } m_Wait++; if(bSucceed()) return 1; return 0; //是否撞到左边 switch(m_Direct) { case 0://向下 m_pBmp=&DownWaitBmp; SetFlip(0); break; case 1://向上 m_pBmp=&UpWaitBmp; SetFlip(0); break; case 2://向右 m_pBmp=&LeftWaitBmp; SetFlip(1); break; case 3://向左 } if(g_I%10==0) SetIdx((g_I/10)); m_pBmp=&LeftWaitBmp; SetFlip(0); break;
if( g_MazeMap[i][j]
return 1;
j = ( m_y + RABBIT_CY )/64;
if( g_MazeMap[i][j]
}
int CRabbit::bHitRight()
{
int i = ( m_x + m_v + RABBIT_CX)/64;
int j = m_y/64;
if( g_MazeMap[i][j]
return 1;
j = ( m_y + RABBIT_CY )/64;
if( g_MazeMap[i][j]
}
int CRabbit::bHitTop()
{
if(m_y-m_v
int i = m_x /64;
int j = ( m_y - m_v ) /64;
if( g_MazeMap[i][j]
return 1;
i = ( m_x + RABBIT_CX ) /64;
if( g_MazeMap[i][j]
}
int CRabbit::bHitBottom()
{
return 1; return 0; //是否撞到右边 return 1; return 0; //是否撞到上边 return 1; return 0; //是否撞到下边
int j = ( m_y + m_v + RABBIT_CY ) /64;
if( g_MazeMap[i][j]
return 1;
i = ( m_x + RABBIT_CX ) /64;
if( g_MazeMap[i][j]
}
int CRabbit::bSucceed()
{
}
void CRabbit::MoveLeft()
{
m_pBmp=&LeftRabbitBmp;
if(!bHitLeft())
{
}
SetIdx(g_I);
SetFlip(0);
m_Wait=0;
m_Direct=3;
}
void CRabbit::MoveRight()
{
return 1; return 0; //是否已经胜利 if( m_x GetX() + PM_CX/2 > m_x) &m_pMazeView->AddXY(-m_v,0); (m_pMazeView->GetX()-m_v > 0) )
m_pBmp=&LeftRabbitBmp;
if(!bHitRight())
{
AddXY(m_v,0);
if( ( m_pMazeView->GetX() + PM_CX/2 GetX()+m_v m_MaxX) )
}
SetIdx(g_I);
SetFlip(1);
m_Wait=0;
m_Direct=2;
}
void CRabbit::MoveUp()
{
m_pBmp=&UpRabbitBmp;
if(!bHitTop())
{
AddXY(0,-m_v);
if(( m_pMazeView->GetY() + PM_CY/2 > m_y ) && (m_pMazeView->GetY() - m_v >0 ) )
}
SetIdx(g_I);
SetFlip(0);
m_Wait=0;
m_Direct=1;
}
void CRabbit::MoveDown()
{ } m_pMazeView->AddXY(m_v,0); { } m_pMazeView->AddXY(0,-m_v);
{
m_pBmp=&DownRabbitBmp;
if(!bHitBottom())
{
}
SetIdx(g_I);
SetFlip(0);
m_Wait=0;
m_Direct=0;
}
void CRabbit::Draw(CBmp24*p)
{
int x =m_x - m_pMazeView->GetX() +PM_X-RABBIT_VX;
int y = m_y - m_pMazeView->GetY() +PM_Y-RABBIT_VY;
m_pBmp->DrawBmp(p,x,y,m_Idx,m_EffectFlag);
}
CRabbit::CRabbit(){}
CRabbit::~CRabbit(){}
3.1.2 游戏程序图片处理程序
// WorkThread.cpp: implementation of the CWorkThread class.
// Download by http://www.codefans.net
//////////////////////////////////////////////////////////////////////
#include
#include
#include
AddXY(0,m_v); if(( m_pMazeView->GetY() + PM_CY/2 GetY()+ { } m_pMazeView->AddXY(0,m_v); m_v m_MaxY ) )
#include
#include
#include
#include
#include
#include
#include
//======================================================================================
CAnimCtrl
CAnimCtrl BkAnim1,BkAnim2; foregroundAnim;
//背景图片控制 //前景图片控制 //游戏前奏上的左右出口标志 CAnimCtrlEx
CAnimCtrlEx
CPreRabbit
CRabbit LeftExit,RightExit; Cloudy; //播放云雾效果 PreRabbit; //游戏前奏中的兔子 MyRabbit;
MazeView;
//兔子控制 //迷宫视野控制 CMazeView unsigned int g_I=0; //全局计数器
//==================================================================================
DWORD WorkFun(void*,CThread*p)
{
CBmp24* pBmp;
int m_State=PRE_GAME_INIT;
LoadAnimDate();
Sleep(30);
ClearAllKey();
while(!p->IsStop())
{
ReadKey(); switch(m_State) {
case PRE_GAME_INIT://游戏前奏初始画 g_AnimList.ClearAllAnim(); PreRabbit.New(&DownWaitBmp,288,230); PreRabbit.SetHide(1); PreRabbit.SetDepth(1);//设置图片的显示的深度 BkAnim1.New(&BkBmp,0,100); BkAnim2.New(&BkBmp,320,100); BkAnim2.SetFlip(1); LeftExit.New(&LeftExitBmp,-5,240,g_LeftExitFrm,FRAME_REPEAT); RightExit.New(&LeftExitBmp,590,240,g_LeftExitFrm,FRAME_REPEAT); Cloudy.New(&CloudyBmp,0,0,g_CloudyFrm,FRAME_PLAY_ONCE); Cloudy.SetHide(1); RightExit.SetFlip(1); g_MemDC.FadeOut(); m_State=CLOUDY_PLAY_INIT; break; case CLOUDY_PLAY_INIT://雨雾效果初始化 Cloudy.SetHide(0); m_State=CLOUDY_PLAY; break; case CLOUDY_PLAY://播放云雾效果之后,显示兔子 if(Cloudy.Play(0)) { } break; Cloudy.Delete(); PreRabbit.SetHide(0); m_State=PRE_GAME_PLAY; case PRE_GAME_PLAY://游戏前奏 LeftExit.Play(0); RightExit.Play(0);
if(PreRabbit.Play(0)) { } m_State=MAZE_GAME_INIT; g_MemDC.FadeIn(); break; case MAZE_GAME_INIT://迷宫游戏初始化 g_AnimList.ClearAllAnim(); MazeView.New(g_MazeWidth,g_MazeHeight);//视野类里创建了迷宫,和迷宫出口等
MyRabbit.New(&DownWaitBmp,g_MazeWidth,g_MazeHeight,&MazeView);//自己控制的兔子
} //===========刷新画面 foregroundAnim.New(&foregroundBmp,0,0);//罩在地图上的框图 g_MemDC.FadeOut(); m_State=MAZE_GAME_PLAY; break; case MAZE_GAME_PLAY://控制兔子走迷宫 MazeView.Play(0);//其实,视野在播放迷宫出口的动画 if(MyRabbit.Play(0))//控制兔子走迷宫 { } m_State=PRE_GAME_INIT; g_MemDC.FadeIn(); break;
====================================================
pBmp=g_MemDC.GetBmp(); g_AnimList.ShowAllAnim(pBmp);//将所有的动画图片都先画到g_MemDC的m_ScreenBmp
g_MemDC.Draw();//画到m_hMemDC
//=============全局计数器
==================================================
}
return 0;
} g_I++; if(g_I>0xfffe) g_I=0;
3.2 开发过程中存在的问题与解决情况
由于各种各样的原因,在开发过程中,我遇到了许多技术上的问题,但是通过与指导老师的沟通,再加上自己的努力终于把问题一一解决了,例如:
1. 在主程序中,不能很快的找到数据定义的类型。通过老师的指导知道,直
接右击然后有直接查找,就省掉一部分时间去一个个程序的查找
2. 由于程序复杂,在定义类型时总是混乱。经过两人分析,同学一起商讨,
理清了思路,先画分析图,再定义
结束语
1. 案例设计说明总结
迷宫游戏,一种益智游戏,深受大人小孩的喜欢,我们模拟编写了一个迷宫游戏程序,我们通过这次程序设计增强了自己的实践动手能力,充分利用自己在课堂上学习到的知识,增强自己的团队合作精神,不断积蓄自己的知识,熟练掌握各种编程技巧。
为了设计小游戏程序,并且使游戏能够具备充实性和有趣性,我们小组研究了许多这方面的资料,主要包括:游戏故事、游戏界面设计、游戏操作控制等。我们小组的游戏规模虽然不大,也是我们初次学习,利用我们课上所学和翻书查阅的知识编写了这个小兔子走迷宫的小游戏。主要实现迷宫图从文件的读入,然后显示在屏幕上,小兔子的行走,碰撞的判断等等。
2.案例设计的体会
通过几个星期的努力,总算把程序设计给完成了,这是一坚苦而又漫长的过程。看着我们的劳动成果,很欣慰!在这短短的实践中,虽然编得不是很完善,但不管怎么样,对我们来说这就是一个突破。还记得刚开始时,进展可以用一筹莫展来形容,可是我们还是坚持下来了,在这期间,我明白了人是在与他人交往中认识世界,在交流中不断调整和修正自己的错误,从而使之更全面,更透彻。
整个程序实践设计终于完成了,完成得好辛苦,好艰难,但还是顺利的完成了。我们付出了很多心血和汗水,但我认为我们得到的更多。如果没有同学们的互相帮助,这次课程设计就不会这么顺利,这种同舟共济的团队精神深深震撼了我,《礼记学记》上也有讲过:“独学面无友,则孤漏而寡闻”。在此过程中,我体会到了失败后的失落,同时也体会到了成功后的喜悦,也许在以后的学习生活中我会更加体会到这一点,也明白了集体的智慧是伟大的。同时,也离不开老师的监督和指导。我不知道如果没有各位老师们的监督和指导,我会有什么样的成果,但我可以肯定的说,是老师的无私付出提升了我融入其中的心血的价值。所以在此我们非常感谢老师的指导。
由于本次设计时间及我们小组的能力有限,所以该程序设计还有许多不尽如人意的地方,游戏实现所采用的技术有待于进一步的改进。具体有以下几点可以改善:
⑴ 案例设计的典型性原则还需进一步体现,画面缺乏凝聚力。 ⑵ 设计材料还需要进一步查找添加,使其更具丰富有趣。
⑶ 案例设计的可实现性原则需要进一步落实,因为前期的脚本设计遇到“可实现性”这一原则就修改了好多次,才能切实进行素材收集。
参考文献
[1] 罗伟坚. Visual C++经典游戏程序设计. 人民邮电出版社.2006
[2] 陈清华.Visual C++课程设计案例精选与编程指导.东南大学出版社 2004 [3] 魏亮, 李春葆编著.Visual C++程序设计例学与实践.清华大学出版社 .2006 [4] 郑阿奇. Visual C++ 实用教程(第2版). 电子工业出版社.2003 [5] 向世明. visual c++数字图象与图形处理 电子工业出版社 2005 [6] 荣钦科技.VISUAL C++游戏设计.北京科海电子出版社 2005
[7] 张宏林VISUAL C++数字图像模式识别技术及工程实践 人民邮电出版社 2004 [8] 汪晓华等VISUAL C++网络通信协议分析与应用实现 人民邮电出版社 2004 [9] 刘长明等.VISUAL C++实践与提高--多媒体篇 中国铁道出版社 2003 [10] 陈坚等.VISUAL C++网络高级编程.人民邮电出版社 2003
致谢
这是我们第一次团队组合编程,无论是从知识学习还是合作精神,收获都很大。课程设计中感受到我们自在的知识还不够充实,需要学习的东西还很多,不能总是局限于书本。在课程设计中出现问题时,应该及时与同组成员交流,多交流才能使学到的东西更深入到心里,总之,这是一次不错的锻炼,在过程中学到的学习方法是受益终生的!
课程设计结束了,但感觉收获了很多,不仅仅是完成了任务,更让我了解到身边同学的好,老师的好,这不仅仅是一个课程设计,以后还要面对各种各样的困难和挑战,只要坚持,找到正确的方法,相信一切困难都会克服的。
另外,我们要感谢赵老师对我们程序不足之处的指导以及一些操作,让我们更进一步了解到了Visual C++的魅力,让我们再以后的学习中更加坚定的走完IT这条道路。
附录 小兔子走迷宫游戏部分程序
AnimDate.h
#ifndef _ANIMDATE_H__ #define _ANIMDATE_H__ #pragma once
//================================================================================== #include
//===============================================================================
void LoadAnimDate();//加载所有的图片
//============================================================================== extern CBmp24 extern CBmp24
BkBmp;
//背景图片 //前景图片 //向左走的兔子
//向下走的兔子
foregroundBmp; LeftRabbitBmp; DownRabbitBmp; UpRabbitBmp; LeftWaitBmp; DownWaitBmp; UpWaitBmp; LeftExitBmp; UpExitBmp; CloudyBmp; MazeWall[5];
extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CMultiBmp extern CBmp24
//向上走的兔子 //向左等待的兔子 //向下等待的兔子
//向上等待的兔子
//向左的出口 //向上的出口
//用来播放云雾效果的图片 //用来拼凑迷宫的5张图片
//=================================================================================
extern SAnimFrame extern SAnimFrame extern SAnimFrame
g_LeftExitFrm[]; //向左的迷宫出口动画帧 g_UpExitFrm[]; g_CloudyFrm[];
//向上的迷宫出口动画帧 //云雾效果动画帧
//================================================================================== #endif CreateMap.h
#ifndef _CREATEMAP_H_ #define _CREATEMAP_H_ #pragma once
//=============================================================================== #include
//===============================================================================
void CreateMap(int w,int h,POINT* pExit); 返回出口
//================================================================================== extern int extern int #define #define extern int
g_MazeWidth; g_MazeHeight;
//迷宫地图宽度 //迷宫地图高度
//迷宫的最大宽度 //迷宫的最大高度
//描述迷宫地图数组
//创建大小为w*h的迷宫地图,pExit
MAX_MAZE_WIDTH MAX_MAZE_HEIGHT
100 100
g_MazeMap[][MAX_MAZE_HEIGHT+1];
//=================================================================================== #endif
CreateMap.cpp
// Download by http://www.codefans.net #include
#include
//==================================================================================== int int int
g_MazeWidth; g_MazeHeight;
//迷宫地图宽度 //迷宫地图高度
//迷宫
g_MazeMap[MAX_MAZE_WIDTH+1][MAX_MAZE_HEIGHT+1]={0};
地图数组
//=======================迷宫地图的随机创建模块
========================================================== typedef struct {
int tag; int x,y;
//在数组里标记的数字
//在数组中的位置g_MazeMap[x][y]; //x,y的移动方向
//在一个方向上连续挖地图的长度
//x的最大值 //y的最大值
int vx,vy; int step; int maxX; int maxY;
}SDigMap;
//====================================================================
void ClearMap(int w,int h)//将表示迷宫地图的数组置零 {
g_MazeWidth=w; g_MazeHeight=h; int i,j;
for(i=0;i
for(j=0;j
}
}
g_MazeMap[i][j]=0;
srand(time(0));
//=====================================================================================
void DigIt(SDigMap *p)//将该处挖掉,即打标记 { }
//=====================================================================================
void Walk(SDigMap *p)//挖地图的坐标前移 {
p->x
p->y
+= p->vx; += p->vy;
g_MazeMap[
p->x ][ p->y ] = p->tag;
}
//=====================================================================================
int IsNextDigged(int x,int y,int vx,int vy,SDigMap *p)//判断下一个坐标是否被给该对象挖掉 { }
//==========================================================================================
void HitWall(SDigMap *p)//挖地图的坐标如撞墙,则反向 {
if( p->x + p->vx x + p->vx > p->maxX)
if( g_MazeMap[ x + vx ][ y + vy ] == p->tag ) return 1; else
return 0;
p->vx = -p->vx;
}
if( p->y + p->vy y + p->vy > p->maxY)
p->vy = -p->vy;
//======================================================================================
int CanNextBeDigged(SDigMap *p)//检测下一个点是否可以挖 {
int x = p->x + p->vx;
int y = p->y + p->vy; //下一点的坐标
//与原方向转弯的方向
int vx = p->vy; int vy = p->vx;
//判断当前点的下一个点的三个邻点是否被自己挖过,如果被自己挖过,下一点不
能挖了,否则把自己挖通了
if( IsNextDigged( x, y, p->vx, p->vy, p ) ) return 0;//前一点是否被挖 if( IsNextDigged( x, y, vx, vy, p ) ) return 0;//左一点是否被挖 if( IsNextDigged( x, y, -vx, -vy, p ) ) return 0;//右一点是否被挖 return 1; }
//====================================================================================
void Jump(SDigMap *p)//跳过下一点,跳到下一点的周围三个点上 {
int vx=p->vy; int vy=p->vx;
//与原方向转弯的两个方向 //先走到下一点上 //周围都没被挖,看来可以被挖
Walk(p);
if( IsNextDigged( p->x, p->y, p->vx, p->vy, p ) ) //前一点被挖,走过去 {
Walk(p); }
else if(IsNextDigged( p->x, p->y, vx, vy, p )) //左一点被挖,走过去 {
p->x += vx;
p->y += vy; }
else if(IsNextDigged( p->x, p->y, -vx, -vy, p)) //右一点被挖,走过去 {
p->x -= vx;
p->y -= vy; } }
//=====================================================================================
int IsLinked(SDigMap *p)//检查是否挖通 {
int vx=p->vy;
int vy=p->vx;//与原方向转弯的两个方向
//如果改点的三个邻点,既不是自身标记又不是0,则该点被别的SDigMap
挖过,既已经挖通了
if( g_MazeMap[ p->x+vy ][ p->y+vx ] != p->tag &&
g_MazeMap[ p->x+vy ][p->y+vx ] !=0 ) return 1; //前一个点是否被别的挖
if( g_MazeMap[ p->x+vx ][ p->y+vy ] != p->tag &&
g_MazeMap[ p->x+vx ][ p->y+vy ] != 0 ) return 1; //左一个点是否被别的挖
if( g_MazeMap[ p->x-vx ][ p->y-vy ] != p->tag &&
g_MazeMap[ p->x-vx ][ p->y-vy ] != 0 ) return 1;//右一个点是否被别的挖 }
//=====================================================================================
void RandomVxy(SDigMap *p)//产生随机方向
return 0;
{
int vx=p->vy;
int vy=p->vx;
int k=rand()%50;
//将随机数3个空间,原方向必将改变
if( 0
{ p->vx = -vx;
}
if( 10
{
p->vx = -vy;
p->vy = -vx; p->vy = -vy;
} } if( 30vx = vy; p->vy = vx;
//=====================================================================================
int ContinuouslyDig( SDigMap *p )//连续挖
{
int i=0; RandomVxy( p );//产生一个随机方向 p->step =1+rand()%2;//随机产生在该方向上挖的连续步长
while( i
step )
{
HitWall( p ); //首先检测是否撞墙,如果撞墙方向取反
//对于下一点的三种策略:1走过 2走过去挖掉 3跳过去 if(IsNextDigged(p->x,p->y,p->vx,p->vy,p))//检测下一点是否被自己挖过 Walk(p);//已经被挖,走过去 else if( CanNextBeDigged( p ) )//没有被挖,是否可以挖 {
} Walk( p );//可以挖,走过去, DigIt( p );//挖掉 if( IsLinked( p ) ) return 1;//如果挖通,跳出循环,并返回
} else Jump( p );//不可以挖,跳过去 i++;
} return 0;
//=====================================================================================
int bSeed(int x,int y)//是否可以作为种子
{
}
//=====================================================================================
void ImproveMap(int w,int h)//改善迷宫
{
int i,j;
//改点和四个邻点都没被挖,则可以从该点开始挖地图 if( g_MazeMap[x][y] != 0 ) return 0; if( g_MazeMap[x-1][y] != 0 ) return 0; if( g_MazeMap[x][y-1] != 0 ) return 0; if( g_MazeMap[x+1][y] != 0 ) return 0; if( g_MazeMap[x][y+1] != 0 ) return 0; return 1;
int bLink=0; //判断地图是否挖通 y vx vy step maxX maxY w-2, h-2};//标号为1,从坐标(1,1)开//SDigMap: tag x SDigMap m={ 3, 1, 1, 1, 0, 1,
始挖
for( i=1; i
if(bSeed( i, j )==1)
{ m.tag=tag; m.x=i; m.y=j; tag++; DigIt(&m); bLink=0; while( !bLink )
bLink=ContinuouslyDig( &m );
}
//=====================================================================================
void RandomExit(SDigMap *p,int w,int h,POINT* pExit)//pExit返回迷宫出口
{
//设置随即出口,随机出口位置可为左上角,坐下角,右上角 int k=rand()%60; if( 0x=1; p->y=1;
} }
} } pExit->y=1; else if( 30x][pExit->y]=1;//先将迷宫出口挖掉 p->x=w-2; p->y=1; pExit->x=w-2; pExit->y=0; p->x=1; p->y=h-2; pExit->x=0; pExit->y=h-2;
//========================================================================================
void CreateMap(int w,int h,POINT* pExit)//创建迷宫地图,地图大小为w*h,pExit返回出口坐标
{
//SDigMap: tag x y vx 1, vy 0, step maxX 1, w-2, maxY h-2};//SDigMap m1={ 1, 1, 1,
标号为1,从坐标(1,1)开始挖
SDigMap m2={ 2, w-2, h-2, -1, 0, 1, w-2, h-2};//标号为2,从坐标(N,N)开始挖
int bLink=0; //判断地图是否挖通
ClearMap(w,h);//首先,全部清零 RandomExit(&m1,w,h,pExit);//随机设置老鼠出口 DigIt( &m1 ); //初始点先挖掉 DigIt( &m2 );//老鼠在右下角 while( !bLink )//从两边同时挖,先挖出从开始处到出口的通路 { bLink = ContinuouslyDig( &m1 );//从入口开始的挖图对象,随机方向,随机步长,返回是否挖通
} ImproveMap(w,h);//改进地图,将大片没被挖的地方,多挖出一些通道,让地图更加if(!bLink) bLink=ContinuouslyDig( &m2 );//从迷宫最深处开始的挖图对像 迷人,嘿嘿!
}