C语言课设--俄罗斯方块(上)

本文档展示了如何使用C语言编程实现经典游戏俄罗斯方块,包括隐藏光标、光标跳转、初始化界面、方块信息初始化、颜色设置、方块绘制、空格覆盖、合法性判断以及得分与游戏结束的判断等功能。代码详细解释了每个函数的作用,是学习C语言游戏编程的一个实例。

俄罗斯方块相信大家一定都不陌生,接下来我们就用C语言来复刻一下:

用到以下的头函数:

#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

首先我们先定义一些全局变量和结构体:


#define ROW 29 //游戏区行数
#define COL 20 //游戏区列数

#define DOWN 80 //方向键:下
#define LEFT 75 //方向键:左
#define RIGHT 77 //方向键:右

#define SPACE 32 //空格键
#define ESC 27 //Esc键

struct Face
{
	int data[ROW][COL + 10]; //用于标记指定位置是否有方块(1为有,0为无)
	int color[ROW][COL + 10]; //用于记录指定位置的方块颜色编码
}face;

struct Block
{
	int space[4][4];
}block[7][4]; //用于存储7种基本形状方块的各自的4种形态的信息,共28种
int max, grade; //全局变量

仍然是用模块的思想去解决问题:

//隐藏光标
void HideCursor();
//光标跳转
void CursorJump(int x, int y);
//初始化界面
void InitInterface();
//初始化方块信息
void InitBlockInfo();
//颜色设置
void color(int num);
//画出方块
void DrawBlock(int shape, int form, int x, int y);
//空格覆盖
void DrawSpace(int shape, int form, int x, int y);
//合法性判断
int IsLegal(int shape, int form, int x, int y);
//判断得分与结束
int JudeFunc();
//游戏主体逻辑函数
void StartGame();
//从文件读取最高分
void ReadGrade();
//更新最高分到文件
void WriteGrade();

接下来就是各个模块的内容:

首先是隐藏光标

//隐藏光标
void HideCursor()
{
	CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量
	curInfo.dwSize = 1;  //如果没赋值的话,隐藏光标无效
	curInfo.bVisible = FALSE; //将光标设置为不可见
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
	SetConso
* *俄罗斯方块源程序 */ #include #include #include #include /*图形函数库*/ /*定义按键码*/ #define VK_LEFT 0x4b00 #define VK_RIGHT 0x4d00 #define VK_DOWN 0x5000 #define VK_UP 0x4800 #define VK_ESC 0x011b #define TIMER 0x1c /*置中断号*/ /*定义常量*/ #define MAX_BOX 19 /*总共有19种各形态的方块*/ #define BSIZE 20 /*方块的边长是20个象素*/ #define Sys_x 160 /*显示方块界面的左上角x座标*/ #define Sys_y 25 /*显示方块界面的左上角y座标*/ #define Horizontal_boxs 10 /*水平的方向以方块为单位的长度*/ #define Vertical_boxs 15 /*垂直的方向以方块为单位的长度,也就说长是15个方块*/ #define Begin_boxs_x Horizontal_boxs/2 /*产生第一个方块时出现的起始位置*/ #define FgColor 3 /*前景颜色,如文字.2-green*/ #define BgColor 0 /*背景颜色.0-blac*/ #define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右边状态栏的x座标*/ #define false 0 #define true 1 /*移动的方向*/ #define MoveLeft 1 #define MoveRight 2 #define MoveDown 3 #define MoveRoll 4 /*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/ /*定义全局变量*/ int current_box_numb; /*保存当前方块编号*/ int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;/*x,y是保存方块的当前坐标的*/ int flag_newbox=false; /*是否要产生新方块的标记0*/ int speed=0; /*下落速度*/ int score=0; /*总分*/ int speed_step=30; /*每等级所需要分数*/ void interrupt (*oldtimer)(void);/* 指向原来时钟中断处理过程入口的中断处理函数指针 */ struct BOARD /*游戏底板结构,表示每个点所具有的属性*/ { int var; /*当前状态 只有0和1,1表示此点已被占用*/ int color; /*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/ }Table_board[Vertical_boxs][Horizontal_boxs]; /*方块结构*/ struct SHAPE { char box[2]; /*一个字节等于8位,每4位来表示一个方块的一行 如:box[0]="0x88",box[1]="0xc0"表示的是: 1000 1000 1100 0000*/ int color; /*每个方块的颜色*/ int next; /*下个方块的编号*/ };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值