目录
4第一章 课程设计目的和要求
41.1 C语言课程设计的目的
41.2 C语言课程设计的要求
5第二章 课程设计任务内容
6第三章 详细设计说明
63.1模块
63.1.1函数功能模块图
63.1.2模块描述
73.2 流程图
83.3系统程序流程图
93.4限制条件
93.5测试
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
10第四章 软件使用说明及运行结果
104.1使用说明
114.2 运行结果
15第五章 课程设计心得与体会
16附录1: 参考文献
17附录2: 源程序代码
第一章 课程设计目的和要求
1.1 C语言课程设计的目的
本次课程设计使得课堂教学与实验实践之间关系更为密切,让同学们认识到必须重视实践环节,多读程序,多编写程序,多上机实践。进一步培养结构化程序设计的思想,加深对高级语言要素和控制结构的理解,针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序风格。
本次课程设计着眼于知识的运用,把平常学的知识运用到课程时间中来,考察我们知识运用能力,对我们所学的理论知识进一步深化。
1.2 C语言课程设计的要求
1.
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
课程设计题目的要求。
2.
对系统功能模块进行分析,写出详细设计说明文档。
3.
编写程序代码,代码量要求不少于300行。调试程序使其能正确运行。
4.
设计完成的软件要便于操作和使用。
5.
设计完成后提交课程设计
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
。
第二章 课程设计任务内容
1. 题目:
俄罗斯方块
2. 需求分析:
制作一个俄罗斯方块的小游戏,用户能够通过上下左右键来控制方块,满行消去。
3. 备注:
基于windows环境下SDK编程,简易的图形界面。程序不对游戏分数进行统计。
第三章 详细设计说明
3.1模块
3.1.1函数功能模块图
图3-1 函数功能模块图
3.1.2模块描述
1.主函数
主函数为一有返回值型的整型函数,主要功能为执行游戏主线及定义边界。
2. 游戏执行函数
此函数为一无返回值型的函数,其功能为控制整个游戏的循环以及对各子函数的调用。
3. 输出函数
此函数的功能为刷新并输出游戏界面,包括游戏操作按键设置及游戏画面。
3.2 流程图
图3-2 函数流程图
3.3系统程序流程图
图3-3系统程序流程图
3.4限制条件
在玩游戏时,必须按规定的五个键才能控制挖金者,任何别的按键均无法控制挖金者的运动。
3.5测试计划
该程序可以让操作者看到自己所得的分数,当格子超出范围时游戏结束,当分数达到一定时游戏可以进入下一关。。
第四章 软件使用说明及运行结果
4.1使用说明
该程序可以实现对挖金子游戏的挖金、闯关和结束功能,安装VisualC++6.0中文版后,在工具栏“文件”中单击“新建”选项,单击“文件”菜单,选择“C++ Source file”输入文件名“单项选择题
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
化考试系统”。开始输入程序,程序输入完成,单击“组建”工具栏,选择“编译[简化版挖金子游戏.cpp1]”,待程序无误后,开始执行程序。
界面显示后,按要求首先按任意键开始游戏,进入游戏界面后用五个键控制操作者进行上下左右移动挖金子。
4.2 运行结果
图4-2-1开始界面
图4-2-2游戏进行界面一
图4-2-3游戏进行界面二
图4-2-4游戏结束界面
第五章 课程设计心得与体会
经过两个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己编程粗心大意,经常出错,通过学习也有所改进;再有对C语言的一些标准函数不太了解,还有对函数调用的正确使用不够熟悉,以及对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。这次的课程设让我认识到很多C++的内在要素:
1. 程序设计语言是程序设计的工具。这是我通过两周课程设计深深体会的一点,并且发现如果想有效的进行程序设计,正确地应用程序设计语言表达算法,必须准确的运用程序设计语言,掌握其语法知识。
2. 学习程序设计必须重视时间环节,多读程序,多编写程序,多上机实践。这次的课程设计就使得课堂教学、式样和实践之间的关系更为紧密。对我的学习有着很深远的影响。
3. 我发现作为一个程序设计人员,需要掌握面向过程的程序设计,也要掌握面向对象的程序设计。从前,人们通过C语言学习面向过程的程序设计,再通过C++学习面向对象的程序设计。其实C++并不是纯粹的面向对象的语言,它是一种混合语言。学习C++既可以编写面向过程的程序,也可以编写面向对象的程序。这一点是我通过可课程设计所的实践发现的。
4. 深切的感受到了C++语法的复杂,内容的繁多。发现如果对它缺乏系统的了解,将难以真正的运用,编出来的程序错误百出,编译出错,事倍功半。
这次的C++课程设计很快就要结束了,想说的是,这两周实践所学到的东西比我一个学期在教室学到的东西要多得多。设计中遇到很多难题,都是费了很大劲才解决得,但是所有的努力都没有白费,我的课程设计终于“竣工”了,而且更是从中感受到了一些书本上和课堂上所不能感受到的。
通过实践的学习,我认识到学好计算机要重视实践操作,不仅仅是学习C++语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己更好地学好计算机。
附录1: 参考文献
[1]、谭浩强编著:C++程序设计,北京:清华大学出版社,2004
[2]、(美)戴特尔(Deitel,H.M.)等编著,张引等译:C++大学基础教程(第五版),北京:电子工业出版社,2006.6
[3]、夏云庆编著:Visual C++ 6.0数据库高级编程,北京:希望电子出版社 2002
[4]、伍俊良编著:Visual C++6.0课程设计与系统开发
案例
全员育人导师制案例信息技术应用案例心得信息技术教学案例综合实践活动案例我余额宝案例
,北京:清华大学出版社,2002.11
附录2: 源程序代码
#include "stdafx.h"//没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。
#include
#include
#include
#define CELL 15 // 方格的边长(pix)
#define W 22 // 游戏区宽(22个方格边长)
#define H 30 // 游戏区高(30个方格边长)
#define MS_NEWBLOCK WM_USER+1 // 消息ID,产生新的方块
#define MS_DRAW WM_USER+2
LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM);//窗口过程处理
int WINAPI WinMain ( HINSTANCE hInstance, //当前实例句柄
HINSTANCE hPrevInstance, //前一实例句柄
PSTR szCmdLine, //指向程序命令行参数的指针
int iCmdShow) //应用程序开始执行窗口时显示方式用int类型标志
{
static char AppName[]="ToyBrick";//定义一个静态字符数组保存字符串"ToyBrick"(应用程序名)
HWND hwnd; //定义一个窗口句柄
MSG msg; //定义一消息结构体变量
WNDCLASSEX wndclass; //定义一窗口类结构变量,包含窗口类全部信息
int iScreenWide; //定义屏幕显示宽度
wndclass.cbSize = sizeof(wndclass);//窗口类对象大小
wndclass.style = CS_HREDRAW|CS_VREDRAW;//窗口类对象风格
wndclass.lpfnWndProc = WndProc;//窗口处理函数为WndProc
wndclass.cbClsExtra = 0; //窗口类无扩展
wndclass.cbWndExtra = 0;//窗口类实例没有扩展
wndclass.hInstance = hInstance;//当前实例句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);//窗口最小化图标为默认图标
wndclass.hCursor = LoadCursor (NULL,IDC_ARROW);//窗口当前光标为箭头光标
wndclass.hbrBackground = (HBRUSH)GetStockObject (BLACK_BRUSH);//获得当前背景设置为黑色
wndclass.lpszMenuName = NULL;//窗体菜单名为空
wndclass.lpszClassName = AppName;//应用程序名
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);//为应用程序加载图标
if(!RegisterClassEx (&wndclass)) return FALSE; //注册一个窗口类
// 获取显示器分辨率的X值iScreenWide,将程序窗口置于屏幕中央
iScreenWide=GetSystemMetrics (SM_CXFULLSCREEN);
//创建窗口
hwnd =CreateWindow (AppName,
"俄罗斯方块",
WS_MINIMIZEBOX|WS_SYSMENU ,
iScreenWide/2-W*CELL/2, CELL,
(W+1)*CELL-8, H*CELL,
NULL, NULL,
hInstance,
NULL );
if(!hwnd) return FALSE; //没有获得窗口句柄,返回假
ShowWindow (hwnd,iCmdShow); //显示窗口
UpdateWindow (hwnd); //更新窗口
MessageBox(hwnd,"开始游戏","开始",MB_OK);//显示Message
SendMessage(hwnd,MS_NEWBLOCK,0,0);//向当前窗口发送消息
SetTimer (hwnd, 1, 550,NULL);//设置下落时间
while (GetMessage (&msg, NULL, 0, 0))//进入消息循环
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return msg.wParam;
}
// 函数DrawRact: 画正方形
// 参数: 设备环境句柄和正方形的四角坐标
void DrawRect (HDC hdc, int l, int t, int r, int b)
{
MoveToEx (hdc, l, t, NULL);
LineTo (hdc, r, t);
LineTo (hdc, r, b);
LineTo (hdc, l, b);
LineTo (hdc, l,t);
}
// 函数DrawCell: 画方格
// 参数: 设备环境句柄和方格的四角坐标
// 每个方格由内外两个正方形(DrawCell)画成,使其有立体感
void DrawCell (HDC hdc, int l, int t, int r, int b)
{
DrawRect (hdc,l+1, t+1, r-1, b-1);
DrawRect (hdc,l+3, t+3, r-3, b-3);
}
// 函数DrawBlock: 画方块
// 参数: 设备环境句柄和方块中四个方格在游戏区域中的位置
// 每个方块由四个方格组成7种不同的形状
void DrawBlock (HDC hdc, int block[4][2])
{
int i;
HPEN hpen;
hpen =CreatePen (PS_SOLID,1,RGB(255,255,255));
SelectObject (hdc,hpen);
for(i=0; i<4; i++)
DrawCell (hdc, (block[i][0]-1)*CELL, (block[i][1]-1)*CELL, //....
block[i][0]*CELL, block[i][1]*CELL);
DeleteObject (hpen);
}
// 函数Cover: 清除原来位置的方块
// 参数: 设备环境句柄和待清除的方块
// 清除方块即在该方块的每个方块处画一个正方形的黑块
void Cover (HDC hdc, int org[4][2])
{
int i;
SelectObject (hdc, (HBRUSH)GetStockObject (BLACK_BRUSH));
for(i=0; i<4; i++)
Rectangle ( hdc, (org[i][0]-1)*CELL, (org[i][1]-1)*CELL, //.....
org[i][0]*CELL, org[i][1]*CELL);
}
// 窗口过程函数WndProc
LRESULT CALLBACK WndProc ( HWND hwnd,
UINT iMsg,
WPARAM wParam,
LPARAM lParam )
{
int i,j,k,lines,r;
static int top, sel, flag;
static int cells[W+2][H]; // 控制游戏的方格矩阵
static int org[4][2], block[4][2]; // 方块
HDC hdc;
HPEN hpen;
PAINTSTRUCT ps;
switch (iMsg)
{
case WM_CREATE:
top=H-1;
// 将第一列和最后一列方格置1,控制方块不超出游戏区域
for(i=0; i=top; k--)
cells[j][k]=cells[j][k-1];
top++;
InvalidateRect (hwnd, NULL, TRUE);
}
}
// 产生随机数0~7,分别代表方块的7种形状
srand( (unsigned)time( NULL ) );
sel =rand()%7;
//方块形状初始化,方块的形状由其每个方格的位置决定
// 游戏区宽W=22,block[?][0]=9/10/11/12,block[?][1]=0/1/2
// 这样方块初始位置在游戏区的最顶部的中央
switch(sel)
{
case 0:
// ▓▓
// ▓▓
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =11; org[1][1]=block[1][1] =0;
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =1;
break;
case 1:
// ▓▓▓▓
org[0][0]=block[0][0] =9; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =0;
org[2][0]=block[2][0] =11; org[2][1]=block[2][1] =0;
org[3][0]=block[3][0] =12; org[3][1]=block[3][1] =0;
break;
case 2:
//▓
//▓▓
// ▓
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =11; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =2;
break;
case 3:
// ▓
//▓▓
//▓
org[0][0]=block[0][0] =11; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =11; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =10; org[3][1]=block[3][1] =2;
break;
case 4:
//▓
//▓
//▓▓
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =2;
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =2;
break;
case 5:
// ▓
// ▓
//▓▓
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =10; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =2;
org[3][0]=block[3][0] =9; org[3][1]=block[3][1] =2;
break;
case 6:
// ▓
//▓▓▓
org[0][0]=block[0][0] =10; org[0][1]=block[0][1] =0;
org[1][0]=block[1][0] =9; org[1][1]=block[1][1] =1;
org[2][0]=block[2][0] =10; org[2][1]=block[2][1] =1;
org[3][0]=block[3][0] =11; org[3][1]=block[3][1] =1;
break;
default:
SendMessage (hwnd, MS_NEWBLOCK, 0, 0);
break;
}
return 0;
case WM_TIMER:
// 每个时间节拍方块自动下移一行
for(i=0; i<4; i++)
block[i][1]++;
// 检查方块下移是否被档住,即判断下移后新位置是否有方格
for(i=0; i<4; i++)
if(cells[ block[i][0] ][ block[i][1] ])
{
for(i=0; i<4; i++)
cells[ org[i][0] ][ org[i][1] ]=1;
if(top>org[0][1]-2) top=org[0][1]-2;
if (top<1)
{
KillTimer (hwnd, 1);
MessageBox (hwnd, "游戏结束,即将退出 !", "退出", MB_OK);
PostQuitMessage (0);
}
SendMessage (hwnd, MS_NEWBLOCK, 0, 0);
return 0;
}
SendMessage (hwnd, MS_DRAW, 0, 0);
return 0;
// 响应键盘控制
case WM_KEYDOWN:
r=0;
switch((int)wParam)
{
case VK_LEFT:
for(i=0; i<4; i++)
block[i][0]--;
break;
case VK_RIGHT:
for(i=0; i<4; i++)
block[i][0]++;
break;
case VK_DOWN:
for(i=0; i<4; i++)
block[i][1]++;
break;
// 按[向上键],方块顺时针旋转
//方块的旋转不是真正的旋转,而是根据不同的方块形状和
// 该方块旋转过的次数来移动其中的一个或几个方格,从而
// 达到旋转的效果 这样做很复杂,算法不够理想,但是能够保持方
// 块旋转时的重心比较稳定。
case VK_UP:
r=1;
flag++; //方块旋转加1
switch(sel) // sel代表当前方块的形状
{
case 0: break;
case 1:
flag =flag%2;
for(i=0; i<4; i++)
{
block[i][(flag+1)%2] =org[2][(flag+1)%2];
block[i][flag] =org[2][flag]-2+i;
}
break;
case 2:
flag =flag%2;
if(flag)
{ block[0][1] +=2; block[3][0] -=2; }
else
{ block[0][1] -=2; block[3][0] +=2; }
break;
case 3:
flag =flag%2;
if(flag)
{ block[0][1] +=2; block[3][0] +=2; }
else
{ block[0][1] -=2; block[3][0] -=2; }
break;
case 4:
flag=flag%4;
switch(flag)
{
case 0:
block[2][0] +=2; block[3][0] +=2;
block[2][1] +=1; block[3][1] +=1;
break;
case 1:
block[2][0] +=1; block[3][0] +=1;
block[2][1] -=2; block[3][1] -=2;
break;
case 2:
block[2][0] -=2; block[3][0] -=2;
block[2][1] -=1; block[3][1] -=1;
break;
case 3:
block[2][0] -=1; block[3][0] -=1;
block[2][1] +=2; block[3][1] +=2;
break;
}
break;
case 5:
flag=flag%4;
switch(flag)
{
case 0:
block[2][0] +=1; block[3][0] +=1;
block[2][1] +=2; block[3][1] +=2;
break;
case 1:
block[2][0] +=2; block[3][0] +=2;
block[2][1] -=1; block[3][1] -=1;
break;
case 2:
block[2][0] -=1; block[3][0] -=1;
block[2][1] -=2; block[3][1] -=2;
break;
case 3:
block[2][0] -=2; block[3][0] -=2;
block[2][1] +=1; block[3][1] +=1;
break;
}
break;
case 6:
flag =flag%4;
switch(flag)
{
case 0:
block[0][0]++; block[0][1]--;
block[1][0]--; block[1][1]--;
block[3][0]++; block[3][1]++;
break;
case 1:
block[1][0]++; block[1][1]++; break;
case 2:
block[0][0]--; block[0][1]++; break;
case 3:
block[3][0]--; block[3][1]--; break;
}
break;
}
break;
}
// 判断方块旋转后新位置是否有方格,若有,则旋转取消
for(i=0; i<4; i++)
if(cells[ block[i][0] ][ block[i][1] ])
{
if(r) flag +=3;
for(i=0; i<4; i++)
for(j=0; j<2; j++)
block[i][j]=org[i][j];
return 0;
}
SendMessage(hwnd, MS_DRAW, 0, 0);;
return 0;
// 清除当前方块,并在新的位置重新绘制方块
case MS_DRAW:
hdc =GetDC (hwnd);
Cover (hdc, org);
for(i=0; i<4; i++)
for(j=0; j<2; j++)
org[i][j]=block[i][j];
DrawBlock (hdc,block);
ReleaseDC (hwnd, hdc);
return 0;
// 按照方格矩阵重绘游戏区域的方格
case WM_PAINT:
hdc =BeginPaint (hwnd, &ps);
hpen =CreatePen (PS_SOLID,1,RGB(255,255,255));
SelectObject (hdc,hpen);
for (i=top; i
本文档为【俄罗斯方块设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。