一个Linux下的 俄罗斯方块游戏,基于 ncurse 库。。

 几天前写得一个Linux下的 Tetris 游戏,基于 ncurses  库。。

望大家多多指教,功力太浅,多提代码的改进意见啊。。。。。。

可以在我的快盘里下载。。

http://www.kuaipan.cn/index.php?ac=file&oid=23998181306007579

转载于:https://my.oschina.net/u/204663/blog/36899

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用 ncurses 实现经典游戏俄罗斯方块的完整代码,供你参考: ```c++ #include <ncurses.h> #include <unistd.h> #include <stdlib.h> #include <time.h> #define ROWS 20 #define COLS 10 int board[ROWS][COLS] = {0}; // 游戏面板 int current[4][2]; // 当前方块坐标 int current_type; // 当前方块类型 int current_row, current_col; // 当前方块的左上角坐标 int score = 0; // 得分 // 定义七种方块的形状,每个方块有四个方向 int block[7][4][2] = { {{0, 0}, {0, 1}, {1, 0}, {1, 1}}, // 田字形 {{0, 0}, {0, 1}, {0, 2}, {0, 3}}, // 一字形 {{0, 0}, {0, 1}, {0, 2}, {1, 2}}, // L形 {{0, 0}, {0, 1}, {0, 2}, {-1, 2}}, // 反L形 {{0, 0}, {0, 1}, {-1, 1}, {1, 0}}, // Z形 {{0, 0}, {0, 1}, {1, 1}, {-1, 0}}, // 反Z形 {{0, 0}, {0, 1}, {0, 2}, {1, 1}}, // T形 }; // 初始化游戏面板 void init_board() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { board[i][j] = 0; } } } // 随机生成一个方块类型 int random_block_type() { srand((unsigned)time(NULL)); return rand() % 7; } // 初始化当前方块 void init_current() { current_type = random_block_type(); for (int i = 0; i < 4; i++) { current[i][0] = block[current_type][i][0]; current[i][1] = block[current_type][i][1]; } current_row = 0; current_col = COLS / 2 - 2; } // 在游戏面板上画出当前方块 void draw_current() { for (int i = 0; i < 4; i++) { int row = current_row + current[i][0]; int col = current_col + current[i][1]; board[row][col] = 1; } } // 从游戏面板上擦除当前方块 void erase_current() { for (int i = 0; i < 4; i++) { int row = current_row + current[i][0]; int col = current_col + current[i][1]; board[row][col] = 0; } } // 在游戏面板上画出所有方块 void draw_board() { for (int i = 0; i < ROWS; i++) { for (int j = 0; j < COLS; j++) { if (board[i][j] == 1) { mvprintw(i, j * 2, "[]"); } else { mvprintw(i, j * 2, " "); } } } } // 判断当前方块是否可以下移 int can_move_down() { for (int i = 0; i < 4; i++) { int row = current_row + current[i][0] + 1; int col = current_col + current[i][1]; if (row >= ROWS || board[row][col] == 1) { return 0; } } return 1; } // 方块下落一格 void move_down() { erase_current(); current_row++; draw_current(); } // 方块左移一格 void move_left() { erase_current(); current_col--; draw_current(); } // 方块右移一格 void move_right() { erase_current(); current_col++; draw_current(); } // 方块旋转 void rotate() { int temp[4][2]; for (int i = 0; i < 4; i++) { temp[i][0] = current[i][0]; temp[i][1] = current[i][1]; } for (int i = 0; i < 4; i++) { current[i][0] = temp[i][1]; current[i][1] = -temp[i][0]; } if (current_col + current[0][1] < 0) { current_col = -current[0][1]; } else if (current_col + current[3][1] >= COLS) { current_col = COLS - current[3][1] - 1; } erase_current(); draw_current(); } // 消除一行 void clear_row(int row) { for (int i = row; i > 0; i--) { for (int j = 0; j < COLS; j++) { board[i][j] = board[i - 1][j]; } } for (int j = 0; j < COLS; j++) { board[0][j] = 0; } score += 10; } // 扫描并消除已满的行 void check_row() { for (int i = ROWS - 1; i >= 0; i--) { int full = 1; for (int j = 0; j < COLS; j++) { if (board[i][j] == 0) { full = 0; break; } } if (full) { clear_row(i); i++; } } } // 判断游戏是否结束 int is_game_over() { for (int i = 0; i < COLS; i++) { if (board[0][i] == 1) { return 1; } } return 0; } int main() { // 初始化 ncurses initscr(); cbreak(); noecho(); keypad(stdscr, TRUE); curs_set(0); // 初始化游戏面板和当前方块 init_board(); init_current(); // 开始游戏循环 while (1) { clear(); // 检测用户输入 int ch = getch(); switch (ch) { case KEY_LEFT: if (current_col > 0) { move_left(); } break; case KEY_RIGHT: if (current_col < COLS - 2) { move_right(); } break; case KEY_UP: rotate(); break; case KEY_DOWN: while (can_move_down()) { move_down(); } break; case 'q': endwin(); exit(0); break; default: break; } // 方块下落 if (can_move_down()) { move_down(); } else { check_row(); init_current(); if (is_game_over()) { mvprintw(ROWS / 2, COLS, "Game Over! Press 'q' to quit."); while (getch() != 'q') ; endwin(); exit(0); } } // 在屏幕上显示游戏面板和得分 draw_board(); mvprintw(ROWS, 0, "Score: %d", score); // 刷新屏幕 refresh(); // 等待一段时间 usleep(50000); } // 退出 ncurses endwin(); return 0; } ``` 注意,以上代码只是一个简单的实现,可能会有一些 bug 和不足之处,仅供参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值