东X哥 通过本文主要向大家介绍了linux下c++编程教程,linux c++项目实例,linux c++编程,linux c++编译器,c++ linux等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
本文实例为大家分享了C++实现俄罗斯方块游戏代码,供大家参考,具体内容如下
1.block.c
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <setjmp.h>
#include <sys/time.h>
#include <string.h>
#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

