1.在linux下安装ncurses库
sudo apt-get update
sudo apt-get install libncurses5-dev
2.编译时-l 选项引入 ncurses 库
g++ main.cpp -l ncurses
3.源码
#include <iostream>
#include <sys/time.h>
#include <sys/types.h>
#include <stdlib.h>
#include <ncurses.h>
#include <unistd.h>
using namespace std;
void swap(int &a, int &b){
int t=a;
a = b;
b = t;
}
int getrand(int min, int max) //得到一个(min,max)区间的随机整数
{
return(min+rand()%(max-min+1));
}
WINDOW *create_newwin(int height,int width,int starty,int startx);//调用newwin创建新窗口,并显示边框
void destory_win(WINDOW *local_win);
int game_win_height=30;
int game_win_width=45; //游戏窗口的尺寸
int hint_win_height=10;
int hint_win_width=20; //显示下一个方块形状的窗口的尺寸
WINDOW * game_win, *hint_win ,*score_win; //3个窗口的指针,游戏,下一个方块,分数
int key;
class Piece //方块类
{
public:
int score; //分数
int shape; //形状
int next_shape; //下一个方块形状
int head_x; //当前方块首个box的位置,标记位置
int head_y;
int size_h; //当前方块的size
int size_w;
int next_size_h; //下一个方块的size
int next_size_w;
int box_shape[4][4]; //当前方块的形状数组4×4,所有7种图形可以在4×4的方框中画出
int next_box_shape[4][4]; //当前方块的形状数组4×4
int box_map[30][45]; //用来标记游戏框内的每个box
bool game_over;
public:
void initial(); //初始化函数
void set_shape(int &cshape, int box_shape[][4],int &size_w, int & size_h); //设置方块形状
void score_next(); //显示下一个方块形状以及得分
void judge(); //判断是否层满
void move(); //移动函数,通过 ← → ↓ 移动
void rotate(); //旋转函数
bool isaggin(); //判断下一次行动是否越界或重合
bool exsqr(int row); //判断当前行是否空
};
int main()
{
initscr(); //屏幕初始化,并进入curses模式
//raw(); //禁止行缓冲,处理挂起、中断或退出等将直接传送给程序去处理而不产生终端信号
cbreak(); //禁止行缓冲,控制字符将被终端驱动程序解释成其它字符
noecho(); //禁止输入的字符出现在屏幕上
curs_set(0);
keypad(stdscr,TRUE); //允许使用功能键,为标准屏幕(stdscr)激活了功能键
refresh(); //刷新终端屏幕
game_win = create_newwin(game_win_height, game_win_width, 0,0); //创建游戏窗口,设置边框
wborder(game_win, '*', '*', '*', '*', '*', '*', '*', '*');
wrefresh(game_win);
hint_win = create_newwin(hint_win_height, hint_win_width, 0, game_win_width+10);//创建下一个形状提示窗口
mvprintw(0, game_win_width+10+2,"%s","Next");
refresh();
score_wi