使用C++一步步实现俄罗斯方块

 更新时间:2017年12月22日 08:59:17   作者:MCFON  
本文给大家分享的是作者在使用C++制作俄罗斯方块的时候的思路分析以及开发准备和实验原理,都是些基础的知识储备,希望大家能够喜欢,具体的代码我们下一节再分享给大家

一、实验介绍

1.1 实验内容

本节实验我们进行设计俄罗斯方块前的思路分析,以及介绍ncurses 库的使用方法。

1.2 实验知识点

C++ 编程基础
ncurses 库的使用
俄罗斯方块逻辑设计

1.3 实验环境

xface 终端
g++ 编译器
ncurses 库

1.4 适合人群

本课程难度一般,适合有 C++ 编程基础,对游戏设计、逻辑分析感兴趣的同学。

1.5 代码获取

git clone https://github.com/Gamerchen/game_zero.git

二、开发准备

2.1 安装 ncurses 库

sudo apt-get update
sudo apt-get install libncurses5-dev

2.2 编译程序

编译命令要加上 -l 选项引入 ncurses 库:

g++ main.c -l ncurses

三、实验原理

3.1 设计前的分析

在开始程序编写之前,我们要先分析程序设计需要实现哪些功能,划分为哪些模块,在俄罗斯方块中我们首先想到的应该是显示方块,其次是方块的下落,左右移动,旋转,最后的层满消行,另外一个基本的俄罗斯方块游戏还应该有下一个方块形状的提示功能。

所以我们编程中需要解决的问题有:

显示方块
实现方块的移动
方块旋转
对层满的方块消行
提示下一个方块形状

3.2 基本图形

每个方块由四个 box 组成,从游戏框的中心位置掉落,在框内不碰撞边界和其他方块的情况下可以进行旋转。


3.3 NCURSES库的使用

简单地说, NCURSES 是一个从 System V Release 4.0 (SVr4) 中 CURSES 的克隆,这是一个可自由配置的库,完全兼容旧版本的 CURSES,是一个可以使应用程序直接控制终端屏幕显示的库。NCURSES封装了底层的终端功能,包含了一些创建窗口的函数,并且有 Menu 、 Panel 和 Form 对CURSES基础库的扩展,我们可以建立一个同时包含多窗口(multiple windows)、菜单(menus)、面板(panels)和表单(forms)的应用程序。窗口可以被独立管理,例如让它卷动(scrollability)或者隐藏。 菜单(Menus)可以让用户建立命令选项,从而方便执行命令。而窗体(Forms)允许用户建立一些简单的数据输入和显示的窗口。面板(Panels)是 NCURSES 窗口管理功能的扩展,可以用它覆盖或堆积窗口。

3.3.1 NCURSES--从Hello World程序开始

如果调用 NCURSES 库中的函数,必须在代码中加载 ncurses.h 文件( ncurses.h中已经包含stdio.h )

例:

#include <ncurses.h>

int main()
{
 initscr(); //初始化,进入NCURSES模式
 printw("Hello World!"); //在虚拟屏幕上打印 Hello Wowrld!
 refresh(); //将虚拟屏幕上的内容写到显示器上,并刷新
 getch(); //等待用户输入
 endwin(); //退出NCURSES模式
 return 0;
}

在以上实例中我们介绍了 NCURSES 库中最基本函数的使用方法,函数的功能已在注释中说明,这里不再赘述。

3.3.2 窗口机制

当 NCURSES 初始化的时候,它会默认创建一个叫做 stdscr 的窗口,大小一般是 80 列,25 行(根据显示器或者显卡的不同,可能会出现不同的大小),除此之外,你还可以通过窗口系统的函数创建你自己的窗口。

举例说明,如果调用以下函数:

printw("Hi!");
refresh();

它会在stdscr上当前光标位置输出 "Hi!",调用 refresh() 函数,只更新 stdscr 上的缓冲区。

如果你已经建立了一个叫做win的窗口,想要在win窗口上输出内容,可以再普通函数前添加w,同时参数也要发生变化。

printw(string) //在stdscr的当前光标位置打印字符串string
mvprintw(y,x,string)  //将字符串string打印在坐标(y,x)处
wprintw(win,string)  //在窗口win的当前光标位置打印字符串string
mvwprintw(win,y,x,string)  //将光标移动到窗口win的(y,x)处然后打印字符串string
相信看完上面的例子,你已经能够通过函数的命名规则看出各个函数的功能区别

3.3.3 newwin和box函数

一个窗口的建立是通过 newwin() 函数开始的,函数返回一个指向窗口的结构指针,这个指针可以被传送至一些类似于 wprintw() 这样需要窗口参数的函数中。

然而,我们创建了一个窗口却无法看见它,需要用 box() 函数在已经定义的窗口外围画上边框。

例:

WINDOW *create_newin(int height, int width, int starty, int startx)
{
 WINDOW *local_win;
 local_win = newin(height, width, starty, startx);
 box(local_win, 0, 0);
 wrefresh(local_win);
 return local_win;
}

关于 NUCRSES 库的基本使用方法就介绍到这里了,在具体使用中遇到问题仍需要查阅相关资料。

相关文章

  • C++ 使用模板实现一个List的实例

    C++ 使用模板实现一个List的实例

    这篇文章主要介绍了 C++ 使用模板实现一个List的实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • OpenGL画bezier曲线

    OpenGL画bezier曲线

    这篇文章主要为大家详细介绍了OpenGL画bezier曲线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 浅谈c++中的while(cin)问题

    浅谈c++中的while(cin)问题

    下面小编就为大家带来一篇浅谈c++中的while(cin)问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 深入理解Qt信号槽机制

    深入理解Qt信号槽机制

    信号槽是 Qt 框架引以为豪的机制之一。本文主要介绍了Qt信号槽机制,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • c++ 实现文件逐行读取与字符匹配

    c++ 实现文件逐行读取与字符匹配

    这里尝试通过C++来实现一个文件IO的功能,看看是否能够比python的表现更好一些,感兴趣的朋友可以参考下
    2021-05-05
  • C语言实现enum枚举

    C语言实现enum枚举

    在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用,比如一个星期只有七天,一年只有十二个月,一个班每周有六门课程等。 以每周七天为例,我们可以使用#define命令来给每天指定一个名字
    2021-06-06
  • C语言的冒泡排序和快速排序算法使用实例

    C语言的冒泡排序和快速排序算法使用实例

    这篇文章主要介绍了C语言的冒泡排序和快速排序算法使用实例,示例题目也是ACM练习当中的基础习题,需要的朋友可以参考下
    2015-08-08
  • C++实现哈夫曼树编码解码

    C++实现哈夫曼树编码解码

    这篇文章主要为大家详细介绍了C++实现哈夫曼树编码解码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++实现简单的图书管理系统

    C++实现简单的图书管理系统

    本文给大家分享的是使用C++实现简单的图书管理系统的代码,本系统采用了面向对象的程序设计方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-08-08
  • C语言位运算和sizeof运算符详解

    C语言位运算和sizeof运算符详解

    这篇文章主要介绍了C语言位运算和sizeof运算符详解的相关资料,这里提供了详细的知识要点,并附简单代码示例,需要的朋友可以参考下
    2016-11-11

最新评论