您的位置:首页 > 编程语言 > C语言/C++

俄罗斯方块游戏软件 : C语言初步应用感受

2016-05-25 20:42 351 查看
       C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。最近25年是使用最为广泛的编程语言。是使用最广泛的高级程序设计语言之一。在操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。C语言绘图能力强,具有可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。

       今天我通过学习C语言来了解俄罗斯方块这款游戏是如何进行编程并完成使用的。

       用C语言来编写俄罗斯方块这个游戏有较大优势C语言具有各种各样的数据类型并引入了指针概念使得程序效率更高C语言还包含很广泛的运算符另外C语言具有强大的图形功能支持多种显示器和驱动器而且,计算功能、逻辑判断能力也比较强大。

       

以下为它c语言功能的基本语句:

#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <time.h>

//游戏窗口

#define FrameX 4   //游戏窗口左上角的X轴坐标

#define FrameY 4   //游戏窗口左上角的Y轴坐标

#define Frame_height  20 //游戏窗口的高度

#define Frame_width   18 //游戏窗口的宽度

//定义全局变量

int i,j,temp,temp1,temp2;//temp,temp1,temp2用于记住和转换方块变量的值

int a[80][80]={0};   //标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案

int b[4];     //标记4个"口"方块:1表示有方块,0表示无方块

 

制作俄罗斯方块:

switch(tetris->flag)      //共6大类,19种类型

 {

 case 1:         //田字方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x+2][tetris->y-1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 2:         //直线方块:----

  { 

   a[tetris->x-2][tetris->y]=b[1];

   a[tetris->x+2][tetris->y]=b[2];

   a[tetris->x+4][tetris->y]=b[3];

   break;

   }

 case 3:         //直线方块: |

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x][tetris->y-2]=b[2];

   a[tetris->x][tetris->y+1]=b[3];

   break;

   }

 case 4:         //T字方块

  { 

   a[tetris->x-2][tetris->y]=b[1];

   a[tetris->x+2][tetris->y]=b[2];

   a[tetris->x][tetris->y+1]=b[3];

   break;

   }

 case 5:         //T字顺时针转90度方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x][tetris->y+1]=b[2];

   a[tetris->x-2][tetris->y]=b[3];

   break;

   }

 case 6:         //T字顺时针转180度方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x-2][tetris->y]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 7:         //T字顺时针转270度方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x][tetris->y+1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 8:         //Z字方块

  { 

   a[tetris->x][tetris->y+1]=b[1];

   a[tetris->x-2][tetris->y]=b[2];

   a[tetris->x+2][tetris->y+1]=b[3];

   break;

   }

 case 9:         //Z字顺时针转90度方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x-2][tetris->y]=b[2];

   a[tetris->x-2][tetris->y+1]=b[3];

   break;

   }

 case 10:        //Z字顺时针转180度方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x-2][tetris->y-1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 11:        //Z字顺时针转270度方块

  { 

   a[tetris->x][tetris->y+1]=b[1];

   a[tetris->x+2][tetris->y-1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 12:        //7字方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x][tetris->y+1]=b[2];

   a[tetris->x-2][tetris->y-1]=b[3];

   break;

   }

 case 13:        //7字顺时针转90度方块

  { 

   a[tetris->x-2][tetris->y]=b[1];

   a[tetris->x-2][tetris->y+1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 14:        //7字顺时针转180度方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x][tetris->y+1]=b[2];

   a[tetris->x+2][tetris->y+1]=b[3];

   break;

   }

 case 15:        //7字顺时针转270度方块

   {

   a[tetris->x-2][tetris->y]=b[1];

   a[tetris->x+2][tetris->y-1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 16:        //倒7字方块

   {

   a[tetris->x][tetris->y+1]=b[1];

   a[tetris->x][tetris->y-1]=b[2];

   a[tetris->x+2][tetris->y-1]=b[3];

   break;

   }

4000
 case 17:        //倒7字顺指针转90度方块

   {

   a[tetris->x-2][tetris->y]=b[1];

   a[tetris->x-2][tetris->y-1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 case 18:        //倒7字顺时针转180度方块

  { 

   a[tetris->x][tetris->y-1]=b[1];

   a[tetris->x][tetris->y+1]=b[2];

   a[tetris->x-2][tetris->y+1]=b[3];

   break;

   }

 case 19:        //倒7字顺时针转270度方块

  { 

   a[tetris->x-2][tetris->y]=b[1];

   a[tetris->x+2][tetris->y+1]=b[2];

   a[tetris->x+2][tetris->y]=b[3];

   break;

   }

 }

}

按键功能

按←键则向左动,中心横坐标减2

按→键则向右动,中心横坐标加2

按↑键则变体即当前方块顺时针转90度

 

函数调用语句

由函数名、实际参数加上分号“;”组成。

其一般形式为:函数名(实际参数表) ;

执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。

调用库函数,输出字符串。

例如:

printf(a,b,c); /*调用名为"printf"的函数*/

控制语句

控制语句用于控制程序的流程, 以实现程序的各种结构方式。

它们由特定的语句定义符组成。C语言有九种控制语句。可分成以下三类:

(1). 条件判断语句

if语句、switch语句;

(2) .循环执行语句

do while语句、while语句、for语句;

(3). 转向语句

 

#define LONG  12      /**** 定义游戏区的长和高*****/

#define HIGHT 21

#define KUAN  20      /**** 定义方块的宽 **********/

 

printf 显示

while 循环

if else 判断

switch...case 多条件判断

 

用C语言绘制图形界面:

EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。

 

包含库#include <graphics.h>

先初始化图形窗口

initgraph(WINDOW_WIDTH, WINDOW_HIGH);WINDOW_WIDTH为窗口的宽带,WINDOW_HIGH为窗口的高度。

清空绘图设备

cleardevice();

设置画笔颜色

setcolor(RED) ;

设置线条风格

setlinestyle(PS_SOLID, NULL, 0);

画矩形

rectangle

还有画线、显示文字等函数

判断方块什么时候停止什么时候满行得分

方块一直下落,最终是要停下来的,我们要设置一个边界来约束方块的移动范围。我们把当前游戏界面划分成以俄罗斯方块中的小方格为单位的格子,用一个二维数组g_gameBoard来表示这些小方格的状态,1表示此位置有方块,0表示此位置为空。

我们按照界面的大小和方格的大小来计算此二维数组时,再多设置一圈“围墙”,即多加两行两列,并把它们的值初始化为1。

当方块准备下落或是左右移动的时候,前提前检查其即将落下的位置是否为空,若不为空,则停止下落,并把当前俄罗斯方块占用的方格都设置为1。

详情见play.cpp中的moveAbled函数。

判断满行:

从最后一行开始往上检查g_gameBoard,若有一行全为1,则说明此行满行,将此行擦出,把此行上面的所有行向下移动一个单位。

详情见play.cpp中的ProcessFullRow函数

数据结构:

    游戏主要使用了数组这个数据结构。不过与以往的程序不同,这个游戏有一个大数组包含很多个小数组,大数组不断的吸收小数组内的元素,达到条件得分。

    通过这节课,我感受到了c语言的广泛应用,并了解到每一种类型都有自己独特的编程格式,其实只要学会了解它的目的就能通过C语言表达出来,并在C-Free上进行演示。在网上查询我能了解到每一步的C语言及其他的意义。我们也可以通过改编一下编程代码,自己进行c语言在俄罗斯方块中的真正应用。

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: