职业学院游戏设计-天天打砖块游戏设计大学论文
打砖块游戏设计报告(共五则)

打砖块游戏设计报告(共五则)第一篇:打砖块游戏设计报告*************面向对象方法及程序设计课程设计报告打砖块游戏的设计与开发分组:第九组组员姓名:******************** 班级:*********** 指导教师: ****完成日期:2014年 06月21日面向对象方法及程序设计课程设计题目:打砖块游戏的开发与设计为了加强计算机科学与技术专业学生的学科实践能力,巩固和强化所学专业知识,提高学生的学习兴趣,本课程设计实践周特别强调理论与实践相结合,利用所学专业知识,进行实践项目的开发,提高学生的实践编程能力和技术文档的写作能力,提高学生的学习兴趣,为后期的学习奠定一定的实践基础。
目录第一章课程设计的目的与要求.............................................................................................3 1.1课程设计目的................................................................................................................3 1.2 课程设计的实验环境...................................................................................................3 1.3 课程设计的预备知识 (3)1.4课程设计要求 (3)1.4.1人员分配,形成课程设计小组............................................................................3 1.4.2 分析课程设计的题目要求.................................................................................3 1.4.3写出详细的设计说明............................................................................................3 第二章课程设计内容.............................................................................................................3 2.1设计思路 (3)2.2功能介绍 (4)2.3相关素材 (4)2.4程序整体设计说明........................................................................................................4 2.5程序部分源代码及注释................................................................................................4 2.6程序结构流程图 (6)2.7程序代码 (6)2.8运行程序 (17)第三章课程设计总结 (17)/ 19 面向对象方法及程序设计课程设计第一章课程设计的目的与要求1.1课程设计目的本次课程设计是计算机科学与技术专业最重要的实践环节之一。
基于Java的打砖块游戏毕业论文

北方民族大学学士学位论文论文题目基于JA V A的打砖块游戏开发系(部)名称: 计算机科学与工程学院学生姓名:专业: 软件工程学号:指导教师姓名:论文提交时间: 2014-5-7 论文答辩时间: 2014-5-17 学位授予时间:北方民族大学教务处制基于JAVA的打砖块游戏开发摘要打砖块是一款堪称经典的小游戏,在掌上游戏机上和许多手机上都能发现这个小游戏。
游戏基本内容是玩家通过控制一个能够左右移动的挡板,反弹正在运动中弹球,使之改变移动的方向,用小球消除游戏窗口里面的的砖块,然后到达下一关,在障碍物被消除的过程中,可能会产生一些能改变挡板或者小球状态的物品,例如:挡板变长、变短,小球威力加强等等。
本系统是一个基于Java语言平台的打砖块游戏。
主要任务是设计打砖块游戏的算法,并使用JA V A语言编写程序,最终完成游戏编程,并使之能够正确运行。
主要是小球的碰撞检测和运动轨迹的算法,碰撞部分可以将小球看成一个矩形,当矩形的边界坐标与砖块、挡板、墙壁等一样时,可以判断为进行了碰撞,而运动轨迹只要在碰撞后将X轴或Y轴取反就可以了。
本文第一章阐述了选题目的及Java游戏目前的发展现状。
第二章介绍了Java 语音的特点和基于Java游戏开发的相关的技术。
第三章详细介绍了打砖块游戏,包括游戏的规则和期待的效果等。
第四章进行打砖块游戏的具体设计与实现,包括界面的设计,类的设计,算法的设计等等。
第五章对游戏进行运行和测试,以期检测游戏中的各种问题。
期望通过本游戏实例掌握小型Java游戏开发和Java 编程的基础的知识和技巧,使自己具备开发Java游戏基本能力。
关键字:java,游戏设计,测试,打砖块,算法Arkanoid java-based developmentAbstractArkanoid is a small classic games on handheld game consoles and many mobile phones can be found on this little game. The basic content of the game by controlling a player can move around the baffle, the rebound is in motion pinball , making changes in the direction of movement , eliminating the bricks with a small ball inside the game window , then reach the next level , the obstacles process is eliminated , the shutter may be some change in the state of pellets or articles such as : the paddle length , shorter, and so enhance the power of the ball .This system is a Java-based platform Arkanoid game. The main task is to design algorithms Arkanoid game and using JAVA programming language , the final completion of game programming , and enable it to run correctly. The main collision detection algorithm and the trajectory of the ball , the ball collision portion may be regarded as a rectangle, the coordinates of the boundary rectangle when bricks , baffles , such as a wall , the collision can be judged , and exercise Just after the collision trajectory X -axis or Y -axis inverted it.The first chapter describes the purpose of the topic and the current status of the development of Java games , the second chapter introduces the Java -based voice features and related technologies Java game development , the third leg detailing Arkanoid games, including games rules and expectations effects, Chapter IV specific design and implementation of Arkanoid games, including interface design , class design , algorithm design, etc., the fifth chapter of the game running and testing in order to detect game various problems . Expected by the game master instance small Java game development and Java programming based knowledge and skills , so that they have the basic ability to develop Java games .Keywords : Java, Game Design, Game Testing , Arkanoid, The Algorithm目录摘要............................................................................................................................................... Abstract (I)第一章绪论 0选题的目的和意义 0游戏产业的发展现状 0第二章游戏开发的环境及相关技术 (2)开发环境 (2)Java语言特点 (2)GUI介绍 (3)第三章打砖块游戏介绍 (4)打砖块游戏的规则 (4)打砖块游戏预期的效果 (4)第四章打砖块游戏的设计与实现 (6)游戏模块设计 (6)游戏界面绘制模块 (6)游戏操作模块 (7)类的设计 (7)代码实现 (9)GameFrame类 (9)GamePanel类 (10)Pad类 (13)Block类 (14)Bullet类 (15)致谢 (19)第一章绪论选题的目的和意义Java 编程语言具有非常多的优点,它简单而健壮,高性能又可移植,面向对象、多线程和动态的语言等等。
趣味打砖块的设计理念

趣味打砖块的设计理念趣味打砖块作为一种休闲娱乐游戏,其设计理念往往注重简单易懂的操作和有趣的游戏玩法,旨在让玩家获得愉悦和挑战的体验。
在设计趣味打砖块的理念上,可以从以下几个方面考虑。
首先,游戏界面设计应简洁明了,使用鲜艳的色彩和简单直观的图标,让玩家一目了然地知道游戏目标和操作方法。
界面布局要合理,注重用户体验。
比如在游戏界面的上方显示得分、关卡进度等信息,下方设有操作指示按钮,左右两侧设置砖块状态和得分记录,给用户提供更多信息。
其次,打砖块的操作简单易上手,让玩家可以轻松上手并迅速掌握游戏要领。
游戏中常见的操作方式为滑动屏幕控制挡板左右移动,或者点击屏幕控制挡板弹出小球,然后通过移动挡板来反弹小球。
这样的操作方式简单直观,让玩家可以迅速上手。
此外,游戏难度适中,有层次感,既能给玩家带来挑战,又不至于让玩家感到过于困难。
游戏中可设置多个关卡,每个关卡难度逐渐上升,砖块布局更加复杂。
随着游戏的进行,砖块可能会不断变换形状,砖块之间也可能会出现一定的间隔,给玩家带来更多的挑战。
另外,不同类型的砖块可以有不同的特殊效果,增加游戏的趣味性。
比如,某些砖块被击中会爆炸并消除周围的砖块,某些砖块可能需要击中多次才能消除,某些砖块可能会掉落道具,玩家可以通过收集这些道具来获得更多的技能或加分。
最后,游戏音效的设计也非常重要,能够为游戏增添更多的乐趣。
比如击中砖块时可以发出欢快的音效,过关时可以播放胜利的音乐,失败时可以有不同的音效提醒玩家。
总之,趣味打砖块是一款简单且有趣的休闲游戏,其设计理念注重简洁、操作易懂、难度适中、砖块多样化、音效丰富等。
通过这些设计,可以让玩家在游戏中获得愉悦的体验,同时享受到一定的挑战和成就感。
《打砖块》游戏设计报告

——《打砖块》学院:班级:学号:姓名:一.游戏设计规则游戏开始时,小球会停在挡板正中间,且此时挡板可左右自由移动,当按下空格键后小球会弹出,并在程序设定的区域内不停的碰撞反弹。
当小球碰到墙壁、挡板和砖块时,均会以相反的速度反弹,并且砖块被碰撞后会自动消失。
挡板可左右移动以接住小球,若小球没有被接住,超出指定区域下边缘,则程序会自动提示“游戏结束”,点击“确定”后退出程序。
当所有的砖块均消失时,程序会弹出提示“恭喜你,你赢了”。
二.游戏设计思路整个游戏可以分为三个类:小球类、挡板类和砖块类。
其中最简单的当然是挡板了,在回调函数中增加“WM_KEYDOWN”的按键消息,在里面编写控制挡板移动的代码,挡板的移动是通过“上、下、左、右”四个键来实现的。
砖块在整个程序中负责两件事情,其一是程序初始化时随着小球和挡板出现在游戏界面中,再就是被小球碰到后消失。
控制砖块出现与否是通过一个bool变量“blockExist”来实现的,当该变量为“true”时,就将砖块贴到目标DC上,否则就不贴。
由于砖块数量很多,故可以用一个for循环来实现,所有的砖块用的都是一张图片,而变化的只是砖块的坐标。
本游戏中最复杂的要数小球了,因为小球要涉及到很多碰撞检测和反弹,而且这其中还和砖块、挡板有联系。
小球涉及到的碰撞有:小球与墙壁碰撞、小球与挡板碰撞、小球与砖块碰撞。
碰撞检测实际上是检测小球的坐标是否进入了某个特定的区域,若进入了,则小球要反弹;否则,按原来的路线继续前进。
小球能不断的反弹,事实上靠的是小球速度方向的改变,对于小球而言,它能出现在某个点上,是它所在坐标系中的坐标导致的。
若设小球的坐标为(x_ball,y_ball),其速度为水平:vx,竖直:vy,将其坐标与速度之间建立赋值关系,即:x_ball+=vx,y_ball-=vy。
只要对其坐标进行相对应的计算,就能控制小球的反弹了。
三.游戏主要代码int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){// TODO: Place code here.MSG msg;HACCEL hAccelTable;// Initialize global stringsLoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_APIDEMOGAME, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// Perform application initialization:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_APIDEMOGAME);// Main message loop:while (GetMessage(&msg, NULL, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;}A TOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;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_APIDEMOGAME);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName = (LPCSTR)IDC_APIDEMOGAME;wcex.lpszClassName = szWindowClass;wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);return RegisterClassEx(&wcex);}BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){hInst = hInstance; // Store instance handle in our global variablehWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW ,400, 100, 400, 500, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);GetClientRect(hWnd,&rect); //取得内部窗口区域大小HBITMAP bmp;m_bg=(HBITMAP)LoadImage(NULL,"matlab.bmp",IMAGE_BITMAP,0,0, LR_LOADFROMFILE);m_board=(HBITMAP)LoadImage(NULL,"Board.bmp",IMAGE_BITMAP,0, 0,LR_LOADFROMFILE);m_ball=(HBITMAP)LoadImage(NULL,"ball_0.bmp",IMAGE_BITMAP,0,0, LR_LOADFROMFILE);bgDC=GetDC(hWnd);mdc=CreateCompatibleDC(bgDC);scDC=CreateCompatibleDC(bgDC);boardDC=CreateCompatibleDC(bgDC);ballDC=CreateCompatibleDC(bgDC);bmp=CreateCompatibleBitmap(bgDC,1024,745);SelectObject(mdc,bmp);SelectObject(scDC,m_bg);SelectObject(ballDC,m_ball);SelectObject(boardDC,m_board);int i;int bx=40,by=30; //控制砖块坐标//初始化砖块for(i=0;i<BN;i++){if(block[i].blockExist)block[i].bKilled=0;block[i].blockDC=CreateCompatibleDC(bgDC);m_block[i]=(HBITMAP)LoadImage(NULL,"block.bmp",IMAGE_BITMAP, 32,21,LR_LOADFROMFILE);SelectObject(block[i].blockDC,m_block[i]);block[i].rc.left=bx;block[i].rc.top=by;block[i].rc.right=block[i].rc.left+64;block[i].rc.bottom=block[i].rc.top+32;bx+=60;}return TRUE;}/********控制小球碰壁后反弹*************/ void DrawBall(){//计算X轴方向贴图坐标与速度x_ball+=vx;if(x_ball<=0){x_ball=0;vx=-vx;bHeng=false;}else if(x_ball>=rect.right-32){x_ball=rect.right-32;vx=-vx;bHeng=true;}//计算Y轴方向贴图坐标与速度y_ball-=vy;if(y_ball<=0){y_ball=0;vy=-vy;bZong=false;}/* if(y_ball>=rect.bottom-32){y_ball= rect.bottom-32;vy=-vy;}*/}/*****判断小球是否与砖块相碰*******/void CheckCrashBlock(){int i;float WIDTH = 96;float HEIGHT = 64;float tan=HEIGHT / WIDTH;//tanθ的值for(i=0;i<BN;i++){float x_ =(float)(x_ball - block[i].rc.left);float y_ =(float)(y_ball - block[i].rc.top);if((x_ball>=block[i].rc.left-32&&x_ball<=block[i].rc.right)&&(y_ball>=bloc k[i].rc.top-32&&y_ball<=block[i].rc.bottom)){block[i].bKilled=1;block[i].blockExist=false;num--;}else if(tan > abs(y_ / x_)) //在1、3区域{vx=-vx;x_ball=vx;}else //在2、4区域{vy=-vy;y_ball-=vy;}*/}}}/*****判断小球是否与挡板相碰******/void CheckCrashBoard(){if((y_ball+32)>y){if(((x_ball+64)>=x)&&(x_ball<=(x+128))){vy=-vy;y_ball-=vy;// vx=10;}else{MessageBox(hWnd,"游戏结束","提示",MB_OK|MB_ICONSTOP);exit(0);}}}void DrawMap(){GetClientRect(hWnd,&rect); //取得内部窗口区域大小int i;if(!win){BitBlt(mdc,0,0,1024,745,scDC,0,0,SRCCOPY);for(i=0;i<BN;i++){CheckCrashBlock();if(block[i].bKilled) //||block[i].blockDC==0continue;else{BitBlt(mdc,block[i].rc.left,block[i].rc.top,block[i].rc.right-block[i].rc.left,blo ck[i].rc.bottom-block[i].rc.top,block[i].blockDC,0,0,SRCCOPY);}}//挡板贴图BitBlt(mdc,x,y,128,32,boardDC,0,0,SRCCOPY);//小球贴图if(isKeyDown){DrawBall();CheckCrashBoard();}BitBlt(mdc,x_ball,y_ball,32,32,ballDC,32,0,SRCAND);BitBlt(mdc,x_ball,y_ball,32,32,ballDC,0,0,SRCPAINT);}//将整个图贴到目的DC上BitBlt(bgDC,0,0,1024,745,mdc,0,0,SRCCOPY);}DWORD WINAPI ThreadProc(LPVOID lpParameter ){void *ct = (void *)lpParameter;while(1){DrawMap();Sleep(80);}delete ct;return 0;}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;void *ct;TCHAR szHello[MAX_LOADSTRING];LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);GetClientRect(hWnd,&rect);switch (message){case WM_COMMAND:wmId = LOWORD(wParam);wmEvent = HIWORD(wParam);// Parse the menu selections:switch (wmId){case IDM_START:{CreateThread(NULL,1024,ThreadProc,ct,0,NULL);}break;case IDM_STARTAGAIN:{x=300;y=300;x_ball=319;y_ball=270;DrawMap();}break;case IDM_ABOUT:DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}break;case WM_PAINT:{hdc = BeginPaint(hWnd, &ps);// TODO: Add any drawing code here...HBITMAPm_bottom=(HBITMAP)LoadImage(NULL,"matlab.bmp",IMAGE_BITMAP,102 4,745,LR_LOADFROMFILE);HDC hDC=CreateCompatibleDC(hdc);SelectObject(hDC,m_bottom);BitBlt(hdc,0,0,1024,745,hDC,0,0,SRCCOPY);DeleteObject(m_bottom);DeleteDC(hDC);ReleaseDC(hWnd,hdc);EndPaint(hWnd, &ps);}break;case WM_KEYDOWN:{switch(wParam){case VK_LEFT:x-=30;if(x<=0)x=0;if(!isKeyDown)x_ball-=30;break;case VK_RIGHT:x+=30;if(x>=rect.right-128)x=rect.right-128;if(!isKeyDown)x_ball+=30;break;case VK_SPACE:isKeyDown=1;break;}}break;case WM_DESTROY:PostQuitMessage(0);KillTimer(hWnd,1);DeleteObject(m_ball);DeleteDC(ballDC);DeleteObject(m_bg);DeleteObject(m_board);DeleteDC(scDC);DeleteDC(boardDC);ReleaseDC(hWnd,bgDC);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;}// Mesage handler for about box.LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch (message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL){EndDialog(hDlg, LOWORD(wParam));return TRUE;}break;}return FALSE;}四.游戏截图游戏截图(一)游戏截图(二)。
J2ME手机游戏设计之“打砖块”

J2ME手机游戏设计之“打砖块”一、游戏分析:随着现代社会发展的日新月异,人们平常工作学习的竞争也在加大,生活的压力也跟着加重。
所以利用闲暇之余,大家都需要休闲娱乐工具,来放松自己,缓解压力,消除紧张的疲劳状态。
在这样的背景下,打砖块游戏作为一向休闲手机游戏应运而生,它不仅能舒缓我们的身心,而且能够开发我们的动手能力,提高自己的反应敏捷程度,充实自己。
二、游戏规则设计:BeatBrick:打砖块游戏的游戏规则为,每局有三个球,也就是有三条生命。
首先发球,球在击打砖块后弹回。
此时,须用球拍接住弹回的球并令其继续击打砖块。
否则,球会掉出屏幕。
直至球全部使用完或通全关则游戏结束。
游戏开始时,小球会停在挡板正中间,且此时挡板可左右自由移动,当按下空格键后小球会弹出,并在程序设定的区域内不停的碰撞反弹。
当小球碰到墙壁、挡板和砖块时,均会以相反的速度反弹,并且砖块被碰撞后会自动消失。
挡板可左右移动以接住小球,若小球没有被接住,超出指定区域下边缘,则程序会提示游戏结束,点击“确定”后退出程序。
当所有的砖块均消失时,程序会提示你赢了。
三、游戏实现:1、J2ME,即Java 2 Micro Edition,是SUN公司推出的在移动设备上运行的微型版Java平台,常见的移动设备有手机,PDA,电子词典,以及各式各样的信息终端如机顶盒等等。
最重要的移动终端当然是手机了,因此,我们主要讨论手机相关的J2ME规范。
J2ME是Sun公司为嵌入式开发所定义的一个框架,一系列标准的规范所组成。
所以J2ME是一个协议簇,而不是单一的规范。
2、游戏由6个类构成:GameScreen:GameScreen类表示游戏的核心,它包括对象的移动、图像的绘制以读取和响应用户的输人。
本游戏从MIDP LCDUI的低级Canvas类派生一个类来代表游戏的屏幕,后面将对这个类进行详细的说明。
BeatBrick:由MIDIet继承而来的应用程序类来代表这个应用程序。
简单的打砖块游戏

程序设计课程报告————简单的打砖块游戏1.1任务目的结合本学期所学的C++相关知识,包括循环语句、if语句、结构分支swhich 语句和时间控制函数等的运用,以及一些小操作,以巩固知识和开拓创新为目的编制一个简单的打砖块小游戏。
1.2任务要求要求学生自主的完成小游戏的相关设计和调试,并且达到游戏的基本效果。
要求游戏编码达到300行以上,写下一些基本函数的作用。
2.任务内容自主设计一个小游戏,并用现有知识实现小游戏的一些基本功能。
我设计的是一个打砖块的小游戏,在dos界面下能够实现小球的移动,反弹,和挡板的左右移动及输入命令进行操控。
我编写了300多行相关代码,并在一些主要的函数和命令旁进行了标注诠释,使代码具有一定的可读性。
详细设计说明3.1模块描述本实验分三个模块,分别是用小星号画游戏中的各个部件包括矩阵砖列、小球、挡板。
在这一模块中,可分别定义一个子函数来画这三个部件。
还有一个是用一个子函数调用者三个子函数组成一副游戏中要用到的基本图形,方便在以后主函数中调用,这样节省了许多重复的调用。
最后是主函数部分,主函数包括两个部分也就是两个if语句的使用,其中一个用来控制挡板向左移动并判断是否结束,一个用来控制挡板向右移并判断是否继续。
简单的图形描述:图3.13.2 性能、输入项、输出项。
性能描述:在这个程序中,先出现一个演示图提示打砖块的基本方法和规则,然后会出现“想左移还是向右移的提示”,通过键盘输入一个命令代表方向控制挡板的移动方向,不同的方向会出现不同的结果。
输入项及输出项:在这个实验中,由玩家手动输入方向实现对画面的操作。
采用键盘输入代表方向的命令(数字或字母)。
画面输出相应效果。
3.3 各个模块的的算法:在绘制各个部件的模块中,绘制矩阵砖列只需用两个循环控制“*”的输出形成一个矩形的砖块,再用两个循环控制矩形砖块的排列形成一个矩形的砖块阵列。
而挡板的绘制则更加简单,只需将“*”排成一排构成挡板的形状即可。
弹砖块游戏机的分析与设计【设计论文】

图书分类号:密级:设计论文题目:弹砖块游戏机的分析与设计学生姓名班级学院名称专业名称指导教师论文原创性声明本人郑重声明:所呈交的论文,是本人在导师的指导下,独立进行研究工作所取得的成果。
除文中已经注明引用或参考的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品或成果。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标注。
本人完全意识到本声明的法律结果由本人承担。
论文作者签名:日期:年月日论文版权协议书本人完全了解关于收集、保存、使用论文的规定,即:本校学生在学习期间所完成的论文的知识产权归所拥有。
有权保留并向国家有关部门或机构送交论文的纸本复印件和电子文档拷贝,允许论文被查阅和借阅。
可以公布论文的全部或部分内容,可以将本论文的全部或部分内容提交至各类数据库进行发布和检索,可以采用影印、缩印或扫描等复制手段保存和汇编本论文。
论文作者签名:导师签名:日期:年月日日期:年月日一、设计题目:设计一个反弹打砖块游戏机。
基本要求1) 用二极管点阵或液晶显示屏(如12864)结合按键表示球桌和球拍。
其中,界面下方有一条横着的短板,界面上方有一堆固定位置的砖块,小球最初从板面出发,每当小球碰到一次砖块,砖块就会消失,而小球将会镜面反弹,碰到左右的墙壁时,小球也将镜面反弹。
小球在下方短板反弹的角度不一定要符合镜面反射原理。
2) 可以选择难度等级,不同关卡可设定不同界面上方障碍物形状,小球数目,或者小球速度。
3) 设定战绩统计时,可输入简单的字母,用于记录选手名称,掉电数据不消失。
二、设计方案:利用单片机最小板模块、加键盘模块和一个12864液晶既可以完成所需功能。
三、电路图:四、相关程序设计:程序设计包括四个方面:液晶基础画点画线程序部分、游戏基础算法部分、键盘控制部分、其他显示部分。
主程序如下:#include<reg52.h>#include <MATH.H>#define uchar unsigned char#define uint unsigned intsbit LCD_RS=P1^5;sbit LCD_RW=P1^4;sbit LCD_EN=P1^3;sbit LCD_RES=P2^3;sbit LCD_PSB=P2^7;#define dataport P0#define set_inc LCD_RS=0;#define set_data LCD_RS=1;#define set_write LCD_RW=0;#define set_read LCD_RW=1;#define set_en LCD_EN=1;#define clr_en LCD_EN=0;uchar jx0,jy0,jx1,jy1,jy2,jx2; //判断是否有图形接触的两个点的数值//uchar bianxing; //决定变形的数值uchar jzx0,jzx1,jzx2,jyx0,jyx1,jyx2,jzy0,jzy1,jzy2,jyy0,jyy1,jyy2;//用于横向判断,横向移位程序中使用uchar xia; //消影下坠的距离uchar mo; //消影的最后一行数uchar kuaishu=0; //表示消去的块数uchar quan=0; //表示全屏消去的次数uchar ball;uchar live=3;uchar xb=0,si=0,jb=0; //si=1表示没命玩了,jb是退出键脉冲检测数,键过于灵敏了uchar xv,u=0,v=0,end=0; //u为移动挡格的标志位,u==2时才移动一次,V同u,end为是否结束游戏uchar you=1,kai=0,sudu=50;//,fu=0,sudu=26; //fu为主界面箭头指示标志//uchar v1=0,v2=0,v3=0,v4=0,v5=0,v6=0,v7=0,v8=0,v9=0,v10=0,v11=0,v12=0;uchar rex,rey; //碰撞点uchar code suimage[]= // x:y=24:24 字:素{0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFB,0xEF,0xDC,0xFB,0x6F,0x8C,0xFB,0x6F,0x08,0xFB,0x6A,0x11,0xFB,0x62,0x33,0xFB,0x62,0x23,0xFB,0x63,0xA7,0xFB,0x69,0xB7,0xEB,0x69,0x80,0xE0,0x04,0x80,0xE0,0x04,0x80,0xEB,0x64,0x3E,0xFB,0x60,0x36,0xFB,0x61,0x26, 0xFB,0x69,0x03,0xFB,0x69,0x13,0xFB,0x6D,0x99,0xFB,0x6D,0x98,0xFB,0x6D,0x9C,0xFB, 0xEF,0xBC,0xFF,0xEF,0xFD,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00} ;uchar code diimage[]= //x:y=24:24,敵{0xFF,0xFF,0xFF,0xFE,0xFF,0xFC,0xFE,0x0F,0xF8,0xFE,0x00,0x70,0xFE,0x00,0x01,0xFE,0xFC,0x03,0xE6,0xFE,0x03,0xE0,0xF0,0x01,0xE0,0x10,0x78,0xFC,0x17,0xFC,0xFD,0x80, 0x00,0xFD,0xC0,0x00,0xFC,0x60,0x00,0xFC,0x0D,0x86,0xFC,0x0D,0x84,0xF1,0x80,0x34, 0xE1,0xE0,0x37,0xE5,0x80,0x07,0xED,0x0D,0x87,0xFD,0x2D,0x87,0xFD,0x60,0x00,0xFD, 0xE0,0x00,0xFD,0xE0,0x00,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00} ;uchar code miimage[]= //見{0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0xFF,0xFF,0xF0,0xFF,0xFF,0xF0,0xF0,0x00,0x7E,0xF0,0x00,0x7E,0xF0,0x00,0x7E,0xF7,0x77,0x7E,0xF7,0x77,0x00,0xF7,0x77,0x00,0xF7,0x77, 0x01,0xF7,0x77,0x7F,0xF7,0x77,0x7F,0xF7,0x77,0x1F,0xF7,0x77,0x07,0xF7,0x77,0x03,0xF7,0x77,0x61,0xF0,0x00,0x78,0xF0,0x00,0x7C,0xF0,0x00,0x7C,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFE,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00} ;uchar code koimage[]= // 事{0xFF,0xFF,0xBF,0xFB,0xFF,0xBF,0xFB,0xFF,0xBF,0xFB,0xFC,0x03,0xFB,0x0C,0x03,0xFB,0x0C,0x03,0xFB,0x0D,0xB7,0xFB,0x6D,0xB7,0xFB,0x6D,0xB7,0xFB,0x6D,0xB7,0xEB,0x6D, 0xB7,0xE0,0x00,0x00,0xE0,0x00,0x00,0xE0,0x00,0x00,0xFB,0x6D,0xB6,0xFB,0x6D,0xB6, 0xFB,0x6D,0xB4,0xFB,0x6D,0xB7,0xFB,0x0D,0xB7,0xFB,0x0D,0xB7,0xFB,0x0D,0xB7,0xFB, 0xFD,0xB7,0xFB,0xFF,0xBF,0xFF,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00} ;uchar code baimage[]= //晴{0xFF,0xFF,0xFF,0xFF,0xEF,0xFF,0xFB,0xEF,0xFF,0xFB,0x6C,0x00,0xFB,0x6C,0x00,0xFB,0x6C,0x00,0xFB,0x6D,0xB6,0xE0,0x0D,0xB6,0xE0,0x0D,0xB7,0xE0,0x0D,0xB7,0xFB,0x6D, 0xB7,0xFB,0x6D,0xB7,0xFB,0x6C,0x00,0xFB,0x6C,0x00,0xFB,0x6C,0x00,0xF8,0x00,0x03, 0xF8,0x00,0x03,0xF8,0x00,0x03,0xFB,0xF7,0xEF,0xFB,0xF7,0xEF,0xF8,0x00,0x03,0xF8,0x00,0x03,0xF8,0x00,0x03,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00} ;uchar code shiimage[]= // x:y=16:16 字:始{0xFE,0x7F,0xFC,0x40,0xF0,0x00,0xD2,0xC0,0xCE,0xDD,0xC6,0xDD,0xE0,0x40,0xF8,0x00, 0xFC,0x00,0xF8,0x19,0xD8,0x01,0xC0,0xE3,0xC0,0x00,0xFC,0x04,0xFD,0xFE,0xFF,0xFF, 0x00,0x00,0x00,0x00} ;uchar code kaiimage[]= // x:y=16:16 字:开{0xFE,0x7F,0xCE,0x7F,0xCE,0x7F,0xEF,0x7F,0xE0,0x00,0xE0,0x00,0xE0,0x00,0xEF,0x7F,0xEF,0x7F,0xE0,0x1F,0xE0,0x03,0xE0,0x01,0xEF,0x78,0xEF,0x7C,0xEF,0x7E,0xFF,0x7F,0x00,0x00,0x00,0x00} ;uchar code nanimage[]= // x:y=16:16 字:难{0xF7,0xFD,0xE4,0x99,0xE4,0x99,0xE6,0xDD,0xC0,0x01,0x80,0x01,0x96,0xDD,0xC0,0x00, 0xC0,0x00,0xF8,0x00,0xE0,0x61,0xE0,0x01,0xF6,0x0F,0xF4,0x03,0xF4,0xF0,0xF7,0xFC,0x00,0x00,0x00,0x00} ;uchar code duimage[]= // x:y=16:16 字:度{0xF6,0xFE,0xE4,0xFE,0xE4,0xFE,0xF2,0xDE,0xF0,0x0C,0xF0,0x40,0xC6,0x51,0xC6,0x59, 0xD0,0x00,0xF0,0x06,0xF6,0xDE,0xF6,0xDF,0xE0,0x03,0xE0,0x00,0xFF,0xF8,0xFF,0xFE,0x88,0x71,0xDD,0x01} ;uchar code shengimage[]= // x:y=16:16 字:生{0xFE,0xFE,0xFC,0xEC,0xFC,0xCC,0xFC,0xCC,0xFE,0xCE,0xEE,0xEE,0xE0,0x00,0xE0,0x00, 0xE0,0x00,0xF6,0xEE,0xF0,0xEE,0xF0,0x2E,0xF0,0x0E,0xFF,0x0E,0xFF,0xEE,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00} ;uchar code mingimage[]= // x:y=16:16 字:命{0xFE,0xFF,0xFE,0x7F,0xFE,0x01,0xFC,0x00,0xFC,0x00,0xF8,0xBD,0xF0,0x00,0xE0,0x00, 0xC6,0x81,0xC2,0x01,0xF0,0x01,0xF8,0x81,0xFC,0x01,0xFE,0x01,0xFF,0x3F,0xFF,0xBF,0x00,0x00,0x00,0x00,0x00,0x00} ;uchar code xinimage[]= // x:y=8:8 字:心形{0xFF,0xDF,0xAF,0x77,0xBB,0x77,0xAF,0xDF} ;void int_INT0() //INT0初始化函数{//TCON = 0X01; //负边沿触发IT0=1;EX0 = 1; //开INT0中断EA = 1; //开总中断}void int_INT1() //INT1初始化函数{//TCON = 0X04; //负边沿触发IT1=1;EX1 = 1; //开INT01中断EA = 1; //开总中断}void int_timerT0() //T0初始化函数{TMOD = 0X05; //定时方式1,计数器模式C/T=1ET0 = 1; //开T0中断EA = 1; //开总中断TH0 = (65536-1)/256;TL0 = (65536-1)%256;TR0 = 1;//开始计时}void delayms(uint ums){uint i,j;for(i=ums;i>0;i--){for(j=110;j>0;j--);}}void delay7us(uchar t){while(--t);}void busycheck(){dataport=0xff;set_inc;set_read;set_en;while((dataport&0x80)==0x80);clr_en;// LCD_RS=0;// LCD_RW=0;}void sendcom(uchar command) //写命令{busycheck();set_inc;set_write;//clr_en;dataport=command;//delayms(1);set_en;//delayms(1);clr_en;//LCD_RS=0;//LCD_RW=0;}void senddata(uchar display) //送数据{busycheck();set_data;set_write;//clr_en;P0=display;// delayms(1);set_en;//delayms(1);clr_en;//LCD_RS=0;//LCD_RW=0;}uchar readdata() //读数据{uchar redata;busycheck();dataport=0xff;set_data;set_read;set_en;redata=dataport;delay7us(5);clr_en;delay7us(5);return redata;// LCD_RS=0;// LCD_RW=0;}void lcdclear(){sendcom(0x01);delayms(15);}void prinf(uchar x,uchar y,bit color) //画点程序{uchar row,lie,liebit;uchar datah,datal;x&=0x7f;y&=0x3f;lie=x/16; //将点所在的16位区所在区号移入低四位liebit=x%16; //将所在区中的具体位置移入低四位if(y<32){row=y;}else{row=y-32;lie+=8;}sendcom(0x34);sendcom(0x34);sendcom(0x80+row);sendcom(0x80+lie);readdata();datah=readdata();datal=readdata();sendcom(0x80+row);sendcom(0x80+lie);if(liebit<8){if(color){senddata(datah|(0x01<<(7-liebit)));senddata(datal);}else{senddata(datah&(~(0x01<<(7-liebit))));senddata(datal);}}else{if(color){senddata(datah);senddata(datal|(0x01<<(15-liebit)));}else{senddata(datah);senddata(datal&(~(0x01<<(15-liebit))));}}sendcom(0x36);}void init() //初始化程序{delayms(40); //大于40MS的延时程序LCD_PSB=1; //设置为8BIT并口工作模式delayms(1); //延时LCD_RES=0; //复位delayms(1); //延时LCD_RES=1; //复位置高delayms(10);//Write_Cmd(0x30); //选择基本指令集//DelayUs2x(50); //延时大于100ussendcom(0x30); //选择8bit数据流delay7us(25); //延时大于37ussendcom(0x0c); //开显示(无游标、不反白)delay7us(50); //延时大于100ussendcom(0x01); //清除显示,并且设定地址指针为00H delayms(15); //延时大于10mssendcom(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动delay7us(50); //延时大于100us}void LCD_Clear_GDRAM() //绘图区清除程序{uchar i,j;for(j=0;j<32;j++){sendcom(0x34);sendcom(0x80+j);sendcom(0x80);sendcom(0x34); //基本指令集,绘图关for(i=0;i<32;i++){ senddata(0x00); } // 写入0x00}sendcom(0x36);sendcom(0x30);}void drawliney(uchar x0,uchar x1,uchar y,bit color) //Y为一常值,X为一变量{uchar temp;if(x0>x1){temp=x1;x1=x0;x0=temp;}for(;x0<=x1;x0++){prinf(x0,y,color);}}void drawlinex( unsigned char Y0, unsigned char Y1, unsigned char X, unsigned char Color ){unsigned char Temp ;if( Y0 > Y1 )Temp = Y1 ;Y1 = Y0 ;Y0 = Temp ;}for(; Y0 <= Y1 ; Y0++)prinf( X, Y0, Color) ;}void kuai(uchar x,uchar y) //此x,y代表该块的标志起点{drawlinex(y,y+14,x,1);drawlinex(y,y+14,x+4,1);drawliney(x,x+4,y,1);drawliney(x,x+4,y+14,1);}uchar rekuai(uchar x,uchar y) //对需要消去的块的标志数进行判断,此为碰到x轴线的情况{uchar num;if(x>=1&&x<=5){if(y>=2&&y<=16){num=1;}if(y>=17&&y<=31){num=2;}if(y>=32&&y<=46){num=3;}if(y>=47&&y<=62){num=4;}}else if(x>=6&&x<=10){if(y>=2&&y<=16){num=5;if(y>=17&&y<=31){num=6;}if(y>=32&&y<=46){num=7;}if(y>=47&&y<=62){num=8;}}else if(x>=11&&x<=16){if(y>=2&&y<=16){num=9;}if(y>=17&&y<=31){num=10;}if(y>=32&&y<=46){num=11;}if(y>=47&&y<=62){num=12;}}return num;}void xiaokuai(uchar z) //消块程序,z为块的名称代数{uchar x,y,v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12;if(kuaishu==0){v1=0;v2=0;v3=0;v4=0;v5=0;v6=0;v7=0;v8=0;v9=0;v10=0;v11=0;v12=0;}switch(z){case 1: x=1;y=2;v1=1;break;case 2: x=1;y=17;v2=1;break;case 3: x=1;y=32;v3=1;break;case 4: x=1;y=47;v4=1;break;case 5: x=6;y=2;v5=1;break;case 6: x=6;y=17;v6=1;break;case 7: x=6;y=32;v7=1;break;case 8: x=6;y=47;v8=1;break;case 9: x=11;y=2;v9=1;break;case 10: x=11;y=17;v10=1;break;case 11: x=11;y=32;v11=1;break;case 12: x=11;y=47;v12=1;break;}kuaishu=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v11+v12;if(kuaishu==12){v1=0;v2=0;v3=0;v4=0;v5=0;v6=0;v7=0;v8=0;v9=0;v10=0;v11=0;v12=0;}drawlinex(y,y+14,x,0);drawlinex(y,y+14,x+4,0);drawliney(x,x+4,y,0);drawliney(x,x+4,y+14,0);//drawlinex(0,63,0,1);//drawliney(0,127,0,1);//drawliney(0,127,63,1);}void display(uchar x,uchar y,uchar xx,uchar yy,uchar *p) //显示图片函数,xx为x轴的长度,yy为y轴的长度{uchar i,k;uchar row,lie;//lie=x/16; //将点所在的16位区所在区号移入低四位for(i=0;i<yy;i++){lie=x/16; //将点所在的16位区所在区号移入低四位if(y+i<32){row=y+i; //在第一地址区打点,此为该区的Y坐标}else{row=y+i-32; //在第二地址去打点,此为该区的Y坐标lie+=8; //更改地址区后,相应更改X坐标,使之往第二区写数据}sendcom(0x34);sendcom(0x34);sendcom(0x80+row);sendcom(0x80+lie);for(k=0;k<xx/8;k++){senddata(*p++);}sendcom(0x36);}}void xiaozi(uchar x,uchar y,uchar xx,uchar yy) //消去插入字{uchar i;for(i=y;i<y+yy;i++){drawliney(x,x+xx,i,0);}}void xiaoxin(){if(live==2){xiaozi(96,6,8,8);}else if(live==1){xiaozi(96,13,8,8);}else if(live==0){xiaozi(96,20,8,8);}void charuzi() //插入字显示{if(quan==1){xiaozi(64,32,24,24);xiaozi(64,6,24,24);display(64,32,24,24,suimage);display(64,6,24,24,diimage);}if(quan==2){xiaozi(64,32,24,24);xiaozi(64,6,24,24);display(64,32,24,24,miimage);display(64,6,24,24,koimage);}if(quan>=3){xiaozi(64,32,24,24);xiaozi(64,6,24,24);display(64,32,24,24,suimage);display(64,6,24,24,baimage);}}void drawkuai(){kuai(1,2);kuai(1,17);kuai(1,32);kuai(1,47);kuai(6,2);kuai(6,17);kuai(6,32);kuai(6,47);kuai(11,2);kuai(11,17);kuai(11,32);kuai(11,47);ball=2;}uchar panduan(uchar x,uchar y) //判断这一点是否有点,有则停止,横向也可以这样判断,这是判断点的程序{uchar num=0;uchar reh,rel,redata,xbyte,xbit;xbyte=x/16;xbit=x%16;if(y>=32){y=y-32;xbyte+=8;}sendcom(0x80+y);sendcom(0x80+xbyte);readdata();reh=readdata();rel=readdata();if(xbit<8){redata=reh&(0x01<<(7-xbit));if(redata!=0){num=1;}}else{redata=rel&(0x01<<(15-xbit));if(redata!=0){num=1;}}return num;}void tanzhuan(uchar x,uchar y,uchar g,uchar z) //轨迹程序,画轨迹并判断判断四周是否有点,有则按规律更改轨迹{uchar a=-1,b=1,renum,i=0,num0,c,d,zen=1,e=0,o=0,p=0; //i为是否退出弹砖,0继续,1退出,e为是否有两点,o=1表示第一点跃出边界,保持第二点,p=1反之uchar a1=-1,b1=-1,c1,d1,xz=x,yz=y,gz=g,zz=z; //xz保存x初值,yz保持y初值ball=1; //ball表示场上有几个球{//prinf(45,45);if(zen==0){prinf(x+a,y+b,1); //画点renum=panduan(x+2*a,y+2*b); //判断行进路线中是否有点if(ball==2){delayms(sudu/2);}else{delayms(sudu);}prinf(x-c,y-d,0);c=a;d=b;x=x+a; //保存当前点坐标y=y+b;if(x==49&&renum==0){o=1; //第一点跃出边界ball--;prinf(x,y,0);prinf(x-c,y-d,0);prinf(x-2*c,y-2*d,0);}if(renum==1) //如果有点{if(y==61) //y轴尽头则把y置负让它返回{if(x==6|x==11|x==16){a=1;}b=-1;}if(y==2) //y轴起始把y置位让它递加{if(x==6|x==11|x==16){a=1;}b=1;if(x==1) //x轴起始把x置位让它递加{a=1;renum=panduan(x+a,y+b);if(renum==1){if(b==1){b=-1;}else{b=1;}}}if(x==49) //x轴末尾把x置反让它返回{a=-1;}if(x!=1&&x!=126&&y!=2&&y!=61&&x!=49) //在除开四周边遇上点时按如下规律更改轨迹{if(x==6|x==11|x==16) //反向碰到的是x坐标,则把x置反{a=1;num0=rekuai(x-1,y);xiaokuai(num0);renum=panduan(x+a,y+b);if(renum==1){if(b==1){b=-1;}else{b=1;}}}else if(x==5|x==10) //如果正向碰到的是x坐标,则把x置反{a=-1;num0=rekuai(x+1,y);xiaokuai(num0);renum=panduan(x+a,y+b);if(renum==1){if(b==1){b=-1;}{b=1;}}}else if(y==16|y==31|y==46) //如果从沿y轴正向碰到y坐标,则把y置反,并消块{b=-1;num0=rekuai(x,y+1);xiaokuai(num0);renum=panduan(x+a,y+b);if(renum==1){if(a==1){a=-1;}else{a=1;}}}else if (y==17|y==32|y==47) //如果从沿y轴负向碰到y坐标,则把y置反,并消块{b=1;num0=rekuai(x,y-1);xiaokuai(num0);renum=panduan(x+a,y+b);if(renum==1){if(a==1){a=-1;}else{a=1;}}}}if(kuaishu==12){kuaishu=0; //不明原因会多记一个块数。
打砖块游戏设计_课程设计材料

计
要
求
1.要求利用c#的进行代码编辑以及组件开发原理来完成系统的设计;
2.界面要求:要求界面简洁美观,简单易用。
工
作
量
在两周时间内完成编程,并写成报告形式
工
作计划ຫໍສະໝຸດ 1.准备工作阶段2.选题和资料收集
3.设计阶段
4.调试阶段
5.整理相关资料,完成报告
参
考
资
料
[1]郑阿奇,梁敬东等.C#实用教程[M].电子工业出版社,2009
课程设计材料
(2016-----2017学年度第一学期)
题 目:打砖块游戏设计
学生姓名:
学生学号:1608220203
专 业:
班 级:
指导教师:
学院制
二0一六年十月十五日
课程设计任务书
学 号
1608220203
学生姓名
专业(班级)
题目
打砖块游戏设计
设
计
技
术
参
数
硬件要求能运行Windows操作系统的微机系统。C#程序设计语言及相应的集成开发环境visual
[6]王进强.Visual 基础教程[M].清华大学出版社,2004
指导教师签字
系主任签字
年月日
课程设计评审表
指导教师评语
成绩
评定
指导教师签字:
年 月 日
答辩教师评语
成绩
评定
答辩教师签字:
年 月 日
二级学院工作小组意见
成绩
评定
二级学院领导签字(盖章):
年 月 日
[2] 刘洪成.C#高级教程[M].清华大学出版社,25003
[3]孙永强等.VisualC#.NE入门与提高[M].北京:清华大学出版社,2002
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
江苏城市职业学院毕业设计说明书论文题目天天打砖块游戏设计学号1225070107姓名陶圣杰指导教师汪筱红职称副教授办学点无锡办学点教学班12计网(五)2016年11月27日目录摘要 (1)ABSTRACT (2)第一章引言 (3)1.1游戏的开发历史 (4)1.2游戏的特点 (5)第二章系统开发环境 (7)2.1开发背景 (7)2.2开发工具 (7)2.2.1G AME M AKER8.0引擎介绍 (7)2.2.2G AME M AKER8.0功能与特色 (8)2.3GML语言介绍 (10)2.4应用环境 (10)2.4.1硬件环境 (10)2.4.2软件环境 (10)第三章概要设计 (12)3.1系统功能设计 (12)3.1.1主角 (12)3.1.2背景音乐和音效 (12)3.2系统功能设计流程 (13)3.3系统相关功能联系设计 (14)3.3.1控制板主要事件 (14)3.3.2子弹功能联系 (16)第四章系统实现 (18)4.1打砖块主要类基本功能分析 (18)4.1.1R OOM类 (18)4.2G AME R OOM (23)4.3主要对象 (25)4.3.1控制板 (26)4.3.2子弹 (27)4.3.3砖块类 (21)4.4音乐和音效 (30)4.4最高分数 (31)第五章重要算法实现 (33)5.1碰撞事件实现 (33)5.1.1球板碰撞 (34)5.1.2球砖碰撞 (35)5.1.3球墙碰撞 (36)5.2球的转向事件 (37)总结和展望........................................................................ .38 致谢. (48)参考文献 (49)摘要本设计采用GameMaker引擎,GML语言的运用,多种图片,美化素材和音效的运用,制作的天天打砖块游戏。
本游戏分为3个难度,简单,中等,困难,每个难度,有不同的球速和关卡设置。
本游戏画面精致,操作人性化,非常适合各年龄段的玩家,休闲娱乐用。
最独特的内容为天赋系统,因本游戏总体难度偏高,因而需要玩家合理的分配天赋,才能通过关卡,天赋共有3类,子弹天赋,控制板天赋求天赋,共有3个点数可进行分配,用来强化原有的属性,帮助玩家通关。
设置音效分为背景音乐的设置还有音效的设置,这里的设置主要是开关。
音乐是背景音乐,音效是当发射子弹时,球和墙壁碰撞,球和砖块碰撞等各种音效。
积分榜是玩家的得分展示,游戏最后可以根据积分来判断玩家是否破纪录,每关结束,根据自己的得分,在积分榜排位,玩家可以通过主界面积分榜按钮任意查阅。
另有独特的爆气系统,玩家可通过击落砖块,通过控制板接住掉落下来的砖块,积累能量值,当能量值到达一定程度,使用空格键即可爆气,球进入贯穿加速状态。
当玩家开始游戏,玩家可以通过鼠标滑动,控制板的滑动,鼠标左键发射球,通过控制板的移动击打上方砖块,通过右击发射子弹,进行击落砖块。
高端玩家可以在接球的同时,接掉落下来的砖块,通过空格键进入爆气状态。
每个被击落的砖块,即增加总分,连续的砖块击打会有更高的分数加成,当全部砖块被击落,则玩家挑战成功,总分被记入积分榜,如果在砖块还未被完全击落前,控制板没有接住球,则挑战失败。
关键字 GameMaker引擎,GML语言,游戏开发第一章引言1.1游戏的发展历史电子游戏(Electronic Games)又称视频游戏(Video Games)或者电玩游戏(简称电玩),是指所有依托于电子设备平台而运行的交互游戏。
根据媒介的不同多分为四种:电脑游戏、主机游戏(或称家用机游戏、电视游戏)、掌机游戏、街机游戏和移动游戏(主要是手机游戏)。
完善的电子游戏在20世纪末出现,改变了人类进行游戏的行为方式和对游戏一词的定义,属于一种随科技发展而诞生的文化活动。
电子游戏也可代指“电子游戏软件”。
电子游戏于1952年面世,为井字棋游戏,游戏平台是真空管电脑,当时现代电脑也只是刚面世不足十年。
之后出现的是发布于1958年的网球游戏《双人网球》(Tennis For Two),虽然说是网球游戏,实际上的画面却比较类似现代的气垫台。
1961年-1962年,《超级大战》诞生,可算是现今所有纵向飞行游戏的始祖。
1971年,诺兰·布什内尔以超级大战为基础改良,推出史上第一部街机,但市场尚未获回响。
1975年,Atari公司推出家用机,在平民家庭推广,引起流行,令更多厂商投入制造家用机,市场上大量出现变种游戏。
1976年,Fairchild Channel F上市,它是第一台采用卡带为媒介可更换游戏的家用游戏机。
1977年,Atari推出家用游戏机Atari2600,带动全球电玩热潮,同年,任天堂第一部家用游戏机Color TV Game 6在日本上市。
1970年代,文字式游戏出现,也是Atari的黄金期。
1976年Atari易手,全力发展电子游戏事业;日本方面,另一大厂Taito也加入游戏界战团,推出了经典游戏《太空侵略者》。
1980年代初,各款经典游戏相继发行,首先Namco推出《吃豆人》,期后Zork推出《创世纪》,任天堂亦推出《大金刚》;其他电器大厂如飞利浦和IBM也加入电子游戏业,美国EA电子艺界亦在这时组成。
1980年代中期,Atari、世嘉及任天堂将战场转移到家用游戏机硬件上,同时推出新款家用机。
1980未期是电子游戏的转折点。
电脑由于得到显卡的强大支持,开始渐渐掘起;另一大突破是,任天堂推出Game Boy,打开了便携式游戏机的无限发展空间。
踏入90年代,家用机已占游戏市场8成,任天堂发行超级任天堂,世嘉亦宣言将会在不久将来推出次世代家用机,吸引了大众的焦点,家用机大战一触即发;街机方面,capcom推出街头霸王,为街机争回喘息的机会;Pentium芯片面世,亚洲中文地区亦开始自行开发针对IBM PC兼容机的电脑游戏,《仙剑奇侠传》、《炎龙骑士团》、《神奇传说》等经典游戏相继推出。
1990年代中,次世代游戏机横空面世,世嘉和索尼分别发表Sega Saturn及PlayStation,任天堂即时被打沉,惟有在两年后推出N64反击。
21世纪前,家用游戏形成三足并立的局面,N64原本在机能上远胜另外两款家用机,不过其插卡带游戏模式,使N64流失大量玩家游戏开发商,为求改变局面,世嘉最先推出新款家用机——Dreamcast;正当各款家用机正争持不下的时候,微软的视窗系统几乎已经垄断家用电脑市场,模拟人生、无尽的任务、暗黑破坏神分别在电脑平台上登场。
踏入二千年,索尼率先向世嘉还击,推出PlayStation 2(PS2),01年,任天堂亦跟随推出新机种GameCube,同年,电脑软件龙头微软进军电子游戏业,发行了首部家用机Xbox,电子游戏混战由三国变成四国,不过,二千年早期的家机大战,由索尼高姿态胜出,至今已经卖出超过一亿台主机,论机能,其实都不分轩轾,不过索尼背靠强劲的多个游戏开发商,全球热爆的大作最终幻想(Final Fantasy)、勇者斗恶龙(Dragon Quest)、生化危机(Bio Hazard)都选择着陆在索尼的主机PS2上,令PS2在第二次家用机大战中获胜;与此同时,电脑游戏再次分家,分为单机游戏和网络游戏;单机版游戏方面,自02年开始,Maxis发行的模拟人生已经连续称霸了电脑游戏榜多年;网络游戏则被称为最具发展潜力的项目,尤其是在中国大陆,原因是拥有电脑及能连上互联网的人,远比拥有任何一款家用机的人多;在二千年,西方国家已经发展了数年的网络游戏,EQ及UO已经在西方国家生根,在亚洲国家则刚起步,台湾游戏金庸群侠传及韩国游戏仙境传说均引起热潮。
二千年中期,网络游戏由于其一直为人诟病的外挂问题,使其发展停济不前,惟独暴风雪的魔兽世界能一枝独秀;被人遗忘了的便携式游戏机起了另一场风云,雄霸了便携式游戏机市场近十五年的任天堂,接受索尼新机PlayStation Portable的正面冲击,任天堂推出新主机Ninetndo Dual Screen(NDS)迎战,但两者方向迥异。
2006年,家用机市场再起风云。
世嘉完全退出了家用机硬件的战场,回归到游戏开发上;在第三次家用机大战中,微软首先出招,推出Xbox 360,以强劲的电脑底板作支持,在电子运算上远超当时其他主机,索尼推出PlayStation 3,索尼在PS3上创新地使用了蓝光光盘,但由于游戏开发成本高昂,令不少大厂家退出索尼的幕后,任天堂则推出Wii,Wii在机能上远逊于两机,不过具有动态感应的新型主机操作方式,以真实互动为卖点,成为最为畅销的主机,且避开了于微软、索尼的直接竞争。
直至2009年中,三款家用机各有长短,Wii销售领先,Xbox 360屡发质量问题,但是其线上游戏;电脑游戏方面,依然是模拟人生和魔兽世界两只游戏,分别在单机游戏和网络游戏领先,不过网络游戏的涌现,令大量粗制滥造的产品充斥市面,同时线上游戏分支网页游戏以及逆行传统商业游戏模式的独立游戏崛起;苹果的iphone则扩展了手机游戏市场。
1.2游戏的特点一、游戏的描述性特征在解释什么是游戏时,研究者们将游戏的特征加以描述,试图将游戏与非游戏区别开来。
对游戏的描述性特征达成了以下共识:(一)游戏是内部动机控制的行为游戏是一种内驱性的行为,它既不受食欲的动机支配,也不受社会要求或行为本身以外的诱因所左右。
是由内部动机引起的、主动的、自发的活动,是由游戏者自由选择,非强制性的,不受外部强加规则制约的。
(二)游戏是重过程、轻结果的行为游戏行为的目标是由游戏者自我规定的,而不是他人强加的,它不受外部世界的约束,因此游戏行为的目标可以根据游戏者的意愿而发生变化,游戏行为是自发的。
游戏者不需要考虑游戏以外的结果,正如哲学家马丁·海德格说:“儿童为什么要游戏呢?儿童游戏就因为他们游戏。
‘因为’二字在游戏中消失了。
游戏没有‘为什么’。
儿童在游戏中游戏。
”转引自郑也夫著:《游戏人生》,海南出版社1997年版,第40页。
游戏的过程比游戏以外的结果更受游戏者的关注,儿童可能会打散已经建立的、作为工具的行为的顺序,并用新的方式把它们重新组合起来。
认为这可以帮助人们把游戏与那些由内部动机激起的、指向特定目的的活动(如愉快的工作)区别开来,也可以将游戏与无目的的活动(如闲荡)区别开来。
游戏是获得愉快体验的手段,而不只对某种特别的目的作出努力,从功利的角度看,游戏本身是非生产性的。
(三)游戏是与探究不同的行为探究行为是由外界刺激所产生的问题所引起的,是以获得物体的特性的信息为目标的。
而游戏行为是受有机体支配的问题所引起的。
科妮·赫特的“超级玩具”实验,很好地说明了探究行为与游戏行为之间的区别。