赞
踩
应该是做出方块函数 然后以 这个方块 为单位 绘制 俄罗斯方块的 积木图形 ,在制作游戏界面的时候 也以方块长度为单位长度绘制 二维数组 在判断加分时候按方块单位逐行扫描 判断大概思路应该是这样吧
编写完成后直接就可以运行啊
- #include<iostream>
- #include<math.h>
- #include<Windows.h>
- #include<conio.h>
- #include<ctime>
- using namespace std;
-
- enum DIR
- {
- UP,
- RIGHT,
- DOWN,
- LEFT
- };
-
- time_t start = 0, finish = 0;
-
- int _x = 6, _y = 1;//图形生成位置
-
- int map[30][16] = { 0 };
-
- int sharp[20][8] = {
- {0,0,0,0,0,0,0,0},
- //I形
- {0,0,0,1,0,2,0,3},
- {0,0,1,0,2,0,3,0},
- //■形
- {0,0,1,0,0,1,1,1},
- //L形
- {0,0,0,1,0,2,1,2},
- {0,0,0,1,1,0,2,0},
- {0,0,1,0,1,1,1,2},
- {0,1,1,1,2,0,2,1},
- //J形
- {0,2,1,0,1,1,1,2},
- {0,0,0,1,1,1,2,1},
- {0,0,0,1,0,2,1,0},
- {0,0,1,0,2,0,2,1},
- //Z形
- {0,0,1,0,1,1,2,1},
- {0,1,0,2,1,0,1,1},
- //S形
- {0,1,1,0,1,1,2,0},
- {0,0,0,1,1,1,1,2},
- //T形
- {0,1,1,0,1,1,2,1},
- {0,0,0,1,0,2,1,1},
- {0,0,1,0,1,1,2,0},
- {0,1,1,0,1,1,1,2}
- };
-
-
- class Game
- {
- public:
- int score;//游戏分数
- int _id;//图形编号
- int top;//最高点高度
- int speed;//下落速度
-
- Game();
- void showMenu();//显示菜单
- void showGround();//显示游戏界面
- void gameOver();//游戏结束界面
- void Run();//运行游戏
- void sharpDraw(int id, bool show = false);//绘制图形
- void keyControl();//键盘控制
- bool move(int dir, int id);//移动判断
- bool downSet(int id);//下落
- void Turn(int id);//旋转
- void clean();//消行
- };
-
- void SetPos(int i, int j)//控制光标位置, 列, 行
- {
- COORD pos = { i,j };
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
- }
-
- int main()
- {
- CONSOLE_CURSOR_INFO cursor;
- GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);
- cursor.bVisible = 0; //这四行用来设置光标不显示
- SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor);
-
- srand((unsigned)time(NULL));
-
- Game game;
- game.showMenu();
- return 0;
- }
-
- Game::Game()
- {
- score = 0;
- _id = 0;
- top = 58;
- speed = 1000;
- }
-
- void Game::showMenu()
- {
- for (int i = 0; i < 30; i++)
- {
- for (int j = 0; j < 26; j++)
- {
- if ((i == 0 || i == 29) || (j == 0 || j == 25))
- {
- cout << "■";
- }
- else
- {
- cout << " ";
- }
- }
- cout << endl;
- }
-
- SetPos(17, 8);
- cout << "俄 罗 斯 方 块" << endl;
- SetPos(13, 12);
- cout << "↑旋转方块 ↓加速下滑" << endl;
- SetPos(12, 14);
- cout << "← →左右移动 空格 暂停" << endl;
- SetPos(15, 20);
- cout << "0 退出 Enter 开始" << endl;
-
- while (1)
- {
- int select = _getch();
- if (select == 13)
- {
- system("cls");
- this->Run();
- }
- else if (select = 48)
- {
- system("cls");
- exit(0);
- }
- }
- }
-
- void Game::showGround()
- {
- for (int i = 0; i < 30; i++)
- {
- for (int j = 0; j < 26; j++)
- {
- if ((i == 0 || i == 29) || (j == 0 || j == 25 || j == 15))
- {
- cout << "■";
- }
- else if (i == 15 && j > 15)
- {
- cout << "■";
- }
- else
- {
- cout << " ";
- }
- }
- cout << endl;
- }
-
- SetPos(31, 2);
- cout << "下 个图形" << endl;
- SetPos(31, 17);
- cout << "当 前得分" << endl;
-
- for (int i = 0; i < 30; i++)
- {
- for (int j = 0; j < 16; j++)
- {
- if ((i == 0 || i == 29) || (j == 0 || j == 15))
- {
- map[i][j] = 1;
- }
- else
- {
- map[i][j] = 0;
- }
- }
- }
- }
-
- void Game::gameOver()
- {
- for (int i = 5; i < 15; i++)
- {
- SetPos(1, i);
- cout << " " << endl;
- }
-
- SetPos(8, 7);
- cout << "G a m e O v e r" << endl;
-
- SetPos(3, 10);
- cout << "0 退出 Enter 重新开始" << endl;
-
- while (1)
- {
- int select = _getch();
- if (select == 13)
- {
- system("cls");
- this->Run();
- }
- else if (select == 48)
- {
- system("cls");
- exit(0);
- }
- }
-
- }
-
- void Game::Run()
- {
- score = 0;
- _id = 0;
- top = 58;
- _x = 6;
- _y = 1;
- showGround();
- start = clock();
- int new_id = rand() % 19 + 1;
-
- while (1)
- {
- sharpDraw(_id);
- keyControl();
-
- if (downSet(_id))
- {
- sharpDraw(-new_id, 1);
- _id = new_id;
- new_id = rand() % 19 + 1;
- sharpDraw(new_id, 1);
- clean();
- }
-
- SetPos(34, 20);
- cout << score << endl;
- }
- }
-
- void Game::sharpDraw(int id, bool show)
- {
- int x, y;
-
- if (show == true)
- {
- if (id > 0)
- {
- for (int i = 0; i < 4; i++)
- {
- x = 19 + sharp[id][2 * i];
- y = 6 + sharp[id][2 * i + 1];
- SetPos(2 * x, y);
- cout << "■";
- }
- }
- else
- {
- for (int i = 0; i < 4; i++)
- {
- x = 19 + sharp[-id][2 * i];
- y = 6 + sharp[-id][2 * i + 1];
- SetPos(2 * x, y);
- cout << " ";
- }
- }
- return;
- }
-
-
- if (id > 0)
- {
- for (int i = 0; i < 4; i++)
- {
- x = _x + sharp[id][2 * i];
- y = _y + sharp[id][2 * i + 1];
- SetPos(2 * x, y);
- cout << "■";
- }
- }
- else
- {
- for (int i = 0; i < 4; i++)
- {
- x = _x + sharp[-id][2 * i];
- y = _y + sharp[-id][2 * i + 1];
- SetPos(2 * x, y);
- cout << " ";
- }
- }
- return;
-
- }
-
- bool Game::downSet(int id)
- {
- if (id == 0)
- return true;
-
- finish = clock();
-
- if (finish - start < speed)
- {
- return false;
- }
-
- start = clock();
-
- if (!move(DOWN, _id))
- {
- int x, y;
- for (int i = 0; i < 4; i++)
- {
- x = _x + sharp[id][2 * i];
- y = _y + sharp[id][2 * i + 1];
- map[y][x] = 1;
-
- if (y < top)
- {
- top = y;
- }
- if (top <= 1)
- {
- gameOver();
- }
- }
- _x = 6;
- _y = 1;
- return true;
- }
-
- sharpDraw(-id);
- _y++;
- sharpDraw(id);
- return false;
- }
-
- bool Game::move(int dir, int id)
- {
- int x, y;
- switch (dir)
- {
- case UP:
- for (int i = 0; i < 4; i++)
- {
- x = _x + sharp[id][2 * i];
- y = _y + sharp[id][2 * i + 1];
- if (map[y][x] == 1)
- {
- return false;
- }
- }
- break;
- case DOWN:
- {
- for (int i = 0; i < 4; i++)
- {
- x = _x + sharp[id][2 * i];
- y = _y + sharp[id][2 * i + 1];
- if (map[y + 1][x] == 1)
- {
- return false;
- }
- }
- }
- break;
- case RIGHT:
- {
- for (int i = 0; i < 4; i++)
- {
- x = _x + sharp[id][2 * i];
- y = _y + sharp[id][2 * i + 1];
- if (map[y][x + 1] == 1)
- {
- return false;
- }
- }
- }
- break;
- case LEFT:
- {
- for (int i = 0; i < 4; i++)
- {
- x = _x + sharp[id][2 * i];
- y = _y + sharp[id][2 * i + 1];
- if (map[y][x - 1] == 1)
- {
- return false;
- }
- }
- }
- break;
- default:
- break;
- }
- return true;
- }
-
- void Game::Turn(int id)
- {
- switch (id)
- {
- case 1:id++; break;
- case 2:id--; break;
-
- case 3: break;
-
- case 4:id++; break;
- case 5:id++; break;
- case 6:id++; break;
- case 7:id -= 3; break;
-
- case 8:id++; break;
- case 9:id++; break;
- case 10:id++; break;
- case 11:id -= 3; break;
-
- case 12:id++; break;
- case 13:id--; break;
-
- case 14:id++; break;
- case 15:id--; break;
-
- case 16:id++; break;
- case 17:id++; break;
- case 18:id++; break;
- case 19:id -= 3; break;
-
- default:
- break;
- }
-
- if (!move(UP, id))
- {
- return;
- }
-
- sharpDraw(-_id);
- _id = id;
- }
-
- void Game::keyControl()
- {
- if (!_kbhit())
- return;
-
- int key = _getch();
-
- switch (key)
- {
- case 72:
- Turn(_id);
- break;
- case 80:
- if (move(DOWN, _id))
- {
- sharpDraw(-_id);
- _y++;
- }
- break;
- case 75:
- if (move(LEFT, _id))
- {
- sharpDraw(-_id);
- _x--;
- }
- break;
- case 77:
- if (move(RIGHT, _id))
- {
- sharpDraw(-_id);
- _x++;
- }
- break;
- case 32:
- {
- for (int i = 5; i < 15; i++)
- {
- SetPos(1, i);
- cout << " " << endl;
- }
-
- SetPos(10, 7);
- cout << "游 戏 暂 停" << endl;
-
- SetPos(3, 10);
- cout << "0 返回菜单 回车 继续游戏" << endl;
-
- while (1)
- {
- int select = _getch();
-
- if (select == 13)
- {
- for (int i = 5; i < 15; i++)
- {
- SetPos(1, i);
- cout << " " << endl;
- }
- break;
- }
- else if (select == 48)
- {
- system("cls");
- showMenu();
- }
- }
-
- }
- default:
- break;
- }
- }
-
- void Game::clean()
- {
- int n = -1;
- int line = -1;
- while (1)
- {
- for (int i = 28; i > 0; i--)
- {
- for (int j = 1; j < 15; j++)
- {
- line = i;
- if (map[i][j] == 0)
- {
- line = -1;
- break;
- }
- }
- if (line != -1)
- break;
- }
-
- if (line == -1)
- break;
-
- for (int i = line; i > 0; i--)
- {
- for (int j = 1; j < 15; j++)
- {
- if (i == 1)
- map[i][j] = 0;
- else
- {
- map[i][j] = map[i - 1][j];
- SetPos(2 * j, i);
- if (map[i][j] == 1)
- cout << "■";
- else
- cout << " ";
- }
- }
- }
- top++;
- n++;
- }
-
- if (n >= 0)
- {
- score += n * n * 100 + 100;
- if (speed > 100)
- speed = 1000 - score / 10;
- }
- }

- #define _CRT_SECURE_NO_WARNINGS
- #define MAX_ROW 3
- #define MAX_COL 3
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- void init(char chessBoard[MAX_ROW][MAX_COL]) {
- for (int row = 0; row < MAX_ROW; row++) {
- for (int col = 0; col < MAX_COL; col++) {
- chessBoard[row][col] = ' ';
- }
- }
- }
- void print_chessBoard(char chessBoard[MAX_ROW][MAX_COL]) {
- printf("+---+---+---+\n");
- for (int row = 0; row < MAX_ROW; row++) {
- printf("| %c | %c | %c |\n", chessBoard[row][0],
- chessBoard[row][1], chessBoard[row][2]);
- printf("+---+---+---+\n");
- }
- }
- void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
- while (1) {
- int row = 0;
- int col = 0;
- printf("请输入坐标(row col):");
- scanf("%d %d", &row, &col);
- if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
- printf("您的坐标不在合法范围内 [0, 2],请重新输入:\n");
- continue;
- }
- if (chessBoard[row][col] != ' ') {
- printf("您的坐标位置已经有子了!\n");
- continue;
- }
- chessBoard[row][col] = 'x';
- break;
- }
- }
- void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
- while (1) {
- int row = rand() % MAX_ROW;
- int col = rand() % MAX_COL;
- if (chessBoard[row][col] != ' ') {
- continue;
- }
- chessBoard[row][col] = 'o';
- break;
- }
- }
- int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
- for (int row = 0; row < MAX_ROW; row++) {
- for (int col = 0; col < MAX_COL; col++) {
- if (chessBoard[row][col] == ' ') {
- return 0;
- }
-
- }
- }
- return 1;
- }
- char isWin(char chessBoard[MAX_ROW][MAX_COL]) {
- for (int row = 0; row < MAX_ROW; row++) {
- if (chessBoard[row][0] != ' '
- && chessBoard[row][0] == chessBoard[row][1]
- && chessBoard[row][0] == chessBoard[row][2]) {
- return chessBoard[row][0];
- }
- }
- for (int col = 0; col < MAX_COL; col++) {
- if (chessBoard[0][col] != ' '
- && chessBoard[0][col] == chessBoard[1][col]
- && chessBoard[0][col] == chessBoard[2][col]) {
- return chessBoard[0][col];
- }
- }
- if (chessBoard[0][0] != ' '
- && chessBoard[0][0] == chessBoard[1][1]
- && chessBoard[0][0] == chessBoard[2][2]) {
- return chessBoard[0][0];
- }
- if (chessBoard[2][0] != ' '
- && chessBoard[2][0] == chessBoard[1][1]
- && chessBoard[2][0] == chessBoard[0][2]) {
- return chessBoard[2][0];
- }
- if (isFull(chessBoard)) {
- return 'q';
- }
- return ' ';
- }
- void game() {
- char chessBoard[MAX_ROW][MAX_COL] = { 0 };
- init(chessBoard);
- char winner = ' ';
- while (1) {
- system("cls");
- print_chessBoard(chessBoard);
- playerMove(chessBoard);
- winner = isWin(chessBoard);
- if (winner != ' ') {
- break;
- }
- computerMove(chessBoard);
- winner = isWin(chessBoard);
- if (winner != ' ') {
- break;
- }
- }
- print_chessBoard(chessBoard);
- if (winner == 'x') {
- printf("恭喜您, 您赢了!\n");
- }
- else if (winner == 'o') {
- printf("哈哈,您连人工智障都下不过!\n");
- }
- else {
- printf("您只能和人工智障打平手!!\n");
- }
- }
-
- int menu() {
- printf("--------------------------\n");
- printf("--------1.开始游戏--------\n");
- printf("--------0.退出游戏--------\n");
- printf("--------------------------\n");
- int choice = 0;
- printf("请输入你的选择:");
- scanf("%d", &choice);
- return choice;
- }
- int main()
- {
- srand((unsigned int)time(0));
- while (1) {
- int choice = menu();
- if (choice == 1) {
- game();
- }
- else if (choice == 0) {
- printf("退出游戏,GOODBYE!!!!!\n");
- break;
- }
- else {
- printf("输入错误!请重新输入!\n");
- continue;
- }
- }
- system("pause");
- return 0;
- }
