C语言编写俄罗斯方块实验报告.docx
《C语言编写俄罗斯方块实验报告.docx》由会员分享,可在线阅读,更多相关《C语言编写俄罗斯方块实验报告.docx(56页珍藏版)》请在冰豆网上搜索。
![C语言编写俄罗斯方块实验报告.docx](https://file1.bdocx.com/fileroot1/2023-4/17/8e96df6b-d149-496c-900f-4d75e9d8fbaf/8e96df6b-d149-496c-900f-4d75e9d8fbaf1.gif)
C语言编写俄罗斯方块实验报告
`````````
贵州师范大学
学院:
数计学院
班级:
13级数媒班
学号:
姓名:
摘要
……………………………………………………………………………………………………..
关键字:
第一部分设计总概
摘要…………………………………………………………………………………………………
一、设计目的
二、设计要求
三、设计内容
四、系统分析与设计
第二部分数据结构设计
第三部分功能实现与程序调试………………………………………………………………….
第四部分完成设计
一、实习日记
二、实习总结
三、教师评语
四、程序使用说明书………………………………………………………………………….
第一部分设计总概
一、设计目的
二、设计要求
三、设计内容
四、系统分析与设计
第二部分数据结构设计
第三部分功能实现与程序调试
第四部分完成设计
一、实习日记:
二、实习总结:
………………………
三、教师评语:
设计成绩:
指导老师签名:
摘要
使用C语言编写一个俄罗斯方块游戏系统,要求程序运行后有一个图形用户界面,实现各种方块的生产,包括形状和颜色等信息,完成左右下旋转的功能,在消行的同时分数加10,在点击暂停或者按下空格的时候暂停或开始游戏,最后结束游戏.
关键字:
音乐、背景、按键控制、暂停、继续、停止,难度级别
第一部分设计总概
一、设计目的:
本课程设计是一个综合性的实践教学环节,目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、软件设计技术和设计思想的理解,并能运用所学知识进行开发。
希望通过本课程设计中简单系统的开发,使学生掌握软件设计的基本方法和基本流程,提高自己的综合应用能力。
二、设计要求
利用C++编写俄罗斯方块游戏,使俄罗斯游戏能够在MicrosoftVisualC++6.0上运行该游戏。
二、设计内容:
俄罗斯方块
(1)游戏等级:
游戏分为难中易三个等级,等级越高,方块下落速度越快;
(2)由方向键控制游戏:
上键控制方块变形、下键控制方块下移并判断是否有消行、左键控制方块左移、右键控制方块右移;
(3)游戏积分:
一次性消的行数越多加的分数越多,当达到一定分数自动提高一个游戏等级。
三、系统分析与设计
1.程序功能模块:
2.程序流程图:
第二部分数据结构设计
1.游戏需求
随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。
2.游戏界面需求:
良好的用户界面,以键盘操作,有关数显示和分数显示。
让方块在一定的区域内
运动和变形,并且显示下一个即将出现的方块。
3.游戏形状(方块)需求:
良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。
第三部分功能实现与程序调试
程序:
//testBlock.cpp:
Definestheentrypointfortheapplication.
//
#defineCreateWindowCreateWindowA
#include"stdafx.h"
#include"resource.h"
#include//PlaySound函数的头文件
#pragmacomment(lib,"WINMM.LIB")
#include"commctrl.h"
#pragmacomment(lib,"comctl32.lib")
#include
#include
HMENUhMenu;//菜单句柄
#defineIDM_NEW40001
#defineIDM_PAUSE40002
//#defineIDM_STOP40003
#defineIDM_HELP40008
#defineIDM_MUSIC40010
#defineIDM_LEFT1001
#defineIDM_RIGHT1002
#defineIDM_UP1003
#defineIDM_DOWN1004
#defineIDC_RADIO11005
#defineIDC_RADIO21006
#defineCOLOR_BTNFACE15
#defineMAX_LOADSTRING100
#defineTIMER_DROP_ID1
intc=0,contin=1;
intcnext=0;
intch1=0;
intch2=0;
intch3=1;
intmusic=0;
BOOLbMusicOn;//音乐开关
intiMusicBG;//背景音乐
canRotate(intrank);
BOOLCALLBACKMusicDlgProc(HWND,UINT,WPARAM,LPARAM);
voidTetrisMusic(BOOL);
voidMusicItem(int);
staticTBBUTTONtbButtons[]=
{
{0,IDC_JIXU,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},
{1,IDC_PAUSE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},
{2,IDM_STOP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1},
{3,IDM_MUSIC,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},
{4,IDM_HELP1,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},
{0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1},
{5,IDM_ABOUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1},
};//工具栏数据结构
structBlock{POINTa;POINTb;POINTc;POINTd;};//方块模型数据结构
staticBlockTetris[7][4]=
{
//□□
//□□
(1)
{
{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}},
{{0,0},{0,1},{1,0},{1,1}},{{0,0},{0,1},{1,0},{1,1}}
},
//□□
//□□
(2)
{
{{0,0},{1,0},{1,1},{2,1}},{{1,0},{1,1},{0,1},{0,2}},
{{0,0},{1,0},{1,1},{2,1}},{{1,0},{1,1},{0,1},{0,2}}
},
//□□
//□□
(2)
{
{{1,0},{2,0},{0,1},{1,1}},{{0,0},{0,1},{1,1},{1,2}},
{{1,0},{2,0},{0,1},{1,1}},{{0,0},{0,1},{1,1},{1,2}}
},
//□□□□
(2)
{
{{0,0},{1,0},{2,0},{3,0}},{{1,0},{1,1},{1,2},{1,3}},
{{0,0},{1,0},{2,0},{3,0}},{{1,0},{1,1},{1,2},{1,3}}
},
//□
//□□□(4)
{
{{1,0},{0,1},{1,1},{2,1}},{{0,0},{0,1},{1,1},{0,2}},
{{0,0},{1,0},{2,0},{1,1}},{{1,0},{0,1},{1,1},{1,2}}
},
//□
//□□□(4)
{
{{0,0},{0,1},{1,1},{2,1}},{{0,0},{1,0},{0,1},{0,2}},
{{0,0},{1,0},{2,0},{2,1}},{{1,0},{1,1},{0,2},{1,2}}
},
//□
//□□□(4)
{
{{2,0},{0,1},{1,1},{2,1}},{{0,0},{0,1},{0,2},{1,2}},
{{0,0},{1,0},{2,0},{0,1}},{{0,0},{1,0},{1,1},{1,2}}
}
};//七种方块全部变形数据结构
intx=4;//以方块为单位
inty=-1;
intnBlockAreaX=10;//背景窗口
intnBlockAreaY=30;
intBlockMatrix[19][10];
intnBlockKind=0;
intnBlockColor=0;
intnBlockState=0;
intnBlockAreaXnext=220;//显示窗口
intnBlockAreaYnext=37;
intBlockMatrixnext[8][6];
intnBlockKindnext=0;
intnBlockColornext=0;
intnBlockStatenext=0;
intgamescore=0;
BOOLBGame=FALSE;
BOOLbGOver=FALSE;
HWNDhWnd;
HDChdc;
HDChMemDC=NULL;
HDChWndDC=NULL;
//GlobalVariables:
HINSTANCEhInst;//currentinstance
TCHARszTitle[MAX_LOADSTRING];//Thetitlebartext
TCHARszWindowClass[MAX_LOADSTRING];//Thetitlebartext
HBITMAPbmp[999]={0};
//Fowarddeclarationsoffunctionsincludedinthiscodemodule:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);
voidDrawTetris(HDChdc,intoffsetX/*0*/,intoffsetY/*0*/,intrank/*nouse*/);
voidTools(HWNDhWnd);
LoadImage();
voidGameStart();
voidDrawNext(HDChdc);
voidGameOver();
voidDrawButton(LPARAMlParam);
LPARAMlParam;
intAPIENTRYWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,
LPSTRlpCmdLine,
intnCmdShow)
{
//TODO:
Placecodehere.
MSGmsg;
HACCELhAccelTable;
//Initializeglobalstrings
LoadString(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadString(hInstance,IDC_TESTBLOCK,szWindowClass,MAX_LOADSTRING);
MyRegisterClass(hInstance);
FILE*fp=NULL;////////////
charch[50];
fp=fopen("test.txt","r");
fgets(ch,523,fp);
ch1=atoi(ch);
fclose(fp);////////
//Performapplicationinitialization:
if(!
InitInstance(hInstance,nCmdShow))
{
returnFALSE;
}
hAccelTable=LoadAccelerators(hInstance,(LPCTSTR)IDC_TESTBLOCK);
charfileName[100]={0};
//res\\1.bmp
for(inti=0;i<9;i++)
{
sprintf(fileName,"res\\%d.bmp",i+1);
bmp[i]=(HBITMAP)LoadImage(NULL,fileName,0,0,0,LR_LOADFROMFILE);//LOADIMAGEFROMFILE
}
for(i=0;i<=18;i++)
{
for(intj=0;j<=9;j++)
{
BlockMatrix[i][j]=-1;
}
}
for(intm=0;m<=5;m++)
{
for(intn=0;n<=5;n++)
{
BlockMatrixnext[m][n]=-1;
}
}//beijing
inta=1000;
SetTimer(hWnd,TIMER_DROP_ID,a,NULL);
hWndDC=GetDC(hWnd);
hMemDC=CreateCompatibleDC(NULL);
//Mainmessageloop:
Tools(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
if(!
TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
returnmsg.wParam;
}
ATOMMyRegisterClass(HINSTANCEhInstance)
{
WNDCLASSEXwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=(WNDPROC)WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,(LPCTSTR)IDI_ICON1);
wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+2);
wcex.lpszMenuName=MAKEINTRESOURCE(IDC_TESTBLOCK);
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_ICON1));
returnRegisterClassEx(&wcex);
}
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
hInst=hInstance;//Storeinstancehandleinourglobalvariable
hWnd=CreateWindow(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,200,350,485,NULL,NULL,hInstance,NULL);//窗口大小设置
if(!
hWnd)
{
returnFALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
returnTRUE;
}
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
intwmId,wmEvent;
PAINTSTRUCTps;
HDChdc;
TCHARszHello[MAX_LOADSTRING];
LoadString(hInst,IDS_HELLO,szHello,MAX_LOADSTRING);
switch(message)
{
caseWM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
//Parsethemenuselections:
switch(wmId)
{
caseIDM_UP:
SendMessage(hWnd,WM_KEYDOWN,VK_UP,0);
SetFocus(hWnd);
break;
caseIDM_DOWN:
SendMessage(hWnd,WM_KEYDOWN,VK_DOWN,0);
SetFocus(hWnd);
break;
caseIDM_RIGHT:
SendMessage(hWnd,WM_KEYDOWN,VK_RIGHT,0);
SetFocus(hWnd);
break;
caseIDM_LEFT:
SendMessage(hWnd,WM_KEYDOWN,VK_LEFT,0);
SetFocus(hWnd);
break;
caseIDM_START:
{
InvalidateRect(hWnd,0,1);
GameStart();
}
break;
break;//开始按键
caseIDC_PAUSE:
//暂停
{
BGame=FALSE;
MessageBox(NULL,"你好,游戏暂停","暂停",MB_OK);
}
break;
caseIDC_JIXU:
//继续
{
if(contin!
=0)
BGame=TRUE;
}
break;
caseIDM_STOP:
//停止
BGame=FALSE;
GameOver();
break;
caseIDC_easy:
InvalidateRect(hWnd,0,0);
ch3=1;
MessageBox(NULL,"你好,你选择的难易程度为简单","简单",MB_OK);
SetTimer(hWnd,TIMER_DROP_ID,1000,NULL);
break;
caseIDC_normal:
InvalidateRect(hWnd,0,0);
ch3=2;
MessageBox(NULL,"你好,你选择的难易程度为一般","一般",MB_OK);
SetTimer(hWnd,TIMER_DROP_ID,500,NULL);
break;
caseIDC_difficult:
MessageBox(NULL,"你好,你选择的难易程度为困难","困难",MB_OK);
ch3=3;
InvalidateRect(hWnd,0,0);
SetTimer(hWnd,TIMER_DROP_ID,100,NULL);
break;
caseIDM_beijing:
{
SelectObject(hMemDC,bmp[8]);
BitBlt(hWndDC,0,20,2000,2000,hMemDC,0,0,SRCCOPY);
InvalidateRect(hWnd,0,0);//重绘
//InvalidateRect(hwnd,NULL,false);重画时不擦除背景
}
break;
caseIDM_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(IDD_HELP1),hWnd,(DLGPROC)About);
break;
caseIDM_HELP1:
DialogBox(hInst,MAKEINTRESOURCE(IDD_help2),hWnd,(DLGPROC)About);
break;
caseIDM_MUSIC:
DialogBox(hInst,MAKEINTRESOURCE(IDD_MUSIC),hWnd,MusicDlgProc);
break;
caseIDM_music1:
MusicItem(IDM_music1);
break;
case