用linux写俄罗斯方块代码,Linux下用C++实现俄罗斯方块

本文实例为大家分享了C++实现俄罗斯方块游戏代码,供大家参考,具体内容如下

1.block.c

#include

#include

#include

#include

#include

#include

#include

#include "block.h"

//init for globle

void

init_for_globle(void)

{

x = X / 2 - 2; // the first diamond appear postion

flag_erase = 1;

srand(getpid()); //srand

num = rand() % 7; // random appear first diamond

mode = rand() % 4; // random appear first diamond mode

color = rand() % 7 + 41; // random first diamond color

next_num = rand() % 7;

next_mode = rand() % 4;

save_color = rand() % 7 + 41;

print_start_interface(); // print game start interface

// print_score(); // print init score 0

// print_level(); // print init level 1

}

//print start interface

void

print_start_interface(void)

{

int x, y;

printf("\33[2J");

printf("\33[%d;%dH\33[32m分数:\33[0m", p_y + 10, p_x + 25);

printf("\33[%d;%dH\33[32m等级:\33[0m", p_y + 14, p_x + 25);

for (x = p_x, y = p_y; x <= 46; x++)

printf("\33[%d;%dH\33[41m==\33[0m", y, x);

for (x = p_x, y = p_y + 1; y <= 25; y++)

printf("\33[%d;%dH\33[41m||\33[0m", y, x);

for (x = p_x + 22, y = p_y + 1; y <= 25; y++)

printf("\33[%d;%dH\33[41m||\33[0m", y, x);

for (x = p_x + 36, y = p_y + 1; y <= 25; y++)

printf("\33[%d;%dH\33[41m||\33[0m", y, x);

for (x = p_x + 24, y = p_y + 8; x <= 44; x++)

printf("\33[%d;%dH\33[41m--\33[0m", y, x);

for (x = p_x, y = p_y + 21; x <= 46; x++)

printf("\33[%d;%dH\33[41m==\33[0m", y, x);

printf("\33[?25l");

fflush(stdout);

}

//erase last diamonds

void

erase_last(void)

{

int j, x1, y1, n;

x1 = save_x + p_x + 2;

for (j = 0, n = 0; j < 16; j++) {

if (j / 4 >= shape[num][save_mode][16] && j % 4 == 0) {

y1 = save_y + p_y + 1 + n;

printf("\33[%d;%dH", y1, x1);

n++;

}

if (j / 4 >= shape[num][save_mode][16]

&& j % 4 >= shape[num][save_mode][17]) {

if (shape[num][save_mode][j] == 0) {

printf("\33[2C");

}

if (shape[num][save_mode][j] == 1) {

printf(" ");

}

}

}

fflush(stdout);

}

//print modes shape

void

print_mode_shape(void)

{

int j, x1, y1, n;

int left_flag = 0;

if (flag_erase == 0) {

erase_last();

}

x1 = x + p_x + 2;

for (j = 0, n = 0; j < 16; j++) {

if (j / 4 >= shape[num][mode][16] && j % 4 == 0) {

y1 = y + p_y + 1 + n;

printf("\33[%d;%dH", y1, x1);

n++;

}

if (j / 4 >= shape[num][mode][16]

&& j % 4 >= shape[num][mode][17]) {

if (shape[num][mode][j] == 0) {

printf("\33[2C");

}

if (shape[num][mode][j] == 1) {

printf("\33[%dm[]\33[0m", color);

}

}

fflush(stdout);

}

printf("\33[0m");

fflush(stdout);

save_x = x;

save_y = y;

save_mode = mode;

save_row = 4 - shape[num][mode][16];

save_col = 4 - shape[num][mode][17];

flag_erase = 0;

}

//store diamonds to matrix by color to flag

void

store_flag_color(void)

{

int i, a = 0, b = 0;

for (i = 0; i < 16; i++) {

if (i / 4 >= shape[num][mode][16] && i % 4 == 0) {

a++;

b = 0;

}

if (i / 4 >= shape[num][mode][16]

&& i % 4 >= shape[num][mode][17]) {

if (shape[num][save_mode][i] == 0) {

b = b + 2;

}

if (shape[num][save_mode][i] == 1) {

matirx[save_y + a - 1][save_x + b] = color;

b++;

matirx[save_y + a - 1][save_x + b] = color;

b++;

}

}

}

}

//print the save matrix

void

print_save_matrix(void)

{

int i, j, n = 0;

for (i = 0; i < Y; i++) {

printf("\33[%d;%dH", i + p_y + 1, p_x + 2);

for (j = 0; j < X; j++) {

if (matirx[i][j] != 0) {

n = (n + 1) % 2;

fprintf(stdout, "\33[%dm", matirx[i][j]);

(n == 1) ? printf("[") : printf("]");

}

if (matirx[i][j] == 0) {

printf("\33[0m");

printf(" ");

}

fflush(stdout);

}

}

}

// change shape

void

change_shape(void)

{

int i, n;

for (i = 0; i < save_row; i++) {

if (num == 6) {

n = 4;

} else {

n = 0;

}

if (((x + n) >= X - save_col * 2 && save_col < save_row) ||

judge_by_color(x, (mode + 1) % 4) == 1) {

return;

}

}

mode = (mode + 1) % 4;

fflush(stdout);

print_mode_shape();

fflush(stdout);

}

//move right

void

move_right(void)

{

int i;

if (x >= X - save_col * 2 || judge_by_color(x + 2, mode) == 1) {

return;

}

x = x + 2;

print_mode_shape();

fflush(stdout);

}

// move left

void

move_left(void)

{

int i;

if (x <= 0 || judge_by_color(x - 2, mode) == 1) {

return;

}

x = x - 2;

print_mode_shape();

fflush(stdout);

}

// move down

void

move_down()

{

y++;

if (y >= Y - save_row + 1 || judge_by_color(x, mode) == 1) {

store_flag_color();

game_over();

y = 0;

save_row = 0;

save_col = 0;

x = X / 2 - 2;

num = next_num;

mode = next_mode;

color = save_color;

next_num = random() % 7;

next_mode = random() % 4;

save_color = random() % 7 + 41;

print_next();

flag_erase = 1;

destroy_line();

fflush(stdout);

return;

}

print_mode_shape();

fflush(stdout);

}

void

fall_down()

{

while (1) {

y++;

if (y >= Y - save_row + 1 || judge_by_color(x, mode) == 1) {

store_flag_color();

game_over();

y = 0;

save_row = 0;

save_col = 0;

x = X / 2 - 2;

num = next_num;

mode = next_mode;

color = save_color;

next_num = rand() % 7;

next_mode = rand() % 4;

save_color = rand() % 7 + 41;

print_next();

flag_erase = 1;

destroy_line();

fflush(stdout);

return;

}

print_mode_shape();

fflush(stdout);

}

}

//erase next tip diamond

void

erase_next(void)

{

int i, j, n = 0;

for (i = 0; i < 4; i++) {

printf("\33[%d;%dH", p_y + 3 + n, p_x + X + 7);

n++;

for (j = 0; j < 4; j++) {

printf(" ");

}

}

printf("\33[30;4H\33[?25l");

fflush(stdout);

}

//print next tip diamond

void

print_next(void)

{

int j, n = 0;

erase_next();

for (j = 0; j < 16; j++) {

if (j / 4 >= shape[next_num][next_mode][16] && j % 4 == 0) {

printf("\33[%d;%dH", p_y + 3 + n, p_x + X + 7);

n++;

}

if (j / 4 >= shape[next_num][next_mode][16]

&& j % 4 >= shape[next_num][next_mode][17]) {

if (shape[next_num][next_mode] == 0) {

printf("\33[2C");

}

if (shape[next_num][next_mode][j] == 1) {

printf("\33[%dm[]\33[0m", save_color);

}

}

}

}

//print scores info

void

print_score(void)

{

printf("\33[%d;%dH\33[31m%d\33[0m", p_y + 10, p_x + X + 10, score);

fprintf(stdout, "\33[%d;0H", p_y + 20 + 2);

}

//print grades info

void

print_level(void)

{

printf("\33[%d;%dH\33[31m%d\33[0m", p_y + 14, p_x + X + 10, level);

fprintf(stdout, "\33[%d;0H", p_y + 20 + 2);

}

//destroy a line or lines

void

destroy_line(void)

{

int i, j, full;

int a, b, c;

for (i = 0; i < Y; i++) {

full = 1;

for (j = 0; j < X; j++) {

if (matirx[i][j] == 0) {

full = 0;

}

}

if (full == 1) {

for (a = 0; a < i; a++) {

for (b = 0; b < X; b++) {

matirx[i - a][b] = matirx[i - a - 1][b];

}

}

print_save_matrix();

score = score + 100;

if (score % LEVEL_SCORE == 0) {

level = level + 1;

if (level >= 9)

level = 9;

change_level();

print_level();

}

print_score();

}

}

}

//change level , change rate

void

change_level(void)

{

switch (level) {

case 1:

setitimer(ITIMER_REAL, &level_01, NULL);

break;

case 2:

setitimer(ITIMER_REAL, &level_02, NULL);

break;

case 3:

setitimer(ITIMER_REAL, &level_03, NULL);

break;

case 4:

setitimer(ITIMER_REAL, &level_04, NULL);

break;

case 5:

setitimer(ITIMER_REAL, &level_05, NULL);

break;

case 6:

setitimer(ITIMER_REAL, &level_06, NULL);

break;

case 7:

setitimer(ITIMER_REAL, &level_07, NULL);

break;

case 8:

setitimer(ITIMER_REAL, &level_08, NULL);

break;

case 9:

setitimer(ITIMER_REAL, &level_09, NULL);

break;

default:

break;

}

}

//by the color to judge whether went across or not

int

judge_by_color(int x, int mode)

{

int i, a = 0, b = 0;

for (i = 0; i < 16; i++) {

if (i / 4 >= shape[num][mode][16] && i % 4 == 0) {

a++;

b = 0;

}

if (i / 4 >= shape[num][mode][16]

&& i % 4 >= shape[num][mode][17]) {

if (shape[num][mode][i] == 0) {

b = b + 2;

}

if (shape[num][mode][i] == 1) {

if (matirx[a + y - 1][b + x] != 0) {

return 1;

} else

b = b + 2;

}

}

}

}

//control the diamonds shape by the key

void

key_control(void)

{

int ch, flag = 1;

struct termios save, raw;

tcgetattr(0, &save);

cfmakeraw(&raw);

tcsetattr(0, 0, &raw);

if (setjmp(env) == 0) {

while (flag) {

ch = getchar();

if (ch == '\r') {

fall_down();

}

if (ch == '\33') {

ch = getchar();

if (ch == '[') {

ch = getchar();

switch (ch) {

case 'A':

change_shape();

break;

case 'B':

move_down();

break;

case 'C':

move_right();

break;

case 'D':

move_left();

break;

}

}

}

if (ch == 'q' || ch == 'Q') {

flag = 0;

}

}

printf("\33[%d;%dH\33[31m-----game interrupt exit!-----\33[0m",

p_y + Y + 3, p_x);

printf("\33[%d;0H\33[?25h", p_y + Y + 4);

}

tcsetattr(0, 0, &save);

}

//reach the top line, the game is over

void

game_over(void)

{

int i;

for (i = 0; i < X; i++) {

if (matirx[1][i] != 0) {

printf

("\33[31m\33[%d;%dH-------game over!--------\33[0m",

p_y + Y + 3, p_x);

printf("\33[0m\33[?25h\33[%d;0H", p_y + Y + 4);

longjmp(env, 2);

}

}

}

2.block.h

#ifndef _BLOCK_H_

#define _BLOCK_H_

#define p_x 10 //init postion row;

#define p_y 5 //init postion col;

#define X 20 // game_window_size

#define Y 20

#define LEVEL_SCORE 500 // need scores to upgrade

jmp_buf env;

static int x, y; // current diamonds postion

static int flag_erase; // erase flag

static int num, mode, next_num, next_mode; // current and next diamonds

static int save_row, save_col, save_x, save_y, save_mode;// save coordinate, save graph

static int color, save_color, flag_color; // save the color of the next diamonds

static int matirx[Y][X] = { 0 }; // save diamonds' matrix

static int level = 1; // game levels

static int score = 0; // game scores

typedef struct itimerval LEVEL;

static LEVEL level_00 = { {0, 0}, {0, 0} };

static LEVEL level_01 = { {0, 800000}, {1, 0} };

static LEVEL level_02 = { {0, 500000}, {0, 500000} };

static LEVEL level_03 = { {0, 400000}, {0, 300000} };

static LEVEL level_04 = { {0, 300000}, {0, 300000} };

static LEVEL level_05 = { {0, 200000}, {0, 300000} };

static LEVEL level_06 = { {0, 150000}, {0, 300000} };

static LEVEL level_07 = { {0, 100000}, {0, 300000} };

static LEVEL level_08 = { {0, 80000 }, {0, 300000} };

static LEVEL level_09 = { {0, 60000 }, {0, 300000} };

//three-dimensional for saving diamonds and diamonds' shape :

//first-dimensional for kind of diamonds-shape

//second-dimensional for alterable's mode

//third-dimensional for reality value of row and col

static const int shape[7][4][18] = {

{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 2, 1}, //

{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 2}, // [] [] [][][] []

{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 2, 1}, // [][][] [][] [] [][]

{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 2}}, // [] []

{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 2, 1}, //

{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 2}, // [] [][]

{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 2, 1}, // [] [] [][][] []

{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 2}}, // [][][] [][] [] []

{{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 2}, //

{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 2, 1}, // [][] []

{0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 2}, // [] [] [][][] []

{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 2, 1}}, // [][][] [] [] [][]

{{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 2}, //

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 1}, // []

{0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 2}, // [][] [][]

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 2, 1}}, // [] [][]

{{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 2}, //

{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 2, 1}, // []

{0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 2}, // [][] [][]

{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 2, 1}}, // [] [][]

{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2}, //

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2}, //

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2}, // [][]

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 2, 2}}, // [][]

{{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3}, // []

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 0}, // [] [][][][]

{0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3}, // []

{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 0}} // []

};

void init_for_globle(void);

void print_start_interface(void);

void print_mode_shape(void);

void print_save_matrix(void);

void change_shape(void);

void move_left(void);

void move_right(void);

void move_down();

void fall_down();

void store_flag_color(void);

void key_control(void);

void erase_last(void);

void destroy_line(void);

void print_next(void);

void erase_next(void);

void change_level(void);

void print_score(void);

void print_level(void);

int judge_by_color(int x, int mode);

void game_over(void);

#endif

3.main.c

#include

#include

#include

#include

#include "block.h"

int

main(int argc, char **argv)

{

init_for_globle(); //init for globle

print_mode_shape(); //print first diamond

print_next(); //print next diamond

setitimer(ITIMER_REAL, &level_01, NULL); //init one leve ;interval 800ms

signal(SIGALRM, move_down); //diamond down base on the interval time

key_control(); //using zhe key to play games

return 0;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值