web.docx

更新时间:2024-01-01 20:36:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

WEB课 程 设 计 报 告

学院、系:专业名称:课程设计科目:题目:学号、姓名:指导教师:完成时间:

计算机科学与技术系 2010级计算机科学与技术

Web程序设计 在线小游戏 04100407 王沛棋 04100419 马治文 04100425 潘晓佳 04100427 吴汉彬

04100430 顾伟

吴昊 2013年5月--6月

目 录

一. 开发背景 .................................................................................................................................... 3 二. 可行性分析 ................................................................................................................................ 3 三.需求分析 ................................................................................................................................... 3

1.系统总体目标 ........................................................................................................................ 3 2.运行环境 ................................................................................................................................ 3 3. 用户特点 .............................................................................................................................. 3 4. 功能性需求 .......................................................................................................................... 3 5.非功能性需求 ........................................................................................................................ 5 6.接口需求 .............................................................................................. 错误!未定义书签。 7.故障处理 ................................................................................................................................ 6 四.概要设计 ...................................................................................................................................... 6

1. 系统总体结构图 .................................................................................................................. 6 2 关键技术与算法 ................................................................................................................... 7 3 关键数据结构 ....................................................................................................................... 7 4. 概念模型设计 ...................................................................................................................... 7 五 详细设计 ..................................................................................................................................... 7

1.模块关系图 ............................................................................................................................ 7 2.子系统A的模块设计(以此类推,子系统B、C??) ................................................. 7 2.1 模块A-1 (以此类推,模块A-2、A-3??) ............................................................. 8 3. 数据库设计 .......................................................................................................................... 8 六 软件实现 ..................................................................................................................................... 9

1、客户端编程语言 ................................................................................................................. 9 2、服务端编程语言 ............................................................................... 错误!未定义书签。 3、关键模块A的实现(以此类推关键模块B、C、D??的实现)错误!未定义书签。 七、软件测试计划 ......................................................................................................................... 36

1.质量目标 .............................................................................................................................. 36 2.测试策略 .............................................................................................................................. 37 3.测试方法 .............................................................................................................................. 37 4、测试组织 ........................................................................................................................... 41 八. 课程设计心得体会 .................................................................................................................. 42

一. 开发背景

开发工具是VC6,开发语言C++,开发一个基于网络的一个小型可联网井字游戏,提高我们自己的项目实践能力。联网小游戏是4G时代下比较热门的娱乐休闲方式,因此联网小游戏有一定市场。

二. 可行性分析

该项目开发成本不高,小组成员合作分工完成。需要各成员熟练C++语言,以及VC6工具的使用。

三.需求分析

1.系统总体目标

本系统的开发意图、应用目标及作用范围(现有产品存在问题及建议产品所要解决的问题)

2.运行环境 Windows系统 3. 用户特点

普通用户:任何拥有程序的用户可单机 或联网运行

4. 功能性需求

4.1 系统功能列表

将功能性需求先粗分再细分,下表中的 Feature A(将整体系统分成若干个相对独立的子系统), Function A.1(即子系统对应的若干个模块名)等符号应当被替换成有含义的名称。 子系统名称 Feature A 后台用户管理

模块名称、标识符 搜索用户(动名词) 描述 输入关键词查找用户基本信息

管理用户 对注册成功的用户状态进行控制,比如对恶意破坏购物的用户加入黑名单,禁止购物等。。 描述 创建/维护用户信息,分配用户角色。 创建/维护组织机构信息 创建/维护角色信息,分配角色系统功能 用户密码重置 Function B.1 … Function C.1 … 例: 子系统名称 模块名称、标识符 用户管理 系统管理 组织管理 角色管理 Feature B Feature C 4.2 子系统 1 对子系统的功能进行简要或详细的描述及其需求分析用到的用例图,可以采用图表的形式 例如:无线资源管理系统

无线资源管理系统的功能需求包括如下部分… 列出所有的功能模块 4.2.1 模块 1

本节详细描述需求,包括要解决的问题和需求背后的动机。对于每一类功能或者每一个功能,需要具体说明其输入、处理和输出需求。

a. 目标:对本需求的需求内容进行概要的描述。描述本次功能要达到的目标、方法和

技术,还应清楚说明功能意图的由来和背景。 b. 输入,包括:

1) 详细描述该功能的所有输入数据,如输入源、数量、度量单位、时间设定和有效输

入范围

2) 指明引用接口说明或者接口控制文件的参考资料

c. 处理,定义对输入数据、中间参数进行处理以获得预期输出结果的全部操作。包括 1) 输入数据的有效性检查

2) 操作顺序,包括时间的时间设定。

3) 异常情况的相应,如溢出、通信故障和错误处理等。 4) 受操作影响的参数。

5) 用于把输入转换为相应输出的方法。 6) 输出数据的有效性检查。

d. 输出

1) 详细说明该功能的所有输出数据,例如,输出目的地、数量、度量单位、时间关系、

有效输出范围、非常值的处理和出错信息等。 2) 有关接口的说明或接口控制文件的参考资料。

5.非功能性需求

5.1 性能需求

本节用数字对系统和人机接口方面的静态和动态需求进行描述,例如:静态数字需求(也称作容量)包括:

1、 支持的工作站数量; 2、 支持的模拟用户数量; 3、 数据库和文件容量; 4、 数据通道数量;

动态数字需求包括:

1、 数据吞吐量; 2、 响应时间】。

概述系统的性能特征。其中需包括具体的响应时间。如果可行,按名称引用相关用例。

? * 对事务的响应时间(平均、最长) ? * 吞吐量,例如每秒处理的事务数

? * 容量,例如系统可以容纳的客户或事务数

? * 降级模式(当系统以某种形式降级时可接受的运行模式) ? * 资源利用情况,如内存、磁盘、通信等

5.2 可靠性需求

对系统可靠性的需求应在此处说明。以下是一些建议:

? * 可用性-指出可用时间百分比 ( xx.xx%)、使用小时数、维护访问权、降级模式操作等。 ? * 平均故障间隔时间 (MTBF) * 通常表示为小时数,但也可表示为天数、月数或年数。 ? * 平均修复时间 (MTTR)-系统在发生故障后可以暂停运行的时间。

? * 精确度-指出系统输出要求具备的精密度(分辨率)和精确度(按照某一已知的标准)。 ? * 最高错误或缺陷率-通常表示为每千行代码的错误数目 (bugs/KLOC) 或每个功能点的错误数目 (bugs/function-point)。

? * 错误或缺陷率-按照小错误、大错误和严重错误来分类。需求中必须对“严重”错误进行界定,例如:数据完全丢失或完全不能使用系统的某部分功能。

硬件接口

本节描述系统软硬件产品之间接口的物理和逻辑特性。可包括支持的设备类型,软硬件之间的数据和控制交互特性,以及用到的通信协议。

软件接口

本节描述本产品和其他指定的软件部件(名称和版本)之间的连接,如:包括数据库、操作系统、工具、集成商业套装软件等。识别出进出系统的数据项或消息,描述各自的目的。描述需要的服务和通信性质,参考的API协议描述,识别软件部件间共享的数据。

通信接口

描述本系统要求的任何通信相关功能需求,包括e-mail, web browser, 网络服务器通信协议, 电子表单等等。定义相关消息格式。识别用到的所有通信标准,比如FTP、HTTP等。详细说明通信安全和加密问题,数据传输速率,同步机制等。

7.故障处理

说明本系统在发生可能的软硬件故障时,对故障处理的要求。

创建端口出错处理 do{ strcpy(tmpMsg,\ ByteCount=this->Receive(tmpMsg,1000); if(ByteCount>1000||ByteCount<=0) { MessageBox(pFrame->m_hWnd,\接受网络信息发生错误!\错误\ return ; } else if(ByteCount<1000&&ByteCount>0) { End=1; } tmpMsg[ByteCount]=0; strcat(pMsg,tmpMsg); }while(!End);

四.概要设计

1. 系统总体结构图

入口(创建游戏主窗口,线程以及网络端口)

2 关键技术与算法

3 关键数据结构

类CMFrame:主线程类,游戏按钮,窗口,设置的显示与控制 类CConnectdlg:联网对话框 类CMysocket:网络端口 类CSertCltDlg:游戏对话框

工具栏控件与窗口设置游戏,开始游戏,联网游戏按钮设置目标IP地址 游戏介绍界面 4. 概念模型设计

五 详细设计

1.模块关系图

图形表述模块间的相互关系,如:组成关系、调用关系等。

2.子系统A的模块设计(以此类推,子系统B、C??)

提供子系统A的概览、描述和服务说明。

2.1 模块A-1 (以此类推,模块A-2、A-3??)

提供模块A-1的概览、描述和服务说明。

2.1.1 模块组成列表

提供模块A-1的模块组成。如: 模块ID 用户维护 EditUser.jsp … 调用页面 AddUser.jsp 调用类 User UserManager User UserManager CheckLogin, CheckUser X 调用程序 CheckLogin … 调用接口 X 2.2.2 页面设计说明(可选)

对模块A-1的所调用的页面进行分别说明。包含信息有:页面名称、物理存放位置、页面功能说明、页面出现前提、页面截图、页面控件(如:文本框、功能按钮等)功能说明等,可用图表形式描述。

2.2.3 类(程序/接口)设计说明

对模块A-1的所调用的类(程序/接口)进行分别说明。包含信息有:类(程序/接口)名称、物理存放位置、类(程序/接口)功能说明、类(程序/接口)调用前提、输入条件、处理逻辑过程、输出结果等,可用图表形式描述。

2.2.4 类(程序/接口)伪代码

对模块A-1的所调用的类(程序/接口)分别编写伪代码。

2.2.5 出错处理

本节提供模块A-1的出错处理和恢复机制。

3. 数据库设计

(根据转换规则将E-R图转换为关系模式)

根据系统的总体概念设计模型、E-R图向关系模式的转化规则和数据库的范式理论,得到系统优化后的逻辑模型,如表1~表5所示。 表1 图书信息表(Titles表) 编号 类别 出版社 书名 作者 价格 ISBN 索书号 时间 简介 库存 姓名 密码 性别 职别 表2 读者信息表(Reader) 读者号 单位 专业 年级 电话 地址 记录号 图书号 读者号 表3 借阅记录表(BorrowRec) 书名 借阅时间 还书时间 是否还书

表4出版社信息表(Publisher)

出版社ID 名 称 地 址 表5 图书类别信息表(Type) 类别ID 名 称 简 介 六 软件实现

客户端编程语言和服务端编程语言都说用C语言,而选择C语言来完成是因为C是属于基础性的语言。对于游戏动漫方向的来讲,大多数游戏都是通过C而写成的。C语言程序写成的游戏是属于基础的小游戏。更容易让人看懂。

主要算法:

#include \#include \

#include \#include \#include \

//#define TCOLOR RGB(128,255,128) //#define BCOLOR RGB(40,48,180) #define TCOLOR RGB(0,248,0)

#define TCOLOR2 RGB(255,255,255) #define BCOLOR RGB(80,64,79) //#define BCOLOR RGB(63,32,31) //#define BCOLOR RGB(78,49,49) //#define BGROUND RGB(153,104,64) //#define BGROUND RGB(47,32,63) //#define BGROUND RGB(100,73,95) //#define BGROUND RGB(63,32,31) //#define BGROUND RGB(112,88,79) //#define BGROUND RGB(112,72,64) //#define BGROUND RGB(79,64,64) //#define BGROUND RGB(89,56,55) //#define BGROUND RGB(63,30,0) //#define BGROUND RGB(207,144,32) #define BGROUND RGB(209,146,34)

//RGB(189,91,1)

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

///////////////////////////////////////////////////////////////////////////// // CJingZiQiView

IMPLEMENT_DYNCREATE(CJingZiQiView, CView)

BEGIN_MESSAGE_MAP(CJingZiQiView, CView) //{{AFX_MSG_MAP(CJingZiQiView) ON_WM_SETCURSOR() ON_WM_LBUTTONUP() ON_COMMAND(ID_Start, OnStart) ON_WM_TIMER() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CJingZiQiView construction/destruction

CJingZiQiView::CJingZiQiView() { // TODO: add construction code here //CurBlack=::LoadCursor(AfxGetInstanceHandle(), //MAKEINTRESOURCE(IDC_CURSOR1)); CurBlack=AfxGetApp()->LoadCursor(IDC_CURSOR2); m_bmRed.LoadBitmap(IDB_BITMAP15);//(IDB_BITMAP12); m_bmBlack.LoadBitmap(IDB_BITMAP14);//(IDB_BITMAP9); for(int i=0;i<3;i++) for(int j=0;j<3;j++) { QP[i][j]=0; pre_qp[i][j]=0; } man_turn=1; cmptfirst=false;

Level=1; mode=1; IsServer=false; over=0; requ_reply=true; }

CJingZiQiView::~CJingZiQiView() { }

BOOL CJingZiQiView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); }

///////////////////////////////////////////////////////////////////////////// // CJingZiQiView drawing

void CJingZiQiView::OnDraw(CDC* pDC) { CJingZiQiDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here //画背景 CBrush mybrush; mybrush.CreateSolidBrush(BGROUND); CRect myrect(0,0,1200,800); pDC->FillRect(myrect,&mybrush); mybrush.DeleteObject(); //画棋盘 CPen *oldpen,mypen; mypen.CreatePen(PS_SOLID,1,RGB(0,255,255)); oldpen=pDC->SelectObject(&mypen); for(int i=0;i<4;i++) { pDC->MoveTo(60,60+i*60); pDC->LineTo(240,60+i*60); pDC->MoveTo(60+i*60,60); pDC->LineTo(60+60*i,240);

} pDC->SelectObject(oldpen); //画棋子 CDC DC; if(DC.CreateCompatibleDC(pDC)==FALSE) AfxMessageBox(\ for(i=0;i<3;i++) for(int j=0;j<3;j++) if(QP[i][j]==1) { DC.SelectObject(m_bmBlack); pDC->BitBlt(64+i*60,64+j*60,60,60,&DC,0,0,SRCCOPY); } else if(QP[i][j]==-1) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+i*60,64+j*60,60,60,&DC,0,0,SRCCOPY); } ShowState(); }

///////////////////////////////////////////////////////////////////////////// // CJingZiQiView printing

BOOL CJingZiQiView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); }

void CJingZiQiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing }

void CJingZiQiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing }

/////////////////////////////////////////////////////////////////////////////

// CJingZiQiView diagnostics

#ifdef _DEBUG

void CJingZiQiView::AssertValid() const { CView::AssertValid(); }

void CJingZiQiView::Dump(CDumpContext& dc) const { CView::Dump(dc); }

CJingZiQiDoc* CJingZiQiView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJingZiQiDoc))); return (CJingZiQiDoc*)m_pDocument; }

#endif //_DEBUG

///////////////////////////////////////////////////////////////////////////// // CJingZiQiView message handlers

BOOL CJingZiQiView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: Add your message handler code here and/or call default if(nHitTest==HTCLIENT) { if(mode==1) { if(man_turn) { SetCursor(CurBlack); // SetCursor(LoadCursor(NULL,IDC_CROSS));//显示十字形光标 return 1; } } else if(mode==2) { if(man_turn&&(!IsServer)) { SetCursor(CurBlack); return 1;

} else if(IsServer&&(!man_turn)) { SetCursor(CurBlack); return 1; } } } return CView::OnSetCursor(pWnd, nHitTest, message); }

//DEL void CJingZiQiView::OnMouseMove(UINT nFlags, CPoint point) //DEL {

//DEL // TODO: Add your message handler code here and/or call default //DEL /* CRect rect(100,100,500,500);//定一一个改变光标的范围 //DEL

//DEL if(rect.PtInRect(point))//鼠标当前位置在矩形范围内 //DEL //DEL { //DEL //DEL SetCursor(LoadCursor(NULL,IDC_CROSS));//显示十字形光标 //DEL

//DEL }*/ //DEL //DEL

//DEL CView::OnMouseMove(nFlags, point); //DEL }

void CJingZiQiView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default int x,y,px,py; x=point.x; y=point.y; CDC *pDC=GetDC(); CDC DC; if(DC.CreateCompatibleDC(pDC)==FALSE) MessageBox(\ //人机对弈 if(mode==1&&!over)

{

KillTimer(1);

if((x>60)&&(x<240)&&(y>60)&&(y<240)) { px=(x-60)/60; py=(y-60)/60; if(man_turn&&(QP[px][py]==0)) { for(int k=0;k<3;k++) for(int l=0;l<3;l++) pre_qp[k][l]=QP[k][l];

DC.SelectObject(m_bmBlack); pDC->BitBlt(64+60*px,64+60*py,60,60,&DC,0,0,SRCCOPY); QP[px][py]=1; man_turn=0; if(!result()) { computerdown(); result(); } } } }

//联机游戏

else if(mode==2) { CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; if((x>60)&&(x<240)&&(y>60)&&(y<240)) { px=(x-60)/60; py=(y-60)/60; if(!over) { if((!IsServer)&&man_turn&&(QP[px][py]==0)) //客户端(man_turn=1) { // if(IsServer) // return;

for(int k=0;k<3;k++) for(int l=0;l<3;l++)

pre_qp[k][l]=QP[k][l]; DC.SelectObject(m_bmBlack); pDC->BitBlt(64+60*px,64+60*py,60,60,&DC,0,0,SRCCOPY); QP[px][py]=1; man_turn=0; SendPosInfo(px,py,pFrame->m_pClient); result(); } else if(IsServer&&(man_turn==0)&&(QP[px][py]==0)) //服务器端(man_turn=0) { //if(!IsServer) // return; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*px,64+60*py,60,60,&DC,0,0,SRCCOPY); QP[px][py]=-1; man_turn=1; SendPosInfo(px,py,pFrame->m_pConnect); result(); } } } } CView::OnLButtonUp(nFlags, point); }

void CJingZiQiView::computerdown() { CDC *pDC=GetDC(); CDC DC; if(DC.CreateCompatibleDC(pDC)==FALSE) MessageBox(\ int i,j,k1,k2,temp1,temp2,flag; struct datatype { int data; int locatedata; }datas[8]; flag=1; for (i=0;i<3;i++)

for (j=0;j<3;j++) { if (QP[i][j]==0) flag=0; }

if(flag==1) { return; }

for (i=0;i<8;i++) { datas[i].locatedata=i; }

for(i=0;i<3;i++) { datas[i].data=0; for (j=0;j<3;j++) datas[i].data=datas[i].data+QP[i][j]; }

for(j=0;j<3;j++) { datas[j+3].data=0; for (i=0;i<3;i++) datas[j+3].data=datas[j+3].data+QP[i][j]; }

datas[6].data=QP[0][0]+QP[1][1]+QP[2][2]; datas[7].data=QP[2][0]+QP[1][1]+QP[0][2]; for (i=8-1;i>0;i--) { flag=1; for (j=0;jdatas[j+1].data) { temp1=datas[j].data; datas[j].data=datas[j+1].data; datas[j+1].data=temp1; temp2=datas[j].locatedata; datas[j].locatedata=datas[j+1].locatedata; datas[j+1].locatedata=temp2; flag=0; } } if (flag==1) break;

} if

((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==1)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==0)) { QP[0][0]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64,64,60,60,&DC,0,0,SRCCOPY); man_turn=1; return; } if

((QP[0][0]==1)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==0)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return; } if

((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==1)&&(QP[2][1]==0)&&(QP[2][2]==0)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return; } if (Level==2) { if(hard()) return; } k1=7; k2=0; while(1) { if((datas[k2].data+datas[k1].data)<=0)

{ if (datas[k2].locatedata<=2) { for(j=0;j<3;j++) { if (QP[datas[k2].locatedata][j]==0) { DC.SelectObject(m_bmRed);

pDC->BitBlt(64+60*datas[k2].locatedata,64+60*j,60,60,&DC,0,0,SRCCOPY); QP[datas[k2].locatedata][j]=-1; man_turn=1;return; } } } if ((datas[k2].locatedata>2)&&(datas[k2].locatedata<6)) { for (i=0;i<3;i++) { if (QP[i][datas[k2].locatedata%3]==0) { DC.SelectObject(m_bmRed);

pDC->BitBlt(64+60*i,64+60*(datas[k2].locatedata%3),60,60,&DC,0,0,SRCCOPY); QP[i][datas[k2].locatedata%3]=-1; man_turn=1;return; } } } if (datas[k2].locatedata==6) { for (i=0;i<3;i++) if (QP[i][i]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*i,64+60*i,60,60,&DC,0,0,SRCCOPY); QP[i][i]=-1; man_turn=1; return; } } if (datas[k2].locatedata==7) {

if (QP[0][2]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*0,64+60*2,60,60,&DC,0,0,SRCCOPY); QP[0][2]=-1; man_turn=1; return; } else if (QP[1][1]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); QP[1][1]=-1; man_turn=1; return; } else if (QP[2][0]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*2,64+60*0,60,60,&DC,0,0,SRCCOPY); QP[2][0]=-1; man_turn=1; return; } } k2++; } else { if (datas[k1].locatedata<=2) { for(j=0;j<3;j++) { if (QP[datas[k1].locatedata][j]==0) { DC.SelectObject(m_bmRed);

pDC->BitBlt(64+60*datas[k1].locatedata,64+60*j,60,60,&DC,0,0,SRCCOPY); QP[datas[k1].locatedata][j]=-1; man_turn=1; return; } } }

if ((datas[k1].locatedata>2)&&(datas[k1].locatedata<6)) { for (i=0;i<3;i++) { if (QP[i][datas[k1].locatedata%3]==0) { DC.SelectObject(m_bmRed);

pDC->BitBlt(64+60*i,64+60*(datas[k1].locatedata%3),60,60,&DC,0,0,SRCCOPY); QP[i][datas[k1].locatedata%3]=-1; man_turn=1; return; } } } if (datas[k1].locatedata==6) { for (i=0;i<3;i++) if (QP[i][i]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*i,64+60*i,60,60,&DC,0,0,SRCCOPY); QP[i][i]=-1; man_turn=1; return; } } if (datas[k1].locatedata==7) { if (QP[0][2]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*0,64+60*2,60,60,&DC,0,0,SRCCOPY); QP[0][2]=-1; man_turn=1; return; } else if (QP[1][1]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); QP[1][1]=-1;

man_turn=1; return; } else if (QP[2][0]==0) { DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*2,64+60*0,60,60,&DC,0,0,SRCCOPY); QP[2][0]=-1; man_turn=1; return; } } k1--; } } }

BOOL CJingZiQiView::result() { int i,j,count[8],flagcount=0,temp=0,max=0,min=0; for(i=0;i<3;i++) { count[i]=0; for (j=0;j<3;j++) count[i]=count[i]+QP[i][j]; } for(j=0;j<3;j++) { count[j+3]=0; for (i=0;i<3;i++) count[j+3]=count[j+3]+QP[i][j]; } count[6]=QP[0][0]+QP[1][1]+QP[2][2]; count[7]=QP[2][0]+QP[1][1]+QP[0][2]; for (i=0;i<3;i++) { for (j=0;j<3;j++) if (QP[i][j]==0) { flagcount=1;break; }

}

for (i=0;i<3;i++) { for (j=0;j<3;j++) temp=temp+abs(QP[i][j]); }

if(temp==8) { temp=0; for (i=0;i<8;i++) { if (abs(count[i])>temp) temp=abs(count[i]); } if (temp<=1) { over=3; ShowState(); // MessageBox(\ 和 棋\结果\ // legal=true; // delay(); if(mode==1) { Sleep(2000); OnStart(); SetTimer(1,300,NULL); // over=0; } return(true); } }

if(flagcount==0) { for(i=0;i<8;i++) { if (count[i]>max) max=count[i]; if (count[i]

if(mode==1) { over=2; ShowState(); // MessageBox(\恭喜你赢了!\结果\ // delay(); Sleep(2000); } else if(mode==2) { if(IsServer) { over=1; ShowState(); // MessageBox(\呵呵! 你输了!\结果\ // delay(); // Sleep(2000); } else { over=2; ShowState(); // MessageBox(\你太棒了!\结果\ // delay(); // Sleep(2000); } }

// legal=true; if(mode==1) { OnStart(); SetTimer(1,300,NULL); // over=0; } return(true); }

if (min==-3)/*计算机赢*/ { if(mode==1) {

// // over=1; ShowState(); // MessageBox(\不好意思,你输了!\结果\ // delay(); Sleep(2000); } else if(mode==2) { if(!IsServer) { over=1; ShowState(); // MessageBox(\呵呵! 你输了!\结果\ // delay(); // Sleep(2000); } else { over=2; ShowState(); // MessageBox(\你太棒了!\结果\ // delay(); // Sleep(2000); } } // legal=true; if(mode==1) { OnStart(); SetTimer(1,300,NULL); // over=0; } return(true); }

// legal=true;

over=3;

ShowState();

MessageBox(\ 和 棋\结果\delay();

if(mode==1)

{ Sleep(2000); OnStart(); SetTimer(1,300,NULL); // over=0; } return(true); }

else for(i=0;i<8;i++) { if (count[i]==3)/*人赢*/ { if(mode==1) { over=2; ShowState(); MessageBox(\了不起,你赢了!\结果\ delay(); Sleep(2000); } else if(mode==2) { if(IsServer) { over=1; ShowState(); MessageBox(\呵呵! 你输了!\结果\ delay(); Sleep(2000); } else { over=2; ShowState(); MessageBox(\你太棒了!\结果\ delay(); Sleep(2000); } } // legal=true;

if(mode==1) { OnStart(); SetTimer(1,300,NULL); // over=0; } return(true); }

if (count[i]==-3)/*计算机赢*/ { if(mode==1) { over=1; ShowState(); MessageBox(\你输了,快加油!\结果\ delay(); Sleep(2000); } else if(mode==2) { if(!IsServer) { over=1; ShowState(); MessageBox(\呵呵! 你输了!\结果\ delay(); Sleep(2000); } else { over=2; ShowState(); MessageBox(\你太棒了!\结果\ delay(); Sleep(2000); } } // legal=true; if(mode==1) {

OnStart(); SetTimer(1,300,NULL); // over=0; } return(true); } } ShowState(); return(false); }

void CJingZiQiView::OnStart() { // TODO: Add your command handler code here CMainFrame *pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd; if(mode==2&&over) { /* cmptfirst=!cmptfirst; if(cmptfirst) man_turn=0; else man_turn=1;*/ char Send_pMsg[1000];//,Show_Msg[1000]; strcpy(Send_pMsg,\ // strcpy(Show_Msg,\ if(requ_reply) { sprintf(Send_pMsg,\对方要求再来一盘!\ // sprintf(Show_Msg,\已发出挑战,请等回复...\ // ShowReq_Rep(Show_Msg); } else { sprintf(Send_pMsg,\对方接受挑战!\ // sprintf(Show_Msg,\对方请你先下!\ // ShowReq_Rep(Show_Msg); } if(pMain->m_pConnect&&IsServer)

{ pMain->SendMsg(pMain->m_pConnect,Send_pMsg); if(requ_reply) man_turn=1; else { man_turn=0; requ_reply=true; } } else if(pMain->m_pClient&&!IsServer) { pMain->SendMsg(pMain->m_pClient,Send_pMsg); if(requ_reply) man_turn=0; else { man_turn=1; requ_reply=true; } } over=0; for(int i=0;i<3;i++) for(int j=0;j<3;j++) QP[i][j]=0; Invalidate(); return; }

else if(mode==1) {

// over=0; for(int i=0;i<3;i++) for(int j=0;j<3;j++) QP[i][j]=0; Invalidate(); if(cmptfirst) { int i,j; srand((int)time(NULL)); i=rand()%3; j=rand()%3; CDC DC,*pDC; pDC=GetDC();

if(DC.CreateCompatibleDC(pDC)==0) { AfxMessageBox(\ return; } DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*i,64+60*j,60,60,&DC,0,0,SRCCOPY); QP[i][j]=-1; man_turn=1; } else man_turn=1; } }

int CJingZiQiView::hard() { CMainFrame *pMain=(CMainFrame*)AfxGetApp()->m_pMainWnd; CDC *pDC=GetDC(); CDC DC; if(DC.CreateCompatibleDC(pDC)==FALSE) MessageBox(\ if

((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==1)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==0)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; } if

((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==1)&&(QP[2][2]==0)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; }

if

((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==1)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; } if

((QP[0][0]==-1)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==1)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; } if

((QP[0][0]==-1)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==1)&&(QP[2][2]==0)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; } if

((QP[0][0]==-1)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==1)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==0)) { QP[1][1]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; } if

((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==-1)&&(QP[1][2]==1)&&(QP[2][0]==0)&&(QP[2][1]==1)&&(QP[2][2]==0)) {

QP[2][2]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*2,64+60*2,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; } if

((QP[0][0]==-1)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==1)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==1)) { QP[2][0]=-1; DC.SelectObject(m_bmRed); pDC->BitBlt(64+60*2,64+60*0,60,60,&DC,0,0,SRCCOPY); man_turn=1; return 1; } return 0; }

void CJingZiQiView::Empty() { for(int i=0;i<3;i++) for(int j=0;j<3;j++) QP[i][j]=0; Invalidate(); }

void CJingZiQiView::SendPosInfo(int x,int y,CMySocket *pSocket) { char px[5],py[5]; char Msg[100]; if(!pSocket) { MessageBox(\没有连接到任何服务器!\错误\ return; } itoa(x,px,10); itoa(y,py,10); strcpy(Msg,\ strcat(Msg,px); strcat(Msg,\ strcat(Msg,py);

strcat(Msg,\ UpdateData(); CMainFrame *pFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd; UpdateData(FALSE); if(pSocket) { char pMsg[100]; sprintf(pMsg,\ pFrame->SendMsg(pSocket,pMsg); } }

void CJingZiQiView::OpponentDone() { CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; int x=pFrame->m_point.x; int y=pFrame->m_point.y; if(IsServer) { man_turn=0; QP[x][y]=1; } else { man_turn=1; QP[x][y]=-1; } Invalidate(); result(); }

void CJingZiQiView::ShowState() { CBrush mybrush; CDC *pDC=GetDC(); CRect CltRect,rect; GetClientRect(CltRect); rect.CopyRect(CltRect); rect.left+=300; //画背景 mybrush.CreateSolidBrush(BCOLOR);

pDC->FillRect(rect,&mybrush);

/* CFont font,*oldfont; font.CreateFont(25,8,0,20,80,0,0,0,ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,0,NULL); // font.CreateFont(0, 0, 0, 0, 55, FALSE, FALSE,0,0,0,0,0,0, \ oldfont=pDC->SelectObject(&font); COLORREF OldColor=pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT)); // pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW));*/

//定义显示man_turn、computerfirst、Level、mode状态信息和输赢的区域 CRect ModeRect(rect.left+5,rect.top+50,rect.right,rect.top+80); CRect LevelRect(rect.left+5,rect.top+90,rect.right,rect.top+120); CRect FstRect(rect.left+5,rect.top+130,rect.right,rect.top+160); CRect TurnRect(rect.left+5,rect.top+170,rect.right,rect.top+200); CRect ReltRect(rect.left+5,rect.top+210,rect.right,rect.top+240); pDC->SetTextColor(TCOLOR); // pDC->SetBkColor(BCOLOR); pDC->SetBkMode(TRANSPARENT); if(mode==1) pDC->DrawText(\模式: 人机对弈\ else pDC->DrawText(\模式: 联网游戏\ if(Level==1&&mode==1) pDC->DrawText(\难度: 易\ else if(mode==1) pDC->DrawText(\难度: 难\ if(mode==1) { if(cmptfirst) pDC->DrawText(\先下: 计算机\ else pDC->DrawText(\先下: 人\ }

else if(over) { pDC->DrawText(\点击\发出挑战!\ }

if(mode==1) { if(man_turn&&!over) pDC->DrawText(\当前: 该你下了!\

else if(!over) pDC->DrawText(\当前: 计算机下,稍等...\ else pDC->DrawText(\当前: 游戏结束!\ } else { CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; if(!over) { if((!pFrame->m_pConnect&&IsServer)||(!pFrame->m_pClient&&!IsServer)) pDC->DrawText(\当前: 等待连接...\ else { if((IsServer&&man_turn==0)||(!IsServer&&man_turn)) pDC->DrawText(\当前: 该你下了!\ else pDC->DrawText(\当前: 对方下,请稍等...\ } } else pDC->DrawText(\当前: 游戏结束!\ }

switch(over) { case 0: if(!over) pDC->DrawText(\结果: 正在进行...\ case 1: pDC->SetTextColor(TCOLOR2);pDC->DrawText(\结果: 你输了-_- 加油!\ case 2: pDC->SetTextColor(TCOLOR2);pDC->DrawText(\结果: 你赢了,真棒!^_^\ case 3: pDC->SetTextColor(TCOLOR2);pDC->DrawText(\结果: 打成平手!\ default:break; }

/* pDC->SetTextColor(::GetSysColor(COLOR_3DSHADOW)); pDC->DrawText(\结果: 正在进行...\ pDC->SetTextColor(OldColor); pDC->SelectObject(oldfont);*/ }

void CJingZiQiView::OnStart2() { OnStart(); }

void CJingZiQiView::delay() { for(long i=0;i<13000;i++) for(long j=0;j<13000;j++); }

void CJingZiQiView::ShowReq_Rep(char *pMsg) { CDC *pDC=GetDC(); CRect CltRect,rect; GetClientRect(CltRect); rect.CopyRect(CltRect); rect.left+=300; CRect FstRect(rect.left+5,rect.top+130,rect.right,rect.top+160); pDC->SetTextColor(TCOLOR); pDC->SetBkColor(BCOLOR); pDC->DrawText(pMsg,FstRect,0); }

void CJingZiQiView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if(nIDEvent==1) { over=0; ShowState(); } CView::OnTimer(nIDEvent); }

七、软件测试计划

1.质量目标

测试时要达到的目标:测试软件系统的各功能点是否达到功能目标,反馈跟踪系统功能实现的缺陷及修复情况,从而提高软件系统的质量,最终满足用户的的使用需求.

2.测试策略

2.1 整体策略 2.2 测试范围 说明 功能测试 非功能测试 界面测试 测试游戏界面的元素,字体大小,颜色,风格,布局等 内 容 检查游戏的各个功能是否可以正常运行 检查游戏中除功能测试的其他项 测试工具和测试方法 QTP 自动测试 手动测试 静态界面测试 3.测试方法 3.1主要测试方法

采用黑盒测试法进行功能测试;

采用等价类划分,边界值分析,错误推算法设计测试数据; 及时记录缺陷和错误; 运行测试案例.

3.2 测试文档

3.3 测试实施过程

本节的目的是说明在测试过程中测试部门在接受测试系统时应执行什么检查。这些有助于其他部门(开发部门、用户教育部门)了解在发布测试系统时应做些什么。 1)测试系统接受条件

本节的目的说明在测试过程中测试部门在接受测试系统时应执行什么检查。 2) 测试时间表 测试项目 具体测试内容 测试游戏能否正常打开游戏的功能测试 各个功能键是否可以正常运行及用户体验是否舒服 兼能性测试 测试游戏能否在Windows各个系统中打开并运行 测试游戏的界面布局,界面元界面测试 素,字体大小颜色,风格和布局是否合理 1 2013.6.13 王沛棋 2 2013.6..10 吴汉彬 1 2013.6,13 顾炜 测试天数 (工作日) 测试起止日期 10月 22-31 责任人 3.4 功能测试(与需求分析保持一致)

被测名称 运行测试 主菜单 测试内容 游戏能否正常启动 开始 保存 载入 悔棋 退出 测试次数 20 20 出现bug次数 修复bug次数 1 4 0 0 设置 人机 联网 难度 计算机先下 20 0 0 关于井字棋 是否包含介绍应用的基本键位和功能说明 功能测试 应用运行中是否会频繁的导致程序死机或者重启 20 1 0 测试结果:测试结果显示本系统已实现需求中基本功能,能满足玩家的基本需求,不足之处在于系统功能相对不够完善,此次测试目的在于发现系统缺陷与漏洞从测试结果中没有发现严重系统缺陷。

3.5 性能测试 兼容性测试

与系统兼容性测试:

系统名称 Windows xp Windows 7 Windows 8 Windows Vista Windows Server 2003 测试内容 游戏能否正常启动 游戏能否正常启动 游戏能否正常启动 游戏能否正常启动 游戏能否正常启动 能否正常启动 能 能 能 能 否,会卡

与软件的兼容性测试 操作环境:

CPU: M350 @ 2.27GHz 内存: 2.0G

硬盘:500G

操作系统:microsoft windows xp 32位 运行软件名称 QQ 酷狗 Ituns Visual C++6.0 快播 测试内容 游戏能否正常启动 游戏能否正常启动 游戏能否正常启动 游戏能否正常启动 游戏能否正常启动 能否正常启动 能 能 能 能 能 3.6界面测试

1)测试环境与配置

CPU: Inter(R)Core(TM) i5 内存: 2.4G 硬盘:500G

操作系统:microsoft windows 7 32位

应用软件: Internet Explorer 7.0.5730.13 (IE 7.0) 2)测试方法(和工具)

本次测试主要是--静态界面测试.根据:合适性, 容易理解, 易用性, 及时反馈信息, 防错处理, 还原性, 一致性, 个性化,合理布局, 合理色彩, 适应用户,最少步骤最高效率, 可复用等界面特性作为测试参考,主要用的工具为Microsoft 的IE浏览器.版本号为: Internet Explore7.0.5730.13 (IE 7.0) 3)测试执行情况与记录 指标 合适性和正确性 001 编号 检查项 游戏界面是否与游戏的功能融洽 测试结果 融洽,该游戏功能菜单点击后会出现菜单,点击后会在下方出现菜单供用户选择 是,文字采用的字体大小和颜色合适且无错别字 002 是否所有界面元素的文字和状态都正确无误 003 004 是否所有界面元素(例如系游戏用图少,不存在让图标)都不会让人误解? 人误解的地方 是否所有界面元素提供了充分而必要的提示? 没有充分的提示,除了每个功能的标题能给与提示

外就没有其他提示。 005 指标 风格一致 006 编号 有联机帮助吗? 检查项 同类的界面元素是否有相同的视感和相同的操作方式? 字体是否一致? 是否符合广大用户使用同类游戏的习惯 所有界面元素都具备充分必要的操作键盘和鼠标操作吗? 没有 测试结果 是,的操作和一般的该游戏相似,在界面设计上差不多。 字体大小一致 符合用户习惯 该游戏只使用鼠标操作 007 008 适应各种水平的用户 个性化 009 010 是否具有与众不同的、否,界面设计简单,让用户记忆深刻的界过于大大众化。 面设计? 界面的布局符合软件的功能逻辑吗? 界面元素的尺寸是否合理?行、列的间距是否保持一致? 窗口切换、移动、改变大小时, 界面正常吗? 游戏是否提供帮助菜单 符合 合理。界面的元素尺寸合适不会让玩家找不到。间距一致,总体视感舒适。 正常,界面在窗口的变化下不会发生异常。 没有 合理布局和色彩 011 012 013 014

3.7测试检查表

测试人: 填表人: 日期: 测试内容 测试类别 测试方法 测试数据 正常状态 异常状态 3.8故障报告单 (缺陷跟踪工具) 测试人: 填表人: 日期: 测试内容

测试类别 测试方法 测试数据 正常状态 异常状态

异常状态说明: 责任人: 修改意见: 责任人: 复核测试结果 复核人: 4、测试组织 4.1 测试团队结构 序号 01 02 03 人员名称 顾炜 吴汉彬 王沛棋 职 责 功能测试 兼能性测试 界面测试 4.2 功能划分 测试模块

子模块数量 开发人员

八. 课程设计心得体会

(写出本次课程设计的收获、体会或相关建议)

参考文献

课程设计成绩评定表

题目: 学号、姓名: 对课程设计工作过 程的简短介绍和自 我评价 学生签名: 2013年 6 月 日 (以下由评定教师填写) 质量评价指标(在相应栏目打√)

评 价 质 量 评 价 项 目 优秀 工作量和态度 方案、设计可靠性 文字和图表质量 总体评价 良好 一般 及格 不及格 评定成绩(百分制) 评定教师签名

2013年 6 月 日 课程设计成绩评定表

题目:在线小游戏 学号、姓名:04100430 顾炜 本次测试执行准备充足完成了既定目标。但由于经对课程设计工作过验以及对工具使用不熟练因此对系统性能测试还有程的简短介绍和自待提高和加强,同时也感谢同组的同学在我不懂的时我评价 候给予帮助。 学生签名:顾炜 2013年 6月15 日

(以下由评定教师填写) 质量评价指标(在相应栏目打√) 评 价 质 量 评 价 项 目 优秀 工作量和态度 方案、设计可靠性 文字和图表质量 总体评价 良好 一般 及格 不及格 评定成绩(百分制) 评定教师签名

2013年 6 月 日 课程设计成绩评定表

题目:在线小游戏 学号、姓名:04100407 王沛棋 这次课程设计主要负责测试的部分,由于之前软件对课程设计工作过测试有做这方面的测试,所以准备工作还做得比较充程的简短介绍和自分,但是第一次做界面测试,所以有一些方面还是不我评价 会要去问做个这个测试的同学。 学生签名:王沛棋

2013年 6 月 13 日 (以下由评定教师填写) 质量评价指标(在相应栏目打√) 评 价 质 量 评 价 项 目 优秀 工作量和态度 方案、设计可靠性 文字和图表质量 总体评价 良好 一般 及格 不及格 评定成绩(百分制) 评定教师签名

2013年 6 月 日 课程设计成绩评定表

题目: 学号、姓名: 对课程设计工作过 程的简短介绍和自我评价 学生签名:

2013年 6 月 日 (以下由评定教师填写) 质量评价指标(在相应栏目打√) 评 价 质 量 评 价 项 目 优秀 工作量和态度 方案、设计可靠性 文字和图表质量 总体评价 良好 一般 及格 不及格 评定成绩(百分制) 评定教师签名

2013年 6 月 日 课程设计成绩评定表

题目: 学号、姓名: 对课程设计工作过 程的简短介绍和自我评价 学生签名:

2013年 6 月 日 (以下由评定教师填写) 质量评价指标(在相应栏目打√) 评 价 质 量 评 价 项 目 优秀 工作量和态度 方案、设计可靠性 文字和图表质量 总体评价 良好 一般 及格 不及格 评定成绩(百分制) 评定教师签名

2013年 6 月 日

本文来源:https://www.bwwdw.com/article/njdx.html

Top