下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计报告(2011- 2012 年度第1学期)名 称: 操作系统原理课程设计 B 院 系:信息工程系班 级:软件09k2学号:091909020227学生姓名:闫雪峰指导教师:郭丰娟 张琦设计周数:1成 绩:日期:2011年11月25日操作系统原理课程设计B课程设计任务书一、目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。二、主要内容采用某种程序设计语言, 设计与开发一个仿
2、真操作系统,要求具备进程调度、 存储器管理、文件及设备管理等基本功能,具体内容包括:1. 模拟单处理器系统的进程调度,加深对进程的概念及进程调度算法的理解;2. 编写一个多线程程序,加深对现代操作系统中线程的理解;3. 编写和调试一个银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法;4. 用可变分区算法模拟主存的分配和回收,加深对存储器管理的理解,熟悉各种主存 分配方法;5. 模拟虚拟存储管理中缺页中断及页面置换算法,加深对虚拟存储器管理的理解,熟 悉各种页面淘汰算法;模拟设备的分配与回收,加深对设备管理的理解;模拟文件 管理的工作过程,从而对各种
3、文件操作命令的实质内容和执行过程有比较深入的了解;模拟磁盘调度的过程,加深对磁盘存储器管理的理解,熟悉各种磁盘调度算法。6. 综合以上实验的结果,并进行集成与设计,开发出一个小型虚拟操作系统。对以上课程设计内容,将根据学生的专业与实际情况进行调整,某些题目为选作题目。三、进度计划序号设计(实验)内容完成时间备注1熟悉开发环境及程序设计语言1天2系统的分析、设计2天3调试与集成1天4验收,提交实验报告1天四、设计(实验)成果要求至少完成主要内容中的 3项,统一使用课程设计报告书,文字清楚、工整。五、考核方式实验结果(60%) +实验报告(30%) +实验过程表现(10%)学生姓名:指导教师:20
4、11年11月25日、课程设计(综合实验)的目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。、设计正文实验1单处理器系统的进程调度1.1实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。1.2实验要求1 设计一
5、个按时间片轮转法实现处理器调度的程序,每个程序由一个PCB表示。2 程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。1.3实验原理和设计进程控制块PCB的格式为:指针一一进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地 址,最后一个进程的指针指出第一个进程的进程控制块首地址。要求运行时间一一假设进程需要运行的单位时间数。已运行时间一一假设进程已经运行的单位时间数,初始值为“0”状态有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用0表示。当 一个进程运行结束后,它的状态为“结束”,用1表示。(1) 运行处理器调度程序前,输入进程数并且为每个进程设置所
6、需的服务时间;(2) 把各个进程按顺序排成循环队列,用指针指出队列连接情况;由于是模拟程序,在时间片轮转的前提下,每次使得相应进程:执行时间=已执行时间+1 ;(4)输出运行细节。1.4实验结果就绪队列情况进程名字需要时间运行时间状态1 1B2 50R3 50E第2次运行:当前运行的程序为2就绪队列情况进程名字离要时间运行时间状态2 51n3 5&B141E实验2:主存储器空间的分配和回收2.1实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分
7、析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关 的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回 收。22实验要求1 在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。2打印空闲区说明表的初始状态,作业 4的申请量以及为作业 4分配后的空闲区 说明表状态;再依次打印作业 3和作业2的归还量以及回收作业 3,作业2所占主存后 的空闲区说明表。2.3实验原理和设计1.可变分区方式是按作业需要的主存空间大小来分割分区的
8、。当要装入一个作业 时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许 多个分区,有的分区被作业占用,而有的分区是空闲的。例如:05k10k14k26k其中,起址指出一个空闲区的主存起始地址。长度指出从起始地址开始的一个连续空闲的长度。2.4运行结果请主_ FT ,=2入时分装東少霽10多 畑澈址la煜W囂林忒名始sites 龙Bfc黑簫讶鶴 內将内賣进进逬进进进进进 入入入入入入入出入入入岀寸5 5 r*n 的间小 禽存 :0入行内Z1入行内 一養运的宀黨运的的间小存时丈KS存2:0存:1詹
9、翦嘗耳麒菸进程占用內存大技】空间说明表当前内存分区表总大小为4个袤项长度2实验3:多线程游戏(贪吃蛇)3.1实验目的(1 )任何语言,实现多线程游戏,如龟兔赛跑,摇奖机等。3.2实验原理和设计(1)vb实现贪吃蛇游戏,用到timer控件实现多线程的控制,实现贪吃蛇的基本功能(2)连接access数据库,将最高分信息存到数据库。3.2实验结果八斗yjito固三、课程设计(综合实验)总结通过本次课程综合实验,我对存储器内部进程调度、空间管理和页面置换等相关算法有 了更加深刻的理解,同时锻炼了动手能力,为以后更加深入地学习操作系统这门课程打下了 良好的基础。值得一提的是,本次实验对设计多线程游戏有了
10、些许心得,兴趣所致,今后当加强这方面的学习,开发出一些好玩的小游戏。计算机相关的学科离不开上机实践,只有通过实践,才能更好地掌握知识,自己以后当主动上机实践相关理论知识。四、参考文献1 计算机操作系统,西安电子科技大学出版社,2007年5月第3版;汤小丹 梁红兵哲凤屏汤子嬴编著。2 游戏开发教程附录实验一/ timer.cpp :定义控制台应用程序的入口点#include "stdafx.h"int _tmain( int argc, _TCHAR* argv)return 0;#include<stdio.h>#include<stdlib.h>
11、#include <malloc.h>#define TIME 1typedef struct procuderint chrName;/进程名字int intRoundTime;int intRunningTime; /已经运行时间char chrFlag;struct procuder *pointerNext; procuder;int main()int intTotal;/ 进程总数int i;int intCounter=1; / 计数标记procuder *pNew; /新申请的节点procuder *pPointer; / 当前程序指针procuder *pPrev
12、ious; /当前指针的前一个指针procuder *pPrint; /输出打印的指针pPointer=(procuder *)malloc( sizeof(procuder);/初始化指针节点 pPrevious=pPointer; /将俩个指针初始化在一起printf("请输入总数 total:");scanf("%d",&intTotal);for(i=1;iv=intTotal;i+) /初始化各个进程pNew=(procuder *)malloc( sizeof(procuder);/ 申请新节点 pPrevious->point
13、erNext=pNew; 将新申请节点与前一个节点连接起来 pPrevious=pNew;将指示指针移到新申请的指针printf("请输入第d进程名字:",i);scanf('%d",&(pNew->chrName);printf("请输入第4要求运行时间:",i);scanf('%d",&(pNew->intRoundTime);pNew->chrFlag= 'R' pNew->intRunningTime=O; 初始化标记为和运行时间 pPrevious-&g
14、t;pointerNext=pPointer->pointerNext; /设成循环队歹廿 pPointer=pPointer->pointerNext;while (pPointer->pointerNext!=pPointer) /运行完剩一个进程结束pPointer->intRunningTime=pPointer->intRunningTime+TIME; / 模拟进程运行/输出当前的状态,代码自己写把printf(” 第d次运行:当前运行的程序为 dn",intCounte叶+,pPointer->chrName);printf(&quo
15、t;n 就绪队列情况nn进程名字需要时间运行时间状态n");if (pPointer->intRunningTime<pPointer->intRoundTime) 判断当前进程是否完成未完成pPointer=pPointer->pointerNext; /轮转至U下一个时间片 pPrevious=pPrevious->pointerNext; /previous后移else 完成了将当前节点剔除pPointer->chrFlag= 'E'/ 设置标志位pPrevious->pointerNext=pPointer->p
16、ointerNext; /剔除当前节点 pPointer=pPointer->pointerNext; /运行指针后移pPrint=pPrevious;while(pPrint->pointerNext!=pPrevious) /输出各个进程的状态printf(" %d %d%d%cn",pPrint->chrName,pPrint->intRoundTime,pPrint->intRunningTime,pPrint->chrFlag);pPrint=pPrint->pointerNext; /后移printf(" %d
17、 %d%d%cn",pPrint->chrName,pPrint->intRoundTime,pPrint->intRunningTime,pPrint->chrFlag); printf("n");换行while (pPointer->intRunningTime<pPointer->intRoundTime)pPointer->intRunningTime=pPointer->intRunningTime+TIME; / 模拟进程运行printf("第 %d次运行:当前运行的程序为 %dn&quo
18、t; ,intCounte叶+,pPointer->chrName);printf( "n 就绪队列情况nn进程名字需要时间运行时间状态n");printf(" %d %d%d%cnn",pPointer->chrName,pPointer->intRoundTime,pPointer->intRunningTime,pPointer->chrFlag)Jsystem("pause");return 0;实验二/ MemoryControl.cpp :定义控制台应用程序的入口点。#include &quo
19、t;stdafx.h"int _tmain( int argc, _TCHAR* argv)return 0;#include<stdio.h>#include<stdlib.h>#include<malloc.h>typedef struct memorytable/空间去说明表结构体int intStartAddress;/ 起始地址int intLength; /空间长度int intFlag; 标记为为空表目为未分配memorytable;struct process/进程的属性包括名字所需时间以运行时间int intName;int iE
20、ndFlag;/标记为标记是否已经卸载过int iSuccessfullyFitMemory; 是否成功分配内存标记int intStartTime;int intNeedTime;int intRoundTime;int intNeedMemorySize;int intStartAddress;struct process *sNext;int PrintMemoryTable( struct memorytable sSubMemoryTable, struct process *sSubPointer,int intSubTotal)/输出空间说明表的情况int i;int iCoun
21、ter=0; /计数器计算总共有多少个自由表项printf("n空间说明表:当前内存分区表总大小为d个表项nn",intSubTotal*2);printf('栏目地址 长度 状态n");for(i=0;i<intSubTotal*2;i+) /循环输出当前空间说明表中所有表目相if(sSubMemoryTFlag=1) iCounte叶+; /计数器 +有一个自由表项计数器加一printf( "%d %d %d%dn" ,i,sSubMemoryTStartAddress,sSubMemory
22、TLength,sSubMemoryTFlag);printf("当前共有%d个能分配表目,分别从 d号内存栏目n" ,iCounter,iCounter-1);return 0;int Crimple( struct memorytable sSubMemoryTable, struct process *sSubPointerjnt intSubTotal)/内存缩紧代码 int i,j;计数器for(i=0;i<intSubTotal;i+)for(j=i+1;j<2*intSubTotal;j+)if (sSubMem
23、oryTFlag=1) /如果 i不是空表目if(sSubMemoryTFlag=1)&&(sSubMemoryTStartAddress>sSubMemoryTStartAddress)/若j不为空表目且j的开始地址小于i的开始地址,交换sSubMemoryTable2*intSubTotal=sSubMemoryTablei; sSubMemoryTablei=sSubMemoryTablej;sSubMemoryTablej=sSubMemoryTable2*intSubTotal;else/i
24、为空表目,交换i和j的值if(sSubMemoryTFlag=1) 且j 不是空表目sSubMemoryTable2*intSubTotal=sSubMemoryTablei; sSubMemoryTablei=sSubMemoryTablej;sSubMemoryTablej=sSubMemoryTable2*intSubTotal;/打印输出代码PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);return(0);int FitMemory( struct memorytable sSubMemoryTab
25、le, struct process *sSubPointer,int intSubTotal)int i=-1;/ 计数器while (+i<(2*intSubTotal) /循环找出满足要求的内存块if(sSubMemoryTFlag=1) /判断是否表项为未分配if (sSubMemoryTLength>sSubPointer->intNeedMemorySize) 判断当前栏的大小是否能放下进程printf(”将%d号内存起始地址%d,内存大小%d 分配给%d进程占用内存大 小 dn" ,i,sSubMemoryTable
26、StartAddress,sSubMemoryTLength,sSubPointer->intName,sSubPoin ter->intNeedMemorySize);sSubPointer->intStartAddress=sSubMemoryTStartAddress;sSubMemoryTStartAddress=sSubMemoryTStartAddress+sSubPointer->intNeedMemory Size;sSubMemoryTLength=sS
27、ubMemoryTLength-sSubPointer->intNeedMemorySize;/输出空间说明表PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal);return 1;if(sSubMemoryTLength=sSubPointer->intNeedMemorySize) /刚好相等printf("将%d号内存起始地址%d,内存大小%d 分配给%d进程占用内存大 小 %dn" ,i,sSubMemoryTStartAddress,sS
28、ubMemoryTLength,sSubPointer->intName,sSubPoin ter->intNeedMemorySize);sSubPointer->intStartAddress=sSubMemoryTStartAddress;sSubMemoryTFlag=0;sSubMemoryTStartAddress=0;sSubMemoryTLength=0;缩紧分区说明表,输出空间说明表Crimple(sSubMemoryTable,sSubPointer,intSubTo
29、tal);return 2;printf("内存分配失败%d号进程:需要内存空间为%d在内存空闲说明表中无满足要求者 n",sSubPointer->intName,sSubPointer->intNeedMemorySize); /内存分配失败PrintMemoryTable(sSubMemoryTable,sSubPointer,intSubTotal); sSubPointer->iSuccessfullyFitMemory=0; /内存分配失败回受时不回收 return 0;int RemoveMemory( struct memorytable
30、sSubMemoryTable, struct process *sSubPointer,int intSubTotal)/从内存 卸载函数int i;/计数器int j;int intFlag=0; / 标位位int intStartAddress;int intLength; /定义起始地址和长度临时变量intStartAddress=sSubPointer->intStartAddress;intLength=sSubPointer->intNeedMemorySize; /初始化长度for(i=intSubTotal*2-1;i>=0;i-)if(sSubMemory
31、TFlag=1)&&(sSubMemoryTStartAddress=intStartAddress+intLength)如果有与归还区下临的空闲分区表printf("有与%d号进 程下邻 的空闲 分区表%d号内存起 始地址%d,长度dn" ,sSubPointer->intName,i,sSubMemoryTStartAddress,sSubMemoryTLength);intLength+=sSubMemoryTLength;intFlag=1; /设置标记位
32、for(j=i-1;j>=0;j-) /判断是否有与当前表目上临的空闲去if(sSubMemoryTFlag=1) /上临的区域不为空表目if(sSubMemoryTStartAddress+sSubMemoryTLength=intStartAddress)有上林空闲区有上邻空闲区代码,将下邻空闲区置为空表目,修改上邻空闲区的长度printf("有与%d号进程上邻的空闲分区表 %d号内存起始地址 %d,长度%dn" ,sSubPointer->intName,j,sSubMemoryTSt
33、artAddress,sSubMemoryTLength);sSubMemoryTFlag=0;sSubMemoryTLength=0;sSubMemoryTStartAddress=0; /将下邻空闲表目初始化sSubMemoryTLength+=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal); /缩紧代码return(1);/无上邻空闲区代码,修改下邻空闲区的起始地址和长度printf("无与4号进程上邻的空闲分区 n&q
34、uot; ,sSubPointer->intName);sSubMemoryTStartAddress=intStartAddress;sSubMemoryTLength=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);return (2);/无上邻空闲区没有有与归还区下临的空闲分区表if(intFlag=O)printf("无与4号进程下邻的空闲分区 n",sSubPointer->intName);for(i=0;i<intSubTotal*2;i
35、+)if(sSubMemoryTFlag=1)&&(sSubMemoryTStartAddress+sSubMemoryTLen gth=intStartAddress) /判断是否有与归还区上邻的空闲区printf(”有与%d号进程上邻的空闲分区表目%d号内存起始地址%d,长 度%dn" ,sSubPointer->intName,i,sSubMemoryTStartAddress,sSubMemoryTLength);sSubMemoryTLength
36、+=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal); /return(3);有与归还区上邻的空闲区printf("无与d号进程上邻的空闲分区表目n",sSubPointer->intName,i);for(i=intSubTotal*2-1;i>0;i-) 查找表找到一个空表目if (sSubMemoryTFlag=0)sSubMemoryTFlag=1;sSubMemoryTStartAddress=intStartAddress;sSu
37、bMemoryTLength=intLength;Crimple(sSubMemoryTable,sSubPointer,intSubTotal);return(4);没有归还区上邻的空闲区/回收失败printf( "sorry 回收失败 n");return(0);int main()int i;/计数器int intMemorySize;int intTotal;/内存分成N份int intStartAddress;/ 内存起始地址int intProcessTotal;/ 进程总数int intTime=0;int intEndTime; / 结束时
38、间struct memorytable sMemoryTable100; 定义空间说明变总共有个空间struct memorytable *sTemp; / 定义变量struct process *sHead;struct process *sPointer; 定义进程数据struct process *sNew;for (i=0;i<100;i+) /初始化说明表sTemp=(memorytable *)malloc( sizeof(struct memorytable); /申请新空间if (!sTemp) exit(1);/判断是否申请成功sMemoryTablei=*sTemp;
39、sMemoryTFlag=0;sMemoryTLength=0;sMemoryTStartAddress=0;n分请让内存大printf("请输出内存大小*KB:" );/输入内存总大小,本程序采用固定分配即将内存等分成 小能整除分区的个数scanf("%d",&intMemorySize);printf("请输入将内存等分成多少分:");/内寸等分成n分scanf("%d",&intTotal);printf("请输入内存起始地址:&
40、quot;);/输入内存起始地址scanf("%d",&intStartAddress);printf("请输入共有多少个进程要装入内存:");/输入进程数scanf("%d",&intProcessTotal);printf("请输入程序运行的最终结束时间:");/输入运行时间scanf("%d",&intEndTime);/初始化内存数组的代码for(i=0;i<intTotal;i+)sMemoryTFlag=1;sMemoryTablei.
41、intLength=intMemorySize/intTotal; sMemoryTStartAddress=intStartAddress+i*sMemoryTLength;/初始化进程的一些属性,sHead为进程队列的头指针sHead=(struct process *)malloc( sizeof(struct process);sPointer=sHead;for(i=0;i<intProcessTotal;i+)sNew=(struct process *)malloc( sizeof(struct process);/ 新建一个节点if(!
42、sNew) exit(1);sPointer->sNext=sNew;sPointer=sNew;sPointer->sNext=NULL;以下为初始化进程的属性printf(”请输入进程 d的名字:",i);scanf('%d",&(sPointer->intName);printf("请输入进程d开始装入内存的时间:",i);scanf('%d",&(sPointer->intStartTime);printf("请输入进程4将要运行的时间:",i);scanf(&
43、#39;%d",&(sPointer->intNeedTime);printf("请输出进程4需要的内存大小:",i);scanf('%d",&(sPointer->intNeedMemorySize);sPointer->intRoundTime=0;sPointer->iEndFlag=0;sPointer->iSuccessfullyFitMemory=1; /默认成功分配内存标记为能分配分配失败时置零/开始模拟将程序装入内存,注视进程开始时间必须大于while什+intTime) /运行一次时
44、间加一sPointer=sHead初始化队列指针while(sPointer=sPointer->sNext)!=NULL)if(sPointer->intStartTime=intTime) 如果到了开始时间装入内存代码printf("n 正在装入 d号进程,当前逻辑时间 dn",sPointer->intName,intTime);/printf(”%d 号 进 程 所 需 内 存 大 小为dn",sPointer->intName,sPointer->intNeedMemorySize); 打印进程信息FitMemory(sMe
45、moryTable,sPointer,intTotal);if (intTime>=sPointer->intStartTime )&&(sPointer->intRoundTime<sPointer->intNeedTime) / 若程序已经装入,并且为运行完模拟时间加一sPointer->intRoundTime+; /已经运行时间加一if (sPointer->intRoundTime=sPointer->intNeedTime)&&(sPointer->iEndFlag=0)/ 时 间到 达从内训卸载
46、进程从内训卸载代码printf( "n 正在卸载d号进程【装入时间%d需要时间%d运行时间%d】,当前逻辑时 间 dn" ,sPointer->intName,sPointer->intStartTime,sPointer->intNeedTime,sPointer->intRoundTime,intTime);sPointer->iEndFlag=1;设置进程完成运行标记位为即运行结束 if(sPointer->iSuccessfullyFitMemory=1) /判断分配内存是否成功,若分配成功才回收 printf(”%d号进程从%d
47、地址开始,占用内存大小为%dn" ,sPointer->intName,sPointer->intStartAddress,sPointer->intNeedMemorySize); /打印进程信息 RemoveMemory(sMemoryTable,sPointer,intTotal);elseprintf( "%d号进程:需内存空间为%d分配时未能成功分配此处不回收 n",sPointer->intName,sPointer->intNeedMemorySize);此处添加跳出运行代码if(intTime>intEndTim
48、e) break;system("pause");return 0;/主函数结束实验三Dim Score As IntegerDim Speed As IntegerDim EatTag As IntegerDim conn As ADODB.ConnectionDim rs As ADODB.RecordsetDim aspect As IntegerDim PassTag As IntegerDim WallTag As IntegerPublic Sub CloseAccess()rs.Closeconn.CloseSet conn = NothingSet rs =
49、 NothingEnd SubPublic Sub LinkAccess()'链接数据库过程Set conn = New ADODB.Connectionconn.Open "Provider=Microsoft .J et.OLEDB.4.0;Data Source=" & App.Path & "db3.mdb"Set rs = New ADODB.Recordsetrs.Open "select * from 排行榜 where 标记='"& CboWall.ListIndex &
50、 CboPass.ListIndex & ""', connEnd SubPublic Sub RankPage()'生成最高分过程Dim Name As StringCall LinkAccessIf Score > rs.Fields(” 分数")ThenName = lnputBox("恭喜 恭喜,请输入姓名","破纪录啦 ”,Screen.Width / 2, Screen.Height / 2) conn.Execute ("update 排行榜 set 姓名="&
51、Name & "',分数="& Score & "' where 标记="& CboWall.Listlndex & CboPass.Listlndex & ""')LblSort.Caption = rs.Fields(” 姓名")& " "& rs.Fields(” 分数")& "分"'重新显示最高分End IfCall CloseAccessEnd SubPublic
52、 Sub lsWall(WallTagSub As Integer, PassTagSub As Integer)If WallTagSub = 0 Then '判断是否有围墙If aspect = 2 And Pic(0). Left + Pic(O).Width > PicRect.ScaleWidth ThenPicHead. Left = 0ElseIf aspect = 1 And PicHead .L eft < 0 ThenPicHead .L eft = PicHead .L eft + PicRect.WidthElseIf aspect = 4 And
53、PicHead.Top + Pic(0).Height > PicRect.ScaleHeight ThenPicHead.Top = 0ElseIf aspect = 3 And PicHead.Top < 0 ThenPicHead.Top = PicHead.Top + PicRect.HeightEnd IfElseIf PicHead .L eft < 250 Or PicHead .L eft + PicHead.Width > PicRect.ScaleWidth - 250 Or PicHead.Top <250 Or PicHead.Top +
54、PicHead.Height > PicRect.ScaleHeight Then'舌头碰到墙壁Call GameOverEnd IfEnd IfSelect Case PassTagSubCase 1If (PicHead.Left >= 1500 And PicHead .L eft <= 5250) And (PicHead.Top = 1750 Or PicHead.Top = 3250) ThenCall GameOverEnd IfEnd SelectEnd SubPublic Sub GameSelect()Dim ProblemTag As Integ
55、er, i As IntegerProblemTag = CboProblem.ListIndexIf WallTag = 1 Then '判断是否有围墙For i = 1 To 112 '卸载围墙Unload PicWall(i)Next iEnd IfWallTag = CboWall.Listlndex '重新赋值围墙标记If WallTag = 1 Then '判断是否有围墙For i = 1 To 28 '初始化围墙Load PicWall(i)PicWall(i).Visible = TruePicWall(i).Left = (i - 1)
56、 * 250 '左上角坐标为 00PicWall(i).Top = 0Load PicWall(i + 28)PicWall(i + 28).Visible = TruePicWall(i + 28).Left = (i - 1) * 250PicWall(i + 28).Top = 4750Load PicWall(i + 56)'竖向围墙PicWall(i + 56).Visible = TruePicWall(i + 56).Left = 0PicWall(i + 56).Top = (i - 1) * 250Load PicWall(i + 84)PicWall(i +
57、 84).Visible = TruePicWall(i + 84).Left = 6750PicWall(i + 84).Top = (i - 1) * 250Next iEnd IfSelect Case ProblemTag 选择难度Case 0Timer1.lnterval = 500Case 1Timer1.lnterval = 200Case 2Timer1.lnterval = 100Case 3Timer1.lnterval = 50Case 4Timer1.lnterval = 25End SelectSelect Case PassTag卸载上局迷宫Case 0Case 1
58、Fori = 1 To 16Unload PicWall(i + 112)'先卸载窗体Unload PicWall(i + 128)Next iEnd SelectPassTag = CboPass.Listlndex初始化本局迷宫状态Select Case PassTag 加载迷宫Case 1Fori = 1 To 16Load PicWall(i + 112)PicWall(i + 112).Visible = TruePicWall(i + 112) .L eft = 1250 + i * 250PicWall(i + 112).Top = 1750 Load PicWall(i + 128)PicWall(i + 128).Visible = TruePicWall(i + 128).Left = 1250 + i * 250PicWall(i + 128).Top = 3250Next iCase
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆电讯职业学院《班主任著作研读》2023-2024学年第一学期期末试卷
- 浙江中医药大学《数字摄影测量》2023-2024学年第一学期期末试卷
- 浙江建设职业技术学院《TIA技术及应用》2023-2024学年第一学期期末试卷
- 郑州工业应用技术学院《钢结构设计概述》2023-2024学年第一学期期末试卷
- 小学通风和消毒制度
- 情境剧本创作技巧及其作用
- DB2201T 66.3-2024 肉牛牛舍建设规范 第3部分:种母牛
- 生物学基础与方法模板
- 人资行政战略展望模板
- 七夕传媒策略研讨
- 2024年日语培训机构市场供需现状及投资战略研究报告
- 2024年公安机关理论考试题库附参考答案(基础题)
- 历史-广东省大湾区2025届高三第一次模拟试卷和答案
- 2024年安全生产法律、法规、标准及其他要求清单
- 2023年高考文言文阅读设题特点及备考策略
- 抗心律失常药物临床应用中国专家共识
- 考级代理合同范文大全
- 2024解析:第三章物态变化-讲核心(原卷版)
- DB32T 1590-2010 钢管塑料大棚(单体)通 用技术要求
- 安全行车知识培训
- 2024年安徽省高校分类对口招生考试数学试卷真题
评论
0/150
提交评论