C语言 俄罗斯方块游戏
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
概述
俄罗斯方块是一个经典而又有趣的游戏,可以很好的培养玩家的反应能力和瞬间决策能力,随着 方块的不断下降,玩家要变换方块的形状以适合自己要放的位置的形状。而且玩家还要根据下一个方 块的形状来安排当前方块的位置。这些都可以很好的培养玩家综合考虑和瞬间决策的能力。
玩家通过上下左右键来控制组合方块的形状和方向,如果玩家在确定了组合方块的形状和方向后, 玩家可以按下空格键,直接将组合方块下降到相应位置。玩家将积分积攒到三百分就提高一个游戏水 平。 俄罗斯方块游戏运行效果如图19.5所示。
nextnbs=random(8);/*下一个方块的方向*/ nextnbx=random(4);/*下一个方块的形状*/
sprintf(nm,"%d",num);/*游戏积分*/ texts(456,173,"Number:",1,15);/*texts输出提示信息*/ texts(456,193,nm,1,15); texts(456,243,"Next Box:",1,15);
技术要点
由于游戏中,要画出游戏的窗口和对画线的颜色进行设定,下面就对相应的函数进行介绍。 (1)line()函数 line()函数用于在屏幕画出线,函数原型如下:
void far line(int x0, int y0, int x1, int y1);
参数说明:x为窗口中的行,y为窗口的列 本函数没有返回值,只是在两个坐标之间画出线。 (2)setcolor()函数 setcolor()函数用于设置画线颜色,函数原型如下:
void far setcolor(int color);Leabharlann Baidu
参数说明:color是设置画线的颜色 本函数没有返回值,只是设定画线的颜色。
实现过程
(1)预处理模块的实现 为了使程序更好的运行,程序中需要引入一些库文件,对程序的一些基本函数进行支持,在引用文
件时需要使用#include命令,下面是本程序引用的一些外部文件和应用的代码,具体如下:
clscr(0,0,640,480,15); win(1,1,639,479,4,15);/*画窗体*/ win(LWINSCOL+MINBOXSIZE-2,LWINSROW+MINBOXSIZE-2, LWINSCOL+15*MINBOXSIZE+2,LWINSROW+21*MINBOXSIZE+2,BGCOLOR,0);
宏定义也是预处理命令的一种,以#define开头,提供了一种可以替换源代码中字符串的机制。本系 统中使用的都是带参数的宏定义。具体代码如下:
#ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif #define MINBOXSIZE 15 /* 单方块的大小 */ #define BGCOLOR 7/* 背景着色 */ #define GAMEX 200 #define GAMEY 10 #define LEVA 300 /* 每当玩家打到三百分等级加一级*/ /* 按键码*/ #define VK_LEFT 0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN 0x5000
#include <dos.h>/*系统接口函数库 */ #include <stdio.h>/*输入输出函数库*/ #include <conio.h>/*控制台输入输出函数库*/ #include <bios.h>/*BIOS函数库*/ #include <graphics.h>/*图形函数库*/
int errorcode; initgraph(&gdrive,&gmode,"G:\\TC\\BGI"); errorcode=graphresult();/*判断图形界面初始化是否成功*/ if(errorcode!=grOk) {
printf("error of: %s",grapherrormsg(errorcode)); exit(1); }
图19.5 俄罗斯方块游戏
设计思路
制作俄罗斯方块游戏的设计思路如下: (1)明确俄罗斯方块的游戏规则,如,方块在移动时,不能超出边界;方块与方块要罗列在一起; 当某行方块添满时,要去除该行,并使该行以上的行下移。 (2)计算各方块组的显示位置,如“L”、“T”、“田”等方块组。 (3)计算各方块组的变换样式。 (4)因为俄罗斯方块是用一个个方块组合而成的,所以,要根据背景的行数和列数定义多维数组, 主要根据方块的行数和列数记录其是否存在,以及当前方块的颜色。 (5)使用call_key()函数响应按键的操作。用switch判断按下的是什么键,如上键按下,则使方块 旋转90°,空格键按下,则使方块直接落下。 (6)通过timezd()函数实现方块的移动。如果检测到ESC按键按下,则推出游戏。 (7)当方块下移完成后,根据方块所在的最大行和最小行,判断其是否有添满的行,如果有,则去 除该行,并将该行以上的各行下移。 (8)在去除指定的行后,随机生成方块组的样式。
timezd(); KillTimer(); closegraph(); }
(3)游戏界面的实现 本模块主要实现对游戏背景和游戏窗口的显示,游戏中的组合方块只会在游戏窗口中运行。游戏开始后, 要初始化游戏的背景和游戏的运行窗口。具体实现代码如下: /*初始化图形模式*/ void init(int gdrive,int gmode) {
#define VK_UP 0x4800 #define VK_HOME 0x4700 #define VK_END 0x4f00 #define VK_SPACE 0x3920 #define VK_ESC 0x011b #define VK_ENTER 0x1c0d
/* 定义俄罗斯方块的方向*/ #define F_S 0 #define STARTCOL 20 /* 要出的下一个方块的纵坐标*/ #define STARTROW 12 /* 要出的下一个方块的横从标*/ #define WINSROW 14/* 游戏屏幕大小*/ #define WINSCOL 20 #define LWINSCOL 100 /*游戏屏幕大显示器上的相对位置*/ #define LWINSROW 60
(2)主函数的设计 程序运行起来,首先从main()函数开始,在main()主函数中,首先,对图形化界面进行初始化,
对屏幕坐标进行初始化。实现代码如下:void main(void)
{ int i,j; char *nm="00000"; init(VGA,VGAHI);/*初始化图形界面*/ cls();/*清屏*/
/*屏幕坐标初始化*/ for(i=0;i<=WINSCOL+1;i++) for(j=0;j<=WINSROW+1;j++) gwins[i][j]=0;
for(i=0;i<=WINSCOL+1;i++) { gwins[i][0]=1; gwins[i][15]=1; }
for(j=1;j<=WINSROW;j++) { gwins[0][j]=1; gwins[21][j]=1; }
} /*游戏窗口的绘制*/ void win(int a,int b,int c,int d,int bgcolor,int bordercolor) { clscr(a,b,c,d,bgcolor); setcolor(bordercolor); line(a,b,c,b); line(a,b,a,d); line(a,d,c,d); line(c,b,c,d); }
俄罗斯方块是一个经典而又有趣的游戏,可以很好的培养玩家的反应能力和瞬间决策能力,随着 方块的不断下降,玩家要变换方块的形状以适合自己要放的位置的形状。而且玩家还要根据下一个方 块的形状来安排当前方块的位置。这些都可以很好的培养玩家综合考虑和瞬间决策的能力。
玩家通过上下左右键来控制组合方块的形状和方向,如果玩家在确定了组合方块的形状和方向后, 玩家可以按下空格键,直接将组合方块下降到相应位置。玩家将积分积攒到三百分就提高一个游戏水 平。 俄罗斯方块游戏运行效果如图19.5所示。
nextnbs=random(8);/*下一个方块的方向*/ nextnbx=random(4);/*下一个方块的形状*/
sprintf(nm,"%d",num);/*游戏积分*/ texts(456,173,"Number:",1,15);/*texts输出提示信息*/ texts(456,193,nm,1,15); texts(456,243,"Next Box:",1,15);
技术要点
由于游戏中,要画出游戏的窗口和对画线的颜色进行设定,下面就对相应的函数进行介绍。 (1)line()函数 line()函数用于在屏幕画出线,函数原型如下:
void far line(int x0, int y0, int x1, int y1);
参数说明:x为窗口中的行,y为窗口的列 本函数没有返回值,只是在两个坐标之间画出线。 (2)setcolor()函数 setcolor()函数用于设置画线颜色,函数原型如下:
void far setcolor(int color);Leabharlann Baidu
参数说明:color是设置画线的颜色 本函数没有返回值,只是设定画线的颜色。
实现过程
(1)预处理模块的实现 为了使程序更好的运行,程序中需要引入一些库文件,对程序的一些基本函数进行支持,在引用文
件时需要使用#include命令,下面是本程序引用的一些外部文件和应用的代码,具体如下:
clscr(0,0,640,480,15); win(1,1,639,479,4,15);/*画窗体*/ win(LWINSCOL+MINBOXSIZE-2,LWINSROW+MINBOXSIZE-2, LWINSCOL+15*MINBOXSIZE+2,LWINSROW+21*MINBOXSIZE+2,BGCOLOR,0);
宏定义也是预处理命令的一种,以#define开头,提供了一种可以替换源代码中字符串的机制。本系 统中使用的都是带参数的宏定义。具体代码如下:
#ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif #define MINBOXSIZE 15 /* 单方块的大小 */ #define BGCOLOR 7/* 背景着色 */ #define GAMEX 200 #define GAMEY 10 #define LEVA 300 /* 每当玩家打到三百分等级加一级*/ /* 按键码*/ #define VK_LEFT 0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN 0x5000
#include <dos.h>/*系统接口函数库 */ #include <stdio.h>/*输入输出函数库*/ #include <conio.h>/*控制台输入输出函数库*/ #include <bios.h>/*BIOS函数库*/ #include <graphics.h>/*图形函数库*/
int errorcode; initgraph(&gdrive,&gmode,"G:\\TC\\BGI"); errorcode=graphresult();/*判断图形界面初始化是否成功*/ if(errorcode!=grOk) {
printf("error of: %s",grapherrormsg(errorcode)); exit(1); }
图19.5 俄罗斯方块游戏
设计思路
制作俄罗斯方块游戏的设计思路如下: (1)明确俄罗斯方块的游戏规则,如,方块在移动时,不能超出边界;方块与方块要罗列在一起; 当某行方块添满时,要去除该行,并使该行以上的行下移。 (2)计算各方块组的显示位置,如“L”、“T”、“田”等方块组。 (3)计算各方块组的变换样式。 (4)因为俄罗斯方块是用一个个方块组合而成的,所以,要根据背景的行数和列数定义多维数组, 主要根据方块的行数和列数记录其是否存在,以及当前方块的颜色。 (5)使用call_key()函数响应按键的操作。用switch判断按下的是什么键,如上键按下,则使方块 旋转90°,空格键按下,则使方块直接落下。 (6)通过timezd()函数实现方块的移动。如果检测到ESC按键按下,则推出游戏。 (7)当方块下移完成后,根据方块所在的最大行和最小行,判断其是否有添满的行,如果有,则去 除该行,并将该行以上的各行下移。 (8)在去除指定的行后,随机生成方块组的样式。
timezd(); KillTimer(); closegraph(); }
(3)游戏界面的实现 本模块主要实现对游戏背景和游戏窗口的显示,游戏中的组合方块只会在游戏窗口中运行。游戏开始后, 要初始化游戏的背景和游戏的运行窗口。具体实现代码如下: /*初始化图形模式*/ void init(int gdrive,int gmode) {
#define VK_UP 0x4800 #define VK_HOME 0x4700 #define VK_END 0x4f00 #define VK_SPACE 0x3920 #define VK_ESC 0x011b #define VK_ENTER 0x1c0d
/* 定义俄罗斯方块的方向*/ #define F_S 0 #define STARTCOL 20 /* 要出的下一个方块的纵坐标*/ #define STARTROW 12 /* 要出的下一个方块的横从标*/ #define WINSROW 14/* 游戏屏幕大小*/ #define WINSCOL 20 #define LWINSCOL 100 /*游戏屏幕大显示器上的相对位置*/ #define LWINSROW 60
(2)主函数的设计 程序运行起来,首先从main()函数开始,在main()主函数中,首先,对图形化界面进行初始化,
对屏幕坐标进行初始化。实现代码如下:void main(void)
{ int i,j; char *nm="00000"; init(VGA,VGAHI);/*初始化图形界面*/ cls();/*清屏*/
/*屏幕坐标初始化*/ for(i=0;i<=WINSCOL+1;i++) for(j=0;j<=WINSROW+1;j++) gwins[i][j]=0;
for(i=0;i<=WINSCOL+1;i++) { gwins[i][0]=1; gwins[i][15]=1; }
for(j=1;j<=WINSROW;j++) { gwins[0][j]=1; gwins[21][j]=1; }
} /*游戏窗口的绘制*/ void win(int a,int b,int c,int d,int bgcolor,int bordercolor) { clscr(a,b,c,d,bgcolor); setcolor(bordercolor); line(a,b,c,b); line(a,b,a,d); line(a,d,c,d); line(c,b,c,d); }