C语言打砖块游戏
- 格式:doc
- 大小:160.50 KB
- 文档页数:15
打砖块游戏设计报告(共五则)第一篇:打砖块游戏设计报告*************面向对象方法及程序设计课程设计报告打砖块游戏的设计与开发分组:第九组组员姓名:******************** 班级:*********** 指导教师: ****完成日期: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课程设计目的本次课程设计是计算机科学与技术专业最重要的实践环节之一。
C语言编写俄罗斯方块实验报告实验报告一、实验目的实践C语言的基本语法和操作,测试自己对C语言的熟练程度,实现俄罗斯方块游戏的基本功能。
二、实验步骤1.定义游戏界面:使用二维数组定义游戏界面,用字符来表示方块的状态(空白、正在下落的方块、已经固定的方块)。
2.实现方块的生成和选择:定义方块的类型,通过随机数生成下一个方块,用一个变量来保存下一个方块的类型,并在游戏界面上进行展示。
3.实现方块的下落和移动:方块可以通过用户的操作左右移动和旋转,同时也会自动下落,每当方块到达底部或者碰到已经固定的方块时,就会停止下落。
4.实现方块的旋转:将方块表示为二维数组,通过改变数组元素的位置实现方块的旋转。
5.实现方块的消除:当一行方块被填满时,该行会消除,并且上面的方块会下落填充空缺。
三、实验结果成功实现了俄罗斯方块的基本功能,可以进行游戏的开始、暂停、重新开始、结束等操作。
在游戏过程中,方块可以通过键盘的方向键左右移动,通过按下空格键进行快速下落,通过旋转方向键进行方块的旋转。
当方块都不能下落时,游戏结束,会提示游戏结束的信息,并显示最终得分。
四、实验总结通过本次实验,我进一步了解了C语言的基本语法和操作,也体验到了编程的乐趣。
通过这个实验,我对C语言有了更深入的理解,在实现俄罗斯方块的过程中锻炼了自己的逻辑思维能力和编程能力。
同时,我也学会了如何进行代码的调试和优化,使得程序的运行更加流畅和高效。
在后续的学习中,我将更加深入地学习C语言的高级特性,不断提升自己的编程水平。
通过不断的实践和练习,我相信我可以在C语言编程方面取得更进一步的进展,完成更加复杂和有挑战性的任务。
总体而言,本次实验收获颇多,不仅提高了我的编程能力,也为我的学习之路打下了良好的基础。
我相信在今后的学习和工作中,这些经验将会成为我不断进步的动力和宝贵的财富。
C语⾔实现反弹球消砖块游戏本⽂实例为⼤家分享了C语⾔实现反弹球消砖块游戏的具体代码,供⼤家参考,具体内容如下1.⽬标要求:1.击中上⽅⽅块’H’,分数加12.下⽅控制线没有接到⼩球时,游戏结束2.C语⾔代码:#include<stdio.h>#include<stdlib.h>#include<windows.h>#include<conio.h>/*《反弹球消砖块》 by:你最珍贵———————————|控制信号: | 左 | 右 |———————————| 键盘: | j | l |———————————1.击中上⽅⽅块'H',分数加12.下⽅控制线没有接到⼩球时,游戏结束*/void HideCursor(){ //隐藏光标位置 ,这个函数复制代码就⾏CONSOLE_CURSOR_INFO cursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);}void gotoxy(int x,int y){ //把光标放在(0,0)位置 ,这个函数复制代码就⾏HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos;pos.X = x;pos.Y = y;SetConsoleCursorPosition(handle,pos);}int IsEnd;//是否结束int interface_x,interface_y;//界⾯⾏数、列数int block_y;//砖块列位置int ctrlline_width,ctrlline_left,ctrlline_right;//控制线的左列数,宽度,右列数int ball_x,ball_y;//⼩球位置int ballv_x,ballv_y; //⼩球⾏列速度(1为正⽅向-1为反⽅向)int scores;//分数int ballv_num;//⼩球速度的慢速变量,数值越⼤越慢int ballv_num_i;//⼩球慢速变量值的循环变量void startup(){ //【数据初始化】HideCursor();//不显⽰光标IsEnd = 0;interface_x = 22;interface_y = 30;block_y = rand()%(interface_y-6)+2;ctrlline_width=8;ctrlline_left=(interface_y-ctrlline_width-2)/2+1+1;//控制线最左列位置ctrlline_right=ctrlline_left+ctrlline_width-1;ball_x=interface_x-1;ball_y=ctrlline_left+ctrlline_width/2;ballv_x=1;ballv_y=1;scores=0;ballv_num=3;ballv_num_i=1;}void show_begin(){//【初始页⾯展⽰】int i,j;int start=0;char input;while(!start){gotoxy(0,0);//每次输出页⾯把⿏标放回(0,0)for(i=1;i<=interface_x/2-4;i++) printf("\n");for(i=1;i<interface_y/2-8;i++) printf(" ");printf("《反弹球消砖块》\n\n");for(i=1;i<interface_y/2-9;i++) printf(" ");printf("请按任意键开始游戏\n\n");for(i=1;i<=interface_x/2-6;i++) printf("\n");if(kbhit()){input = getch();if(input) start=1;}}}void show(){ //【显⽰画⾯】gotoxy(0,0);//每次输出页⾯把⿏标放回(0,0)int i,j;for(i=1;i<=interface_y/2-8;i++) printf(" ");printf("《反弹球消砖块》") ;for(i=1;i<=interface_y/2-8-8;i++) printf(" ");printf("分数:%3d\n",scores);for(i=1;i<=interface_x;i++){printf(" ");//使屏幕对称加的空格for(j=1;j<=interface_y;j++){if(j==1||j==interface_y){ //边框printf("|");}else if(i==interface_x){ //边框printf("_");}else if(i==1){ //上边界printf("V");}else if(i==interface_x-1&&(j>=ctrlline_left&&j<=ctrlline_right)){ //控制线printf("*");}else if(i==2&&(j>=block_y&&j<=block_y+4)){ //砖块printf("H");}else if(i==ball_x&&j==ball_y){ //反弹球printf("O");}else printf(" "); //什么也不是的位置输出空格}printf("\n");}}void update_outinput(){ //【与输⼊⽆关的更新】ballv_num_i= (ballv_num_i==ballv_num)?1:ballv_num_i+1;//ballv_num_i⼀次从{1到ballv_num}循环,当ballv_num_i为最⼤时才更新球的位置,此⽬的是减速 if(ballv_num_i==ballv_num){if(ball_y==2||ball_y==interface_y-1){//判断是否到左右边界ballv_y *= -1;}if(ball_x==2){//判断是否到上边界if(ball_y>=block_y&&ball_y<=block_y+4){//判断在上边界有⽆消去砖块block_y = rand()%(interface_y-6)+2;//消去则砖块位置重置scores++;//分数加1printf("\a");//提⽰⾳}ballv_x *= -1;//不论是否碰砖块,都要反弹}if(ball_x==interface_x-1){//判断是否下边界接住⼩球了,若接住反弹,否则结束游戏if(ball_y>=ctrlline_left && ball_y<=ctrlline_right){ballv_x *= -1;}else{IsEnd = 1;}}ball_x += ballv_x;ball_y += ballv_y;}}void update_input(){//【与输⼊有关的更新】char input;if(kbhit()){input = getch();if( input == 'j'){//输⼊“j”下⽅控制线左移ctrlline_left= (ctrlline_left==2)?2:ctrlline_left-1;ctrlline_right= ctrlline_left+ctrlline_width-1;}else if( input == 'l'){//输⼊“l”下⽅控制线右移ctrlline_left= (ctrlline_left==interface_y-ctrlline_width)?\interface_y-ctrlline_width:ctrlline_left+1;ctrlline_right= ctrlline_left+ctrlline_width-1;}}}void show_end(){//【显⽰失败界⾯】system("cls");printf("\n\n\n\n\n\ngame over!\n\n\n\n\n\n\n\n\n\n\n\n\n");system("pause");//暂停system("pause");//暂停}int main(){startup(); //数据初始化show_begin();//初始页⾯while(!IsEnd){ //游戏循环执⾏show(); // 显⽰画⾯update_outinput(); //与输⼊⽆关的更新update_input(); //与输⼊有关的更新}show_end(); //显⽰失败界⾯return 0;}3.运⾏结果:⼩游戏玩法:《反弹球消砖块》by:你最珍贵————————————————————|控制信号: | 左 | 右 |————————————————————| 键盘: | j | l |————————————————————以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
2016-2017学年第一学期《Windows程序设计》课程设计报告题目:打砖块游戏设计专业:班级:姓名:指导教师:成绩:二0一六年十一月十五日目录1.设计目的与要求 (3)1.1设计目的 (3)1.2设计要求 (3)2.设计内容 (3)2.1内容简介 (3)2.2设计说明 (3)3.实现过程 (4)3.1主界面 (4)3.2 游戏界面 (5)3.3帮助界面 (6)3.4开始/结束游戏 (6)3.5游戏过关提示 (9)3.6异常处理说明 (9)4.设计心得 (10)5.参考文献 (11)6.附录 (12)1.设计目的与要求1.1设计目的通过打砖块游戏设计,加深我对理论教学内容的理解和掌握Visual Studio 中Windows窗体的建立及窗体中各个控件的使用,以及界面的设计。
同时熟悉C#语言的编程,提高分析和解决实际问题的能力,了解基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
1.2设计要求界面要求:要求界面简洁美观,简单易用。
设计要求:按程序设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握c#.net2003的基本技能和面向对象的概念和方法;了解windows编程。
同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
2.设计内容2.1内容简介打砖块游戏:作为我们一款熟知的游戏我想大家都不陌生吧,就是通过挡板把小球挡回,不让小球落地,直到打光所有砖块为止,游戏过关进入更难得模式小球速度更快,砖块组成的图案发生改变,是一个很有趣味的小游戏。
2.2设计说明2.2.1需求分析本系统为一个用C#实现的为我们所熟悉的简单的打砖块游戏,该系统的具体功能如下:(1) 能简便的开始游戏,游戏中的功能与日常我们所熟悉的游戏的功能一致 ,直到砖块全部打光过关和在砖块打光之前机会用完游戏结束功能;(2) 当游戏结束时会自动弹出消息框提示本关所获得得分数;(3) 当过关时会出现提示图片,点击进入下一关,下一关的方块位置和所组成的形状会发生改变。
C#课程设计(打砖块)辽宁工业大学C#.NET程序设计课程设计(报告)题目:打砖块游戏院(系):软件学院专业班级:计算机信息管理101班学号: 101403009学生姓名:姜洪亮指导教师:胡峰教师职称:助教起止时间:2011.11.21至2011.12.02程序设计专题(报告)任务及评语目录第1章程序设计专题目的与要求 (1)1.1 程序设计目的 (1)1.2 程序设计的实验环境 (1)1.3 程序设计的预备知识 (1)1.4 程序设计要求 (1)第2章程序设计内容 (2)2.1概要设计 (2)2.2程序整体设计说明 (2)2.3程序部分源代码及注释 (8)2.4测试结果 (12)第3章程序设计总结 (13)参考文献 (14)第1章程序设计目的与要求1.1 程序设计目的《C#.Net程序设计》是计算机科学与技术专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是软件技术专业学生学习完《C#.Net程序设计》课程后,进行的一次全面的综合训练,C#.Net 程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
1.2 程序设计的实验环境硬件要求能运行Windows xp操作系统的微机系统。
C#.Net程序设计语言及相应的集成开发环境visual 。
1.3 程序设计的预备知识熟悉c#语言及visual 集成开发环境。
1.4 程序设计要求按程序设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握c#.net2003的基本技能和面向对象的概念和方法;了解windows编程。
目录第1章程序设计专题目的与要求 (1)1.1 程序设计目的 (1)1.2 程序设计的实验环境 (1)1.3 程序设计的预备知识 (1)1.4 程序设计要求 (1)第2章程序设计内容 (2)2.1概要设计 (2)2.2程序整体设计说明 (2)2.3程序部分源代码及注释 (8)2.4测试结果 (12)第3章程序设计总结 (13)参考文献 (14)第1章程序设计目的与要求1.1 程序设计目的《C#.Net程序设计》是计算机科学与技术专业的必修专业基础课程,其实践性、应用性很强。
实践教学环节是必不可少的一个重要环节。
本课程的程序设计专题实际是软件技术专业学生学习完《C#.Net程序设计》课程后,进行的一次全面的综合训练,C#.Net 程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
1.2 程序设计的实验环境硬件要求能运行Windows xp操作系统的微机系统。
C#.Net程序设计语言及相应的集成开发环境visual 。
1.3 程序设计的预备知识熟悉c#语言及visual 集成开发环境。
1.4 程序设计要求按程序设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。
要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握c#.net2003的基本技能和面向对象的概念和方法;了解windows编程。
同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
第2章程序设计内容2.1程序设计题目打砖块游戏:作为我们一款熟知的游戏我想大家都不陌生吧,就是通过挡板把小球挡回,不让小球落地,直到打光所有砖块为止,游戏过关进入更难得模式小球速度更快,砖块组成的图案发生改变,是一个很有趣味的小游戏。
课程设计报告课程名称:面向对象程序设计C++设计题目:俄罗斯方块游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹2015 年 12 月 25 日目录一、需求分析 (3)1.1系统概述 (3)1.2游戏特色 (3)1.3功能需求 (3)二、总体设计 (4)2.1系统模块 (4)2.2系统业务处理流程 (5)三、详细设计 (5)3.1砖块预显示 (5)3.2分数统计 (6)3.3砖块移动和游戏暂停的实现 (7)3.4播放背景音乐 (8)3.5游戏设置与帮助 (8)3.6背景位图的插入 (9)3.7砖块三维化 (9)3.8俄罗斯方块双人版的实现 (10)四、测试与结果 (11)4.1整个游戏运行界面图 (11)4.2游戏设置与帮助页面图 (11)五、总结 (12)一、需求分析1.1系统概述《俄罗斯方块》玩家通过键盘控制方块的形状样式和速度,组成相连的1行或1行以上方块会自动消除,方块消除到一定数量后会得到一定的分数,玩家可以升级,从而难度加大,也就是速度加快,玩家还可以通过消除一组方块,使得到的分数翻倍等到更多的分数,造成更强的分数效果。
游戏中玩家可以和其他玩家1V1对战。
1.2游戏特色《俄罗斯方块》是基于pc休闲平台上的单机对战休闲游戏,这就要求游戏本身不能过于庞大复杂,需要考虑到单机对战的灵活性和多变性。
在游戏中通过对方块速度的变,能够使玩家不仅仅通过自己消除方块来获胜,还可以等到更多的分数,因此获得胜利。
《俄罗斯方块》游戏在传统的俄罗斯方块当中加入了新鲜的游戏元素,例如可爱的方块的颜色,绚目的消除方块特效显示,在游戏本身的简单耐玩的基础上,大大丰富了游戏的观赏性和趣味性,令玩家有了完全的游戏体验,充分享受游戏带来的乐趣。
1.3功能需求(1)实现双人俄罗斯方块(2)隐藏菜单栏、工具栏、状态栏(3)实现难度可以选择(4)实现下一个砖块预测功能(5)实现总分统计功能,和每步消除所得分数显示(6)实现下、左、右、旋转、暂停功能(7)实现背景音乐播放功能(8)添加游戏帮助菜单(9)实现砖块三维化(10)实现双缓冲避免屏幕闪烁(11)设置窗口大小,禁用最大化按钮,禁止鼠标拖动改变窗口大小二、总体设计2.1系统模块图2-12.2系统业务处理流程图2-2三、详细设计3.1砖块预显示砖块预显示的原理就是在第一次生成砖块的时候,一次生成2个砖块。
#include<graphics.h>#include<stdio.h>#include<conio.h>#include<math.h>#include<time.h>//#include <string.h>//#include <afx.h>#define row 5#define colunm 20#define CMD_UP 1#define CMD_DOWN 2#define CMD_LEFT 4#define CMD_RIGHT 8int a[row][colunm]={0};int ballx,bally;//小球的坐标int boardx,boardy;//木板的坐标bool starting=false;//判断是否小球正在运动int addx=1;int addy=-1;//小球坐标加的量bool iscatch=false;//判断是否木板捕捉到小球void DispatchCommand(int _cmd){setfillcolor(BLACK);solidrectangle(boardx,boardy,boardx+60,boardy+10);if (_cmd & CMD_LEFT){if(iscatch){srand(time(NULL));addx=rand()%2+10;setfillcolor(BLACK);solidcircle(ballx,bally,10);ballx-=10;setfillcolor(LIGHTBLUE);//solidcircle(ballx,bally,10);printf("减\n");}boardx-=1;}if (_cmd & CMD_RIGHT){if(iscatch){srand(time(NULL));addx=rand()%2+10;setfillcolor(BLACK);solidcircle(ballx,bally,10);ballx+=10;setfillcolor(LIGHTBLUE);solidcircle(ballx,bally,10);printf("加\n");}boardx+=1;}if(boardx<=10)boardx=10;if(boardx>=380)boardx=380;setfillcolor(LIGHTMAGENTA);//LIGHTRED//CYAN solidrectangle(boardx,boardy,boardx+60,boardy+10); }//键盘控制int GetCommand(){int c = 0;if (GetAsyncKeyState('A') & 0x8000) c |= CMD_LEFT; if (GetAsyncKeyState('D') & 0x8000) c |= CMD_RIGHT; if (GetAsyncKeyState('W') & 0x8000) c |= CMD_UP;if (GetAsyncKeyState('S') & 0x8000) c |= CMD_DOWN; return c;}//画砖块void drawrectangle(){setfillcolor(LIGHTCYAN);//YELLOW//MAGENTAfor(int j=0;j<row;j++){for(int i=0;i<colunm;i++){if(a[j][i]==0)solidrectangle(i*22,j*12,i*22+20,j*12+10);//左上右下}}}void init(){boardx=220-30;boardy=600-10;//小球中心坐标ballx=220;bally=580;drawrectangle();setfillcolor(LIGHTMAGENTA);//LIGHTRED//CYANsolidrectangle(boardx,boardy,boardx+60,boardy+10);//初始化木板setfillcolor(LIGHTBLUE);solidcircle(ballx,bally,10);//初始化小球}void drawball(){iscatch=false;setfillcolor(BLACK);//用于擦出上一次的小球solidcircle(ballx,bally,10);BeginBatchDraw();if(ballx>=430){addx=-1;}if(ballx<=0){addx=1;}if(bally<=10)addy=-1*addy;for(int i=0;i<5;i++){int flag0=0;for(int j=0;j<20;j++){//砖块坐标(宽高)int currentx=j*22;//左int currenty=i*12;//上if(a[i][j]==0 && ballx<=currentx+30 && ballx>=currentx-10 && bally-currenty<=20 &&bally>=currenty)//判断小球碰到哪个砖块{printf("a\n");addy=-1*addy;addx=-1*addx;a[i][j]=1;flag0=1;//消除原来的砖块setfillcolor(BLACK);solidrectangle(currentx,currenty,currentx+20,currenty+10);break;}}if(flag0)break;}if(starting && ballx<=boardx+70 && ballx>=boardx-10 && boardy-bally<=10 &&boardy-bally>=5)//判断木板是否接到小球{printf("接住");iscatch=true;addy=-1*addy;}starting=true;ballx+=addx;//更新小球坐标bally+=addy;setfillcolor(LIGHTBLUE);solidcircle(ballx,bally,10);FlushBatchDraw();Sleep(5);}void play(){char c;while(1){drawrectangle(); //画砖块//if(kbhit())//{c=GetCommand();//键盘控制DispatchCommand(c);//移动控制//}drawball();//画球if(bally>590){//setcolor(RED);//outtextxy(200,300,LPCTSTR("GAME OVER"));//NULLMessageBox(GetHWnd(),TEXT(" GAME OVER "),TEXT("提示"),MB_OK);break;}/*cleardevice();Sleep(5000);*/}}void main(){initgraph(440,600,0);//SHOWCONSOLE不显示控制台init();setcolor(WHITE);const char* sh="请按空格键开始游戏";//LPCTSTR *p = (LPCTSTR *)sh;outtextxy(140,300,LPCTSTR(sh));getch();if (GetAsyncKeyState(VK_SPACE)){cleardevice();play();//Sleep(5000);}//Sleep(5000);//cleardevice();//Sleep(5000);//setcolor(RED);//outtextxy(200,300,LPCTSTR(""));//MessageBox(NULL,TEXT(" GAME OVER "),TEXT("提示"),MB_OK);//setcolor(RED);//const char* ch="GAME OVER";//outtextxy(180,300,LPCTSTR(ch)); //Sleep(3000);//Sleep(5000);getch();}。
#include<graphics.h>#include<conio.h>#include<windows.h>#include<stdlib.h>#include<stdio.h>void draw(int x1){int m=0,n=0,x=40,y=20;int t=0,i,j,k=1;int a=0,b=127,c=88;for(i=0;i<8;i++){n=i*20;y=n+20;for(j=0;j<16-t;j++){m=(j+i)*40;x=m+40;POINT points[]={{m,n}, {x,n}, {x,y}, {m,y}}; setfillcolor(RGB(a,b,c));fillpolygon(points, 4);a=8*k+8;b=j*3+k+200;c=20*k;k=k+8;}t=t+2;k=1;}m=300;n=160;x=340;y=180;POINT points[]={{m,n}, {x,n}, {x,y}, {m,y}}; setfillcolor(RGB(a,b,c));fillpolygon(points, 4);}void end(){settextstyle(50, 0, "宋体", 0, 0, FW_BOLD, false, false, false);settextcolor(RED);outtextxy(200,200,"游戏结束!");getch();closegraph();}void start(){int n=0;loadimage(NULL,"IMSGE","background"); while(1){setbkmode(TRANSPARENT);settextstyle(50, 0, "楷体", 0, 0, FW_BOLD, false, false, false);if(n%2==0)settextcolor(GREEN);elsesettextcolor(RED);outtextxy(80,100,"请按空格键开始游戏"); Sleep(250);if(_kbhit())break;n++;}}void main(){int x=320,y=430,m=270,n=370; int a,b,c,e=0,f=0,g=0,k[3];int i,j;char d;initgraph(640,480);start();setbkcolor(WHITE); cleardevice();setlinecolor(WHITE);draw(1);while(1){setlinecolor(LIGHTBLUE); setlinestyle(PS_SOLID, 10); line(m,445,n,445); setlinestyle(PS_SOLID, 0); setlinecolor(WHITE); setfillcolor(BROWN); fillcircle(x,y,10);Sleep(60);setfillcolor(WHITE); fillcircle(x,y,10);if(_kbhit()){d=getch();setlinecolor(WHITE); setlinestyle(PS_SOLID, 10); line(m,445,n,445);if(n<640&&d=='d'){m=m+27;n=n+27;}else if(m>0&&d=='a'){m=m-27;n=n-27;}}//确定x,y的值// if(y>=435)end();if(y==430&&x>=m-5&&x<=n+5) {if(x>m&&x<=m+25){a=0;b=2;c=2;if(10/(x-m)==0)k[0]=2;else if(10/(x-m)>3)k[0]=3;elsek[0]=10/(x-m);}else if(x>m+25&&x<=m+55) {a=2;b=0;c=2;if(15/(x-m-25)==0)k[1]=2;else if(15/(x-m-25)>3)k[1]=3;elsek[1]=10/(x-m-25);}else if(x>m+55&&x<=n) {a=2;b=2;c=0;if(10/(x-m-55)==0)k[2]=2;else if(10/(x-m-55)>3)k[2]=3;elsek[2]=10/(x-m-55);}}if(1){if(e==0){y=y-10;if(y<=10){g=1-g;e=1;}if(getpixel(x-1,y-10)!=WHITE||getpixel(x-1,y+10)! =WHITE||getpixel(x+1,y-10)!=WHITE||getpixel(x +1,y+10)!=WHITE){e=1;setfillcolor(WHITE);for(i=8;i<=18;i++){for(j=8;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}}else if(e==1){y=y+10;if(getpixel(x-1,y-14)!=WHITE||getpixel(x-1,y+14)! =WHITE||getpixel(x+1,y-14)!=WHITE||getpixel(x +1,y+14)!=WHITE){e=0;setfillcolor(WHITE);for(i=8;i<=18;i++){for(j=8;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}else if(y==430&&x>=m-5&&x<=n+5)e=0;}if(g==0&&a==0){x=x-k[0]*5;if(y<=10)g=1-g;else if(x<=10||x>=630)g=1;if(getpixel(x-1,y-10)!=WHITE||getpixel(x-1,y+10)! =WHITE||getpixel(x+1,y-10)!=WHITE||getpixel(x +1,y+10)!=WHITE){g=1;setfillcolor(WHITE);for(i=8;i<=18;i++){for(j=8;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}}}else if(g==1&&a==0){x=x+k[0]*5;if(y<=10)g=1-g;else if(x<=10||x>=630)g=0;elseif(getpixel(x-1,y-10)!=WHITE||getpixel(x-1,y+10)! =WHITE||getpixel(x+1,y-10)!=WHITE||getpixel(x +1,y+10)!=WHITE){g=0;setfillcolor(WHITE);for(i=10;i<=18;i++){for(j=10;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}}}if(g==0&&b==0){x=x-k[1]*2;if(y<=10)g=1-g;else if(x<=10||x>=630)g=1;elseif(getpixel(x-1,y-10)!=WHITE||getpixel(x-1,y+10)! =WHITE||getpixel(x+1,y-10)!=WHITE||getpixel(x +1,y+10)!=WHITE){g=1;setfillcolor(WHITE);for(i=8;i<=18;i++){for(j=8;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}}}else if(g==1&&b==0){x=x+k[1]*2;if(y<=10)g=1-g;else if(x<=10||x>=630)g=0;elseif(getpixel(x-1,y-10)!=WHITE||getpixel(x-1,y+10)!=WHITE||getpixel(x+1,y-10)!=WHITE||getpixel(x +1,y+10)!=WHITE){g=0;setfillcolor(WHITE);for(i=8;i<=18;i++){for(j=8;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}}}if(g==0&&c==0){x=x-k[2]*5;if(y<=10)g=1-g;else if(x<=10||x>=630)g=1;elseif(getpixel(x-1,y-10)!=WHITE||getpixel(x-1,y+10)! =WHITE||getpixel(x+1,y-10)!=WHITE||getpixel(x +1,y+10)!=WHITE){g=1;setfillcolor(WHITE);for(i=8;i<=18;i++){for(j=8;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}}}else if(g==1&&c==0)x=x+k[2]*5;if(x<=10||x>=630)g=0;else if(y<=10)g=1-g;elseif(getpixel(x-1,y-10)!=WHITE||getpixel(x-1,y+10)! =WHITE||getpixel(x+1,y-10)!=WHITE||getpixel(x +1,y+10)!=WHITE){g=0;setfillcolor(WHITE);for(i=8;i<=18;i++){for(j=8;j<=18;j++){floodfill(x-i,y-j,WHITE);floodfill(x+i,y-j,WHITE);floodfill(x-i,y+j,WHITE);floodfill(x+i,y+j,WHITE);}}}}} end(); }。
c 课程设计打砖块一、教学目标本课程的教学目标是使学生掌握C语言的基本语法和编程技巧,学会使用C语言进行程序设计,培养学生的逻辑思维能力和创新能力。
具体分解为以下三个方面的目标:1.知识目标:使学生了解C语言的基本概念、语法规则和编程方法,掌握常用的数据类型、运算符、控制结构、函数等编程基础,理解面向对象编程的基本思想。
2.技能目标:培养学生使用C语言进行程序设计的能力,学会调试和优化程序,能够独立完成中等难度的编程任务。
3.情感态度价值观目标:培养学生对计算机科学的兴趣和热情,增强学生的自信心和自主学习能力,培养学生在面对困难时勇于挑战、积极解决问题的精神。
二、教学内容根据教学目标,本课程的教学内容主要包括以下几个部分:1.C语言的基本概念:变量、数据类型、运算符、表达式等。
2.控制结构:顺序结构、选择结构、循环结构等。
3.函数:函数的定义、声明、调用、返回值等。
4.数组和字符串:一维数组、多维数组、字符串的基本操作等。
5.指针:指针的基本概念、指针与数组、指针与函数等。
6.面向对象编程:类和对象、构造函数、析构函数、继承和多态等。
7.编程实践:使用C语言编写简单的程序,学会调试和优化程序。
三、教学方法为了实现教学目标,本课程将采用以下几种教学方法:1.讲授法:教师讲解C语言的基本概念、语法规则和编程方法,引导学生掌握编程基础。
2.案例分析法:通过分析典型的编程案例,使学生理解编程思想,培养学生的实际编程能力。
3.实验法:安排上机实验,让学生亲自动手编写程序,巩固所学知识,提高编程技巧。
4.讨论法:学生进行小组讨论,分享学习心得和经验,互相促进,共同提高。
四、教学资源为了支持教学内容和教学方法的实施,本课程将采用以下教学资源:1.教材:《C程序设计语言》(K&R著)或《C Primer Plus》(Stephen Prata著)。
2.参考书:《C语言程序设计教程》(谭浩强著)、《C++ Primer》(Stanley B. Lippman著)。
俄罗斯方块c语言的原理
俄罗斯方块是一款经典的电子游戏,其开发语言包括C语言。
C 语言是一种通用的、高效的编程语言,可以被应用到多种不同的领域中,包括游戏开发。
在C语言中,俄罗斯方块的实现原理包含了以下几个步骤:
1. 初始化游戏界面。
这个过程包含了屏幕初始化、游戏元素初始化等等。
2. 确定方块的位置和形状。
游戏通过随机生成方块来增加游戏的难度和趣味性。
3. 对方块进行移动。
用户通过键盘输入来控制方块的位置改变,从而使其移动到所需的位置。
4. 碰撞检测。
游戏需要检测方块是否与其他游戏元素相碰,包括墙壁、已经下落的方块等等,从而判断该方块是否能够继续移动,或者需要停止移动。
5. 方块下落。
一旦该方块不能继续移动,则需要开始下落,并且生成新的方块,重复上述的步骤。
6. 计分。
当一行方块被填满时,游戏需要将其消除,并且增加用户的分数。
除此之外,俄罗斯方块中还需要应用到一些基本的编程概念,比如数据结构、条件语句、循环语句、函数调用等等。
通过这些编程概念的组合,C语言程序员可以实现一个完整的俄罗斯方块游戏,并且使其在计算机上运行。
10.5 综合实验:打砖块游戏本节主要应用Rigidbody以及AddForce等方法来实现“打砖块”的经典案例,包括场景构建、对象实例化、球体发射等内容。
步骤1:新建3D Porject,并应用Skybox等资源,保存场景文件。
步骤2:在Project区域的Assest文件夹中新建Material、Prefabs、Scripts文件夹分别放材质、预制件和脚本文件。
步骤3:在新的场景中创建一个Plane,并应用其设置的材质,同时在X和Z轴上放大两倍,设置y=-0.5。
步骤4:用代码生成墙体。
就是一个循环过程,不断实例化Cube对象并重置位置信息。
在Script中新建一个C#脚本,并命名为Will。
代码如下:1 using System.Collections;2 using System.Collections.Generic;3 using UnityEngine;45 public class Will : MonoBehaviour6 {7 public GameObject will; //砖块对象8 private int columnNum =8; //列数9 private int rowNum=6; //行数10 // Start is called before the first frame update11 void Start()12 {13 for (int i=0;i<rowNum;i++)14 {15 for (int j=0;j<columnNum;j++)16 {17 //实例化每一个砖块,注意相对位置,每个砖块是1×1见方的。
18 Instantiate(will,new Vector3(j-3,i,0),Quaternion.identity);19}20}21 }2223 // Update is called once per frame24 void Update()25 {2627 }28 }步骤5:在Hierarchy中添加一个空对象,命名为Wall,绑定脚本Will.cs,以实现脚本功能。
打砖块在HTML开发环境下使用CSS和JavaScript开发的打砖块小游戏打砖块小游戏的HTML开发实现在HTML的开发环境下,我们可以利用CSS和JavaScript来开发一个简单的打砖块小游戏。
通过CSS来设置游戏的样式和布局,通过JavaScript来处理游戏的逻辑。
本文将介绍如何实现这样一个基于HTML的打砖块小游戏。
一、准备开发环境要开始开发一个打砖块小游戏,首先我们需要一个开发环境。
你可以选择任何一个文本编辑器,比如Sublime Text、Visual Studio Code等,来编写HTML、CSS和JavaScript代码。
此外,你还需要一个现代的Web浏览器,如Chrome或Firefox,用于运行和测试游戏。
二、创建HTML文件首先,我们需要创建一个新的HTML文件,命名为index.html。
打开这个文件,并输入以下基本的HTML结构:```html<!DOCTYPE html><html><head><title>打砖块小游戏</title><link rel="stylesheet" type="text/css" href="style.css"></head><body><canvas id="gameCanvas" width="480" height="320"></canvas><script src="script.js"></script></body></html>```在这段代码中,我们引入了一个style.css文件和一个script.js文件。
Imports System.Drawing.Drawing2DPublic Class Form1Public shuiping As Integer = 1Public chuizhi As Integer = 1Public WithEvents board As New ButtonPublic buttonList1 As New ArrayList()Public ball As New LabelPublic num As IntegerPublic canDrag As Boolean = FalseDim x As IntegerDim i As Integer = 0'界面布置Public Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Text = "张少霞制作2010242499"'一些控制按钮Button1.Left = 650Button1.Top = 590Button1.Text = "开始游戏"Button2.Left = 750Button2.Top = 590Button2.Text = "暂停游戏"Button3.Left = 650Button3.Top = 625Button3.Text = "分数"Button4.Left = 750Button4.Top = 625Button4.Text = ""GroupBox1.Left = 330GroupBox1.Top = 590'添加小球ball.BackColor = System.Drawing.Color.Transparentball.ForeColor = System.Drawing.Color.Redball.Text = "●"ball.TextAlign = System.Drawing.ContentAlignment.MiddleCenterball.Width = 14ball.Height = 14ball.Left = 645ball.Top = 539Me.Controls.Add(ball)'添加挡板board.Width = 100board.Height = 7board.Left = 600 '330board.Top = 553board.BackColor = Color.GrayMe.Controls.Add(board)Button4.Text = 0End SubPrivate Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick '小球的初始状态ball.Left = ball.Left + shuiping * 7ball.Top = ball.Top + chuizhi * 7Dim a As Integera = ball.Left + 7Dim b As Integerb = ball.Top + 7Button4.Text = 66 - num'判断小球是否和砖块碰撞For Each ctl In buttonList1If ((a - 7 >= ctl.Left And a - 7 <= ctl.Right) Or (a + 7 >= ctl.Left And a + 7 <= ctl.Right)) And (b >= ctl.Top And b <= ctl.Bottom) Thenshuiping = -shuipingMe.Controls.Remove(ctl)num = num - 1Exit ForElseIf ((b - 7 >= ctl.Top And b - 7 <= ctl.Bottom) Or (b + 7 >= ctl.Top And b + 7 <= ctl.Bottom)) And (a >= ctl.Left And a <= ctl.Right) Thenchuizhi = -chuizhiMe.Controls.Remove(ctl)num = num - 1Exit ForEnd IfNext'判断小球是否和边界碰撞If (a - 7 <= Me.Left And a + 7 >= Me.Left) Or (a + 7 >= Me.ClientSize.Width And a - 7 <= Me.ClientSize.Width) Thenshuiping = -shuipingEnd If'判断小球是否和挡板碰撞If ((b + 7 >= board.Top And b + 7 <= board.Bottom) And (a >= board.Left And a <= board.Right)) Or (b - 7 <= 0 And b + 7 >= 0) Thenchuizhi = -chuizhiEnd If'当挡板没有借住小球时予以提示(三次机会)If ((board.Top <= b + 7 And b + 7 <= board.Top + board.Height) And (a + 7 <= board.Left Or a - 7 >= board.Right)) ThenIf i < 3 Thenball.Left = 645ball.Top = 538board.Left = 600board.Top = 553Timer1.Enabled = FalseMessageBox.Show("亲,还有" & (3 - i) & "次机会!")Button1.Enabled = TrueEnd IfIf i = 3 ThenMessageBox.Show("Game over!")Button1.Enabled = FalseEnd IfEnd If'砖块全部打完时予以提示If (num = 0) ThenMessageBox.Show("胜利!")Button1.Enabled = FalseEnd IfEnd Sub'控制开始和播放以音乐按钮Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Timer1.Enabled = TrueIf Timer1.Enabled = True Thenputer.Audio.Play("Dreamtale-The Dawn - 铃声.wav", AudioPlayMode.Background)End IfEnd Sub'暂停游戏和音乐按钮Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Timer1.Enabled = Not Timer1.EnabledIf (Timer1.Enabled = False) ThenButton2.Text = "继续游戏"puter.Audio.Stop()ElseButton2.Text = "暂停游戏"puter.Audio.Play("Dreamtale-The Dawn - 铃声.wav", AudioPlayMode.Background)End IfEnd Sub'游戏者选择砖块的排列模式Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton1.CheckedChangedFor Each ctl In buttonList1Me.Controls.Remove(ctl)num = 0NextIf Timer1.Enabled = True Thenputer.Audio.Play("Dreamtale-The Dawn - 铃声.wav", AudioPlayMode.Background)End IfButton4.Text = 0ball.Left = 645ball.Top = 538board.Left = 600board.Top = 553Button1.Enabled = TrueTimer1.Enabled = False'添加砖块Dim i As IntegerDim j As IntegerFor i = 0 To 5For j = 0 To 10Dim button As New Buttonbutton.Height = 25If j Mod 2 = 0 And i Mod 2 = 0 Thenbutton.Width = 100button.BackColor = Color.CadetBlueElseIf j Mod 2 = 0 And i Mod 2.0 = 1 Thenbutton.Width = 80button.BackColor = Color.CornsilkElseIf j Mod 2.0 = 1 And i Mod 2.0 = 1 Thenbutton.Width = 60button.BackColor = Color.PinkElsebutton.Width = 40button.BackColor = Color.CadetBlueEnd Ifbutton.Top = (i + 1) * 40button.Left = (j + 1) * 110Me.Controls.Add(button)buttonList1.Add(button)num = num + 1NextEnd Sub'模式二Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton2.CheckedChangedFor Each ctl In buttonList1Me.Controls.Remove(ctl)num = 0NextIf Timer1.Enabled = True Thenputer.Audio.Play("Dreamtale-The Dawn - 铃声.wav", AudioPlayMode.Background)End IfButton4.Text = 0ball.Left = 645ball.Top = 538board.Left = 600board.Top = 553Button1.Enabled = TrueTimer1.Enabled = False'添加砖块Dim i As IntegerDim j As IntegerFor i = 0 To 10For j = 0 To iDim button As New Buttonnum = num + 1button.Width = 50button.Height = 30button.Left = 600 - i * 35 + j * 70button.Top = i * 30 + 20button.BackColor = Color.FromArgb(Color.Pink.ToArgb + j * 200) 'Button1.BackColor.ToArgb + i * 200 ' Color.CadetBlue + j * 100Me.Controls.Add(button)buttonList1.Add(button)NextNextEnd Sub'模式三Private Sub RadioButton3_CheckedChanged(sender As Object, e As EventArgs) Handles RadioButton3.CheckedChangedFor Each ctl In buttonList1Me.Controls.Remove(ctl)num = 0If Timer1.Enabled = True Thenputer.Audio.Play("Dreamtale-The Dawn - 铃声.wav", AudioPlayMode.Background)End IfButton4.Text = 0ball.Left = 645ball.Top = 538board.Left = 600board.Top = 553Button1.Enabled = TrueTimer1.Enabled = False'添加砖块Dim i As IntegerDim j As IntegerFor i = 0 To 5For j = 0 To 10Dim button As New Button()num = num + 1button.Width = 50button.Height = 30button.Left = 380 - i * 25 + j * 70button.Top = 80 + i * 30 + 20Dim k As Integerk = Int(21 * Rnd()) - 10button.BackColor = Color.FromArgb(Color.CadetBlue.ToArgb + k * 100) 'Button1.BackColor.ToArgb + i * 200 ' Color.CadetBlue + j * 100Me.Controls.Add(button)buttonList1.Add(button)NextNextEnd SubPrivate Sub board_MouseDown(sender As Object, e As MouseEventArgs) Handles board.MouseDowncanDrag = TrueDim p As New Point()p = Me.PointToClient(MousePosition)x = p.X - board.LeftEnd SubPrivate Sub board_MouseMove(sender As Object, e As MouseEventArgs) Handles board.MouseMoveIf canDrag = True And Timer1.Enabled = True ThenDim p As New Point()p = Me.PointToClient(MousePosition)board.Left = p.X - xEnd IfEnd SubPrivate Sub board_MouseUp(sender As Object, e As MouseEventArgs) canDrag = FalseEnd SubEnd Class。
打砖块【实验名称】打砖块小游戏【实验目的】利用Microsoft Visual Studio 2008 开发工具来开发打砖块这个小游戏,加强了对中的基本语法方面的知识、窗体的布局、常用控件的添加、动态生成砖块的方法及碰撞的检验条件的理解。
掌握的基本应用。
【掌握内容】通过这个实验,进一步掌握了中的基本语法、控件的添加与应运、动态生成的方法、窗体的布局、碰撞的检验及一些简单语句的应用,了解了一些编程方面的语法知识及技巧,进一步巩固了对知识的理解和应用。
【问题描述及基本要求】打砖块小游戏基本上满足了用户的需求,用户可以通过“开始”、“暂停”按钮来控制游戏的进行与停止,并且用户可以通过“向左”、“向右”按钮来控制挡板的移动。
【算法描述】形式化语言描述。
(1)本程序中设置了AddX、AddY、DirectX、DirectY 四个变量来控制小球的运动轨迹,程序代码如下所示:If (ball.Left <= 0 Or ball.Left + ball.Width >= Me.ClientSize.Width) ThenDirectX *= -1End IfIf (ball.Top <= 0 Or ball.Top + ball.Height >= L.Top) ThenDirectY *= -1End Ifball.Left += DirectX * AddXball.Top += DirectY * AddY当小球碰到窗体的左侧(ball.Left <= 0)或窗体的右侧时(ball.Left + ball.Width),或当小球碰到窗体的顶部(ball.Top <= 0)或小球的底部碰到挡板的顶部时(ball.Top + ball.Height >= L.Top),通过改变ball.Left 和ball.Top的值来控制小球的运动路径。
(2)程序中添加的8行8列的砖块是动态生成的,并且为砖块设置了不同的颜色,代码实现部分如下:Dim btn As Button '生成砖块Dim m As Integer = 0Dim n As Integer = 0For m = 0 To Me.ClientSize.Width / 50For n = 0 To 1btn = New Buttonbtn.Text = ""btn.Size = New Size(50, 20)btn.BackColor = Color.PeachPuffbtn.Left = m * btn.Widthbtn.Top = n * btn.HeightMe.Controls.Add(btn)NextNext设定每个砖块的宽为50,高为20,通过循环控制在窗体上添加了八行八列的砖块,并设置了不同的颜色。
C语言打砖块游戏 一、游戏截图
二、游戏源码 #include #include #include #include
/* DEFINES ********************************************************************************/ // defines for windows #define WINDOW_CLASS_NAME TEXT("WIN32CLASS") #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480
// states for game loop #define GAME_STATE_INIT 0 #define GAME_STATE_START_LEVEL 1 #define GAME_STATE_RUN 2 #define GAME_STATE_SHUTDOWN 3 #define GAME_STATE_EXIT 4 // block defines #define NUM_BLOCK_ROWS 6 #define NUM_BLOCK_COLUMNS 8
#define BLOCK_WIDTH 64 #define BLOCK_HEIGHT 16 #define BLOCK_ORIGIN_X 8 #define BLOCK_ORIGIN_Y 8 #define BLOCK_X_GAP 80 #define BLOCK_Y_GAP 32
// paddle defines #define PADDLE_START_X (WINDOW_WIDTH/2 - 16) #define PADDLE_START_Y (WINDOW_HEIGHT - 32); #define PADDLE_WIDTH 32 #define PADDLE_HEIGHT 8 #define PADDLE_COLOR RGB(0, 0, 255)
// ball defines #define BALL_START_Y (WINDOW_HEIGHT/2) #define BALL_SIZE 4
// color defines #define BACKGROUND_COLOR RGB(0, 0, 0) #define BLOCK_COLOR RGB(125, 0, 0) #define BALL_COLOR RGB(222, 0, 222)
// these read the keyboard asynchronously #define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) #define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
/* basic unsigned types *******************************************************************/ typedef unsigned short USHORT; typedef unsigned short WORD; typedef unsigned char UCHAR; typedef unsigned char BYTE;
/* FUNCTION DECLARATION *******************************************************************/ int Game_Init(void *parms = NULL); int Game_Shutdown(void *parms = NULL); int Game_Main(void *parms = NULL);
DWORD Start_Clock(void); DWORD Wait_Clock(DWORD count);
/* GLOBALS *********************************************************************************/ HWND main_window_handle = NULL; // save the window handle HINSTANCE main_instance = NULL; // save the instance int game_state = GAME_STATE_INIT; // starting state
int paddle_x = 0, paddle_y = 0; // tracks position of paddle int ball_x = 0, ball_y = 0; // tracks position of ball int ball_dx = 0, ball_dy = 0; // velocity of ball int score = 0; // the score int level = 1; // the current level int blocks_hit = 0; // tracks number of blocks hit
DWORD start_clock_count = 0; // used for timing // this contains the game grid data UCHAR blocks[NUM_BLOCK_ROWS][NUM_BLOCK_COLUMNS];
/* WINDPROC ********************************************************************************/ LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // this is the main message handler of the system PAINTSTRUCT ps; HDC hdc;
switch (msg) { case WM_CREATE: return 0;
case WM_PAINT: hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); return 0;
case WM_DESTROY: PostQuitMessage(0); return 0;
default: break; }
return DefWindowProc(hwnd, msg, wparam, lparam); }
/* WINMAIN ********************************************************************************/ int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASS winclass; HWND hwnd; MSG msg; HDC hdc; PAINTSTRUCT ps;
/* CS_DBLCLKS Specifies that the window should be notified of double clicks with * WM_xBUTTONDBLCLK messages * CS_OWNDC标志,属于此窗口类的窗口实例都有自己的DC(称为私有DC),私有DC仅属于该窗口实例, * 所以程序只需要调用一次GetDC或BeginPaint获取DC,系统就为窗口初始化一个DC,并且保存程序 * 对其进行的改变。ReleaseDC和EndPaint函数不再需要了,因为其他程序无法访问和改变私有DC。 */ winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME;
// register the window class if (!RegisterClass(&winclass)) return 0;
// Create the window, note the use of WS_POPUP hwnd = CreateWindow( WINDOW_CLASS_NAME, // class TEXT("WIN32 Game Console"), // title WS_POPUP, // style 200, // initial x 100, // initial y WINDOW_WIDTH, // initial width WINDOW_HEIGHT, // initial height NULL, // handle to parent NULL, // handle to menu hinstance, // instance NULL); // creation parms
if (! hwnd) return 0;
ShowWindow(hwnd, ncmdshow); UpdateWindow(hwnd);
// hide mouse //ShowCursor(FALSE);
// save the window handle and instance in a global main_window_handle = hwnd; main_instance = hinstance;