C语言大作业报告_第1页
C语言大作业报告_第2页
C语言大作业报告_第3页
C语言大作业报告_第4页
C语言大作业报告_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 目录 一、 设计题目 二、目标和需求分析 三、开发工具 四、应用平台 五、程序模块 1、游戏盒子 2、2048 3、扫雷 4、贪吃蛇 六、开发日志 七、程序调试及运行 八、程序开发总结 总结:虽然做出来的东西真的没什么技术水平,但是我们尽量把这个东西的每个方方面面做完整。 目标和需求分析 一个小的游戏盒子,可以用来启动其它游戏,当然,其它游戏也是我们大作业的编写内容,平时可以 玩玩用来打发时间 用到的工具 VS2005 Easyx图形库 Pthread线程库 Hge 分工 秦贤康 组织大家,编写主程序,及构思计划,技术指导 王尧 所有的文件处理,数据算法方面优化 王懿晨 合作2048模块 杨

2、梓晗 图片资源加工,音乐裁剪,按钮制作 程维驰 合作扫雷模块 应用平台:WINDOWS X64 程序模块 安装包 内嵌:C语言报告游戏盒子开机启动,桌面快捷方式等 快捷方式 进入动画,左侧动画启动模块通知,和显示游戏信息 2048 扫雷 贪吃蛇 主界面信息显示通知栏信息显示 意见箱 程序功能模块:程序功能模块: 一、一、安装包:(写入开始菜单快捷方式,桌面快捷方式,开机启动等)安装包:(写入开始菜单快捷方式,桌面快捷方式,开机启动等)/pascal脚本编写脚本编写 #define MyAppName C大作业大作业 #define MyAppVersion 2.0 #define MyAppP

3、ublisher 五人小组五人小组 #define MyAppExeName 1.exe Setup AppId=49DB1DB4-FAE9-4ACB-A4B9-E5C420C5F10B AppName=#MyAppName AppVersion=#MyAppVersion ;AppVerName=#MyAppName #MyAppVersion AppPublisher=#MyAppPublisher DefaultDirName=pf#MyAppName DisableDirPage=yes DefaultGroupName=#MyAppName DisableProgramGroupPa

4、ge=yes (剩余代码未全部给出)(剩余代码未全部给出) 二、启动盒子:二、启动盒子:(用来启动各个模块的游戏用来启动各个模块的游戏) 1、游戏模块(目前三个游戏)、游戏模块(目前三个游戏) 2048扫雷贪吃蛇 2、通知模块、通知模块 暂时只有简单的实现 网页支持 游戏启动盒子游戏启动盒子 进入动画 void logo(void) int w= GetSystemMetrics(SM_CXSCREEN);/1366 int l= GetSystemMetrics(SM_CYSCREEN);/768 全屏动画 initgraph(w, l); int i; char s20; cleardev

5、ice(); HWND hwnd = GetHWnd(); Frametransparent(hwnd, 0); SetWindowTransparent(hwnd,0,100,0 x1|0 x1); SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE); /设置透明效果 BeginBatchDraw(); for(i=l;il/2-300;i-=22) cleardevice(); Image(gif,LOGO,w/2-210,i); FlushBatchDraw(); EndBatchDraw(); for(int k=2;k29;k+)

6、cg(k,w/2-150,l/2); Sleep(10); void cg(int a,int x,int y)/开场动画 char s20; sprintf(s, LOGO%03d,a); Image(gif,s,x,y);/输出图片 Sleep(100); 主界面 通知是用pthread增加的一个线程,独立,可以随时关闭通知,需要里再弹出 pthread_t id; pthread_create(/通知进入线程 选择里面是一个判断函数,双击不同的图片有不同的返回值,然后点确定根据返回值启动不同模块,取消按钮可 以取消选定 2048 资源定义: 资源命名是与函数相关的 void showFk

7、(int x,int y,int type) char s120; sprintf(s1, FK%d,type); /因此输出图片时只在改变一个type的值就可以输入不同的图片 Image(gif,s1,x,y); /这样做的话两个方块合并的操作也简化成把方块的值加一 核心算法大概分为两个方面: 一,方块出现 主要用到的是不重复随机数 for(i = 0; i n; i+) xi = i; for(i = 0; i k; i+) t = rand(i,n-1); swap(xi, xt); out(xi); /编程珠玑的算法 把这个改了一下就可以用来随机生成方块 二,方块移动 1、 如方块向又

8、移动时要到最左边或者碰到方块才停止(过程中有动画模块) int moveBlankUp()/移动方块 for(int i=0;i4;i+) for(int x=0;x4;x+) for(int y=0;y3;y+)/从上到下扫描 if(fkxy=0/向上移动 fkxy+1=0;/原来的位置变为空 showFk(zbxx,zbyy,fkxy);/显示移动后的方块 showFk(zbxx,zbyy+1,fkxy+1); /显示原来的空方块 /完成移动一步 return 0; 2、 移动时碰到相同的方块要合并(有优先原则:如2444右移变成 _248,左移变成284_),合并后方块的值要加一,2的值

9、是1,4为2,类推 3、 合并不叠加原则(4444右移变成_ _88,而不是_ _ _16) int AddUp(void)/合并方块 for(int x=0;x4;x+) for(int y=0;y3;y+) if( fkxy=fkxy+1 / 合并后方块的值要加一 fkxy+1=0;/被合并的方块消失 y+;/合并不叠加原则,即跳过两个方块扫描 return 0; 编写技巧: 先实现一个方向移动的功能,比如向下移动 然后依次类推写出其它三个方向的, 加上一个判失败条件 所以主函数是这样的: #include #include function.h/功能实现放在这里 #include #in

10、clude #include int x,y; int zx,zy;/坐标 int direction; int zbx4=60,130,200,270;/背景上的坐标 int zby4=60+60,130+60,200+60,270+60; int fk44;/方块的数字 void main(void) reset();/初始化界面 while(fflush(stdin),direction=getch() if(judgeDown()+judgeUp()+judgeLeft()+judgeRight()=0)/四个方向都不能移动,则输了 goto gend; switch(directio

11、n) case S:playdown();break; case W:playup();break; case D:playright();break; case A:playleft();break; default:;/工程中应该保留有未知情况处理 getchar(); gend: cleardevice(); outtextxy(160,20,You 输了); Sleep(5000); closegraph(); /*图形结束*/ 扫雷扫雷 用一维数组,这样查询效率最高,因为方块数量是固定的 算法: 1、 生成地雷。先规定一个地雷数量,再用一个不重复随机数生成算法生成地雷 int i,t

12、,tp; for(i = 0; i 100; i+) x1i= i;/给数组赋值 /把雷生成 for(i = 0; i 12; i+) t = rand()%(100-i)+i;/产生i到100的随机数 tp=x1i; x1i=x1t; x1t=tp;/交换两个数 fkx1i/10x1i%10=11;/11表示这是一个地雷 编程珠玑里的随机数生成算法修改 2、 扫描地雷。为其他方块赋值。遍历每一个方块,判断周围有几个地雷。Fk0=1;表示第一个方块周围只有一 个地雷 for(i=0;i12;i+) for(int w=-1;w=1;w+) for(int q=-1;q=0 fko+; show

13、Fk(x*30+50,y*30+100,fkxy); setcolor(BLUE); rectangle(x*30+50+4,y*30+100+4,x*30+50+24,y*30+100+24); if(fkxy=0) for(int i=-1;i=1;i+) for(int j=-1;j=1;j+) fkopen(x+i,y+j);/递归调用 else if(fkxy=11)/11表示这是一个雷 win=-1;/输了 for(int i=0;i=100-12)win=1;/win=1表示赢 fko是掀开方块个数 雷全部扫完,暂定12个地雷 return 0; 贪吃蛇贪吃蛇 主界面主界面 排行

14、榜排行榜选择难度进入游戏选择难度进入游戏退出退出 三个关卡三个关卡 数据处理,回到主界面数据处理,回到主界面 添加玩家姓名添加玩家姓名 读取读取/创建创建score.txt 每个关卡每个关卡 蛇的移动蛇的移动进度条进度条背景音乐背景音乐碰到东西碰到东西 加速加速暂停暂停奖励奖励惩罚惩罚死亡死亡 统计总分数,统计总分数, 写入文件写入文件 主界面,可以选择难度,不同的难度Sleep(speed);的时间,speed的大小不同,就是蛇移动的速度不同。 有加速和暂停功能, 因为这个贪吃蛇有接近2000行的代码,(第一次写,不会分cpp写),所以就不多上代码了 核心算法: 没有按键的时候,蛇按原来方向

15、行走,有按键就改变方向 吃到食物,长度变化 撞墙判死 排行榜 数据结构: 用的文件存储,并将成绩进行排序,因为每次只增加一个数据,所以采用的是插入排序 void rank(void) fp=fopen(score.txt,r); int n,a12,k=1;/最多存12个成绩 char b1212; fscanf(fp,%dn, for(int i=1;itotalscore) k=i+1; fclose(fp); 还原按钮用来清空数据 进入游戏先输入用户姓名 InputBox(name,20,请输入姓名,玩家姓名,王尧,20,100);/输入用户 第一关:(没有障碍物) 有一个xp系统样式的

16、进度条,和一个proess提示进度 进度条根据当时分数和通关所需分数进行换算而来: 吃了紫色的食物蛇变短,(前提是蛇不能太短)绿色的会变长 第二关:(有障碍物) 黄色小球会跟着小蛇移动,被它碰到分数减半 加上了墙壁 第三关 白色方块会在屏幕里一直反弹,蛇碰到即死,同时出现一个假入口 数据结构设计 2048与扫雷的数据需要分块存储,与数组结构类似,于是使用了数组来存放相应位置的数据, 贪吃蛇由于蛇身长度不定,存储蛇身坐标时使用了可以动态更新的链表, 根据移动的特点使用了队列来维护, 蛇的相关信息如长度方向等着为了方便管理而使用了结构体。 测试 测试方法:直接运行,调试,另开一个控制台窗口专门用的

17、打印所有变量(2048就是这么写出来的) 扫雷 1、判断鼠标放到144个方块中的任何一个,这个方块都要变色来提示用户。 问题问题:判断的时候太长了,鼠标相应不灵。 解决方法:解决方法:算法优化1,先得到鼠标大概的位置,然后在把周围局部扫描一下。问题得到了解决。 算法优化2,先存储鼠标之前的位置,判断鼠标当前位置和之前是否一样。不一样就只用还原先前位置的方块和 更新当前位置的方块。(多了一个变量,用空间换取时间) 2、点到雷的时候,要显示所有的雷,播放爆炸声 问题问题:播放声音要时候,结果显示雷和爆炸声音不同步。 解决方法解决方法:为播放爆炸声音加一个独立的线程。 贪吃蛇 问题:问题:代码全部写在一个源文件里面,不方便修改 解决方法:解决方法:以后除了贪吃蛇的其它工程,界面和功能的代码都是分离的。 开发日志 程序开发从构思到完成共历时二十天左右,基本过程如下: 开题报告时:完成贪吃蛇(18次修改改进)2048游戏(4次修改改进),交给小组测试 五一:完成扫雷(4次修改改进) 五一假期结束:完成游戏盒子(8次修改改进) 然后因为把硬盘格式化了,很多工程就只有cpp文件了,所以现在的程序都是五一时的半成品(还有一个类似梦 幻西游的游戏就夭折了,用的是hge) 程序开发总结 通过这次程序开发,我对程序员有了更深刻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论