纯C++Tetris分享

简介:由↑↓←→四个键操作,速度与难度可调(建议不调)
操作说明:
1.↑调整方块朝向
2.↓加速方块下落
3.↔调整方块位置

直接上代码吧:(可能有点长)

#include <bits/stdc++.h>
#include <windows.h>
#include <mmsystem.h>#pragma comment(lib, "winmm.lib")
using namespace std;#define GameW 10
#define GameH 20
const int CtrlLeft = GameW*2+4 + 3;
const int SPEED = 100; //游戏刷新速度 struct Point {Point(){}Point(int x, int y) {_x = x, _y = y;}int _x, _y;
};HANDLE g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE g_hInput  = GetStdHandle(STD_INPUT_HANDLE);Point g_ptCursor(0,0);
BOOL isChecking = FALSE;
BOOL g_bGameOver = FALSE;
int g_nGameBack[GameH][GameW], Case;
int nowKeyInfo = -1;
int g_nDiff = 1;   //游戏难度
int g_nLife = 3;   //生命值
int g_nScore = 0;  //分数初始化 void SetCursor(COORD cd) {SetConsoleCursorPosition(g_hOutput, cd);
}
void SetCursor(int x, int y){COORD cd = {x, y};SetCursor(cd);
}
void SetBlockCursor(int x, int y){COORD cd = {2*x + 2, y + 1};SetCursor(cd);
}void SetBack(int x, int y, BOOL bk) {SetBlockCursor(x, y);if (bk) printf("%s", "■");elseprintf(" ");
}bool Out(int x, int y) {return x < 0 || y < 0 || x >= GameW || y >= GameH;
}struct xBlock {public:int len;int nowRotateID;BOOL mask[4][4][4];static vector <xBlock> List;xBlock() { len = 0; }xBlock(int l, char *str) {int i, j, k;len = l;memset(mask, FALSE, sizeof(mask));for (i = 0; i < l; i++) {for (j = 0; j < l; j++) {mask[0][i][j] = str[i*l + j] - '0';}}for (k = 1; k < 4; k++) {for (i = 0; i < len; i++) {for (j = 0; j < len; j++) {mask[k][i][j] = mask[k-1][j][len-1-i];}}}nowRotateID = rand() % 4;}void rotate() {nowRotateID ++;if (nowRotateID >= 4)nowRotateID = 0;}BOOL getUnit(int x, int y, int roID) {if (roID == -1) {roID = nowRotateID;}return mask[roID][y][x];}
};vector <xBlock> xBlock::List;class Block {public:int x, y;int ID;xBlock bk;void reset(xBlock *pbk) {bk = *pbk;x = 4, y = 0;ID = ++ Case;if (collide(0,0)) {lifeDown();}draw();*pbk = xBlock::List[rand() % xBlock::List.size()];}void lifeDown() {int i, j;for (i = 0; i < GameH; i++) {for (j = 0; j < GameW; j++) {SetBack(j, i, TRUE);Sleep(10);}}if (g_nLife) {g_nLife --;for (i = g_nLife; i < 6; i++) {SetCursor(CtrlLeft + i, 15);printf("%c", ' ');}for (i = GameH-1; i >= 0; i--) {for (j = GameW-1; j >= 0; j--) {SetBack(j, i, FALSE);Sleep(10);g_nGameBack[i][j] = 0;}}}else {g_bGameOver = TRUE;}}void erase() {int i, j;for (i = 0; i < bk.len; i++) {for (j = 0; j < bk.len; j++) {if (bk.getUnit(j, i, -1)) {if (! Out(j+x, i+y) && g_nGameBack[i+y][j+x]) {SetBack(j+x, i+y, FALSE);g_nGameBack[i+y][j+x] = 0;}}}}}void draw() {int i, j;for (i = 0; i < bk.len; i++) {for (j = 0; j < bk.len; j++) {if (bk.getUnit(j, i, -1)) {if (! Out(j+x, i+y) && ! g_nGameBack[i+y][j+x]) {SetBack(j+x, i+y, TRUE);g_nGameBack[i+y][j+x]  = ID;}}}}}void draw(int x, int y) {int i, j;for (i = 0; i < 4; i++) {for (j = 0; j < 4; j++) {SetCursor(x + 2*j, y + i);if (bk.getUnit(j, i, -1)) {    printf("%s", "■");}else printf(" ");}}}bool collide(int dx, int dy, int roID = -1) {int i, j;for (i = 0; i < bk.len; i++) {for (j = 0; j < bk.len; j++) {if (bk.getUnit(j, i, roID)) {Point ptPos(j + x + dx, i + y + dy);if (Out(ptPos._x, ptPos._y)|| g_nGameBack[ptPos._y][ptPos._x] && ID != g_nGameBack[ptPos._y][ptPos._x]) {return TRUE;}}}}return FALSE;}void rotate(int nTimes = 1) {int nextro = (bk.nowRotateID + nTimes) % 4;if (collide(0, 0, nextro)) {return ;}Beep(12000, 50);erase();bk.nowRotateID = nextro;draw();}BOOL changepos(int dx, int dy) {if (collide(dx, dy)) {return FALSE;}erase();x += dx;y += dy;draw();return TRUE;}
};void GameInit() {CONSOLE_CURSOR_INFO cursor_info;cursor_info.bVisible = FALSE;cursor_info.dwSize   = 100;SetConsoleCursorInfo(g_hOutput, &cursor_info);xBlock::List.push_back(xBlock(3, "010111000"));xBlock::List.push_back(xBlock(3, "110110000"));xBlock::List.push_back(xBlock(3, "111001000"));xBlock::List.push_back(xBlock(3, "111100000"));xBlock::List.push_back(xBlock(3, "110011000"));xBlock::List.push_back(xBlock(3, "011110000"));xBlock::List.push_back(xBlock(4, "1000100010001000"));
}void DrawFrame(int x, int y, int nWidth, int nHeight) {int i;for (i = 0; i < nWidth; i++) {SetCursor(x + 2*i + 2, y);printf("%s", "一");SetCursor(x + 2*i + 2, y + nHeight+1);printf("%s", "┄");}for (i = 0; i < nHeight; i++) {SetCursor(x, y + i + 1);printf("%s", "┆");SetCursor(x + nWidth*2+2, y + i + 1);printf("%s", "┆");}        SetCursor(x, y);printf("%s", "┌");    SetCursor(x, y + nHeight+1);printf("%s", "└");SetCursor(x + nWidth*2+2, y);printf("%s", "┐");    SetCursor(x + nWidth*2+2, y + nHeight+1);printf("%s", "┘");
}void MissionInit() {memset(g_nGameBack, FALSE, sizeof(g_nGameBack));Case = 1;int i;DrawFrame(0, 0, GameW, GameH);DrawFrame(GameW*2+4, 0, 4, GameH);SetCursor(CtrlLeft, 2);printf("Next");SetCursor(CtrlLeft, 8);printf("Speed");for (i = 0; i < g_nDiff; i++) {SetCursor(CtrlLeft + i, 9);printf("%c", 1);}SetCursor(CtrlLeft, 11);printf("Score");SetCursor(CtrlLeft, 12);printf("%d", g_nScore);SetCursor(CtrlLeft, 14);printf("Life");for (i = 0; i < g_nLife; i++) {SetCursor(CtrlLeft + i, 15);printf("%c", 3);}
}void Check() {isChecking = TRUE;int i, j, k;vector <int> line;for (i = 0; i < GameH; i++) {for (j = 0; j < GameW; j++) {if (! g_nGameBack[i][j])break;}if (j == GameW) {line.push_back(i);}}if (line.size()) {int nCount = 7;while (nCount --) {for (i = 0; i < line.size(); i++) {for (j = 0; j < GameW; j++) {SetBack(j, line[i], nCount&1);}}Sleep(70);}for (i = 0; i < line.size(); i++) {for (j = 0; j < GameW; j++) {g_nGameBack[line[i]][j] = 0;}}for (i = 0; i < GameW; i++) {int next = GameH-1;for (j = GameH-1; j >= 0; j--) {for (k = next; k >= 0; k--) {if (g_nGameBack[k][i]) break;}next = k - 1;BOOL is = (k >= 0);SetBack(i, j, is);g_nGameBack[j][i] = is;}}g_nScore += 2*line.size()-1;SetCursor(CtrlLeft, 12);printf("%d", g_nScore);if ( g_nScore >= g_nDiff * g_nDiff * 10) {if (g_nDiff <= 6)g_nDiff ++;}if ( g_nScore >= 50 * (g_nLife+1)) {if (g_nLife <= 6)g_nLife ++;}}isChecking = FALSE;
}
void SLEEP(int x)
{ clock_t now=clock();while(clock()-now<x);
}
int main() {SLEEP(1000);Block* obj = new Block();Block* buf = new Block();BOOL bCreateNew = FALSE;int nTimer = GetTickCount();int LastKeyDownTime = GetTickCount();GameInit();MissionInit();buf -> bk = xBlock::List[rand() % xBlock::List.size()];while (1) {if (! bCreateNew) {bCreateNew = TRUE;obj -> reset(&buf -> bk);if (g_bGameOver)break;buf -> draw(CtrlLeft - 1, 4);}if (GetTickCount() - nTimer >= SPEED / g_nDiff) {nTimer = GetTickCount();if (! obj -> collide(0, 1))obj -> changepos(0, 1);else {Check();bCreateNew = FALSE;}}if (GetTickCount() - LastKeyDownTime >= 100) {if (FALSE == isChecking) {LastKeyDownTime = GetTickCount();if (GetAsyncKeyState(VK_UP)) {obj -> rotate();}if (GetAsyncKeyState(VK_LEFT)) {obj -> changepos(-1, 0);}if (GetAsyncKeyState(VK_RIGHT)) {obj -> changepos(1, 0);}if (GetAsyncKeyState(VK_DOWN)) {if ( FALSE == obj -> changepos(0, 2) )obj -> changepos(0, 1);}}}}SetCursor(8, 10);printf("Game Over!");SetCursor(0, GameH + 3);while (1) {if (GetAsyncKeyState(VK_ESCAPE))break;}return 0;
}

C++ Tetris俄罗斯方块相关推荐

  1. linux qt 俄罗斯方块,Qt5之QGraphicsItem编写Tetris俄罗斯方块游戏

    背景 使用Qt5.12.9的QGraphicsItem来实现俄罗斯方块,现在是C++版本,下来还会有python版本,以及方便的接口,来接入算法,由机器人玩俄罗斯方块. 思路CustomGraphBa ...

  2. JS实现俄罗斯方块有声游戏Tetris Game JavaScript/TypeScript AudioContext

    Tetris Game / 俄罗斯方块 扫码体验 https://capricorncd.github.io/tetris/dist 游戏截图 键盘操作 Left: ←, Right: →, Rota ...

  3. 500行代码写一个俄罗斯方块游戏

    导读:本文我们要制作一个俄罗斯方块游戏. 01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这 ...

  4. 500 行代码写一个俄罗斯方块游戏

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 导读:本文我们要制作一个俄罗斯方块游戏. 作者 | 派森 ...

  5. Java项目--俄罗斯方块

    Java项目--俄罗斯方块 百度盘链接 链接:http://pan.baidu.com/s/1mhQ9SYc 密码:9ujo 一.心得 二.游戏实例 游戏截图 目录结构 三.代码 1.主界面 Tetr ...

  6. 一个简易的游戏代码_500 行代码写一个俄罗斯方块游戏

    01 俄罗斯方块 Tetris 俄罗斯方块游戏是世界上最流行的游戏之一.是由一名叫Alexey Pajitnov的俄罗斯程序员在1985年制作的,从那时起,这个游戏就风靡了各个游戏平台. 俄罗斯方块归 ...

  7. From Nand to Tetris Week1 超详细2021

    Nand to Tetris Why I want to learn it ​ 一方面是因为自己不仅想学code还想真正接触计算机科学,学习CS的知识.另一方面是因为自己基础薄弱,觉得迟早要学,不如先 ...

  8. 大一暑假结果-俄罗斯方块

    //记得用多字符 #include<iostream> #include<conio.h> #include<time.h> #include<string& ...

  9. 500 行代码写一个俄罗斯方块游戏(附源码)

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 导读:本文我们要制作一个俄罗斯方块游戏. 作者 | 派森学python 来源 | https://segmentfault.com/a/1 ...

最新文章

  1. hive查询where join_Hive系列(4):常用函数where,join
  2. TOJ-1036.Rails STL-栈
  3. Android Fragment 真正的完全解析(下)
  4. sap 里的用户菜单是灰色的,不可用的解决方法
  5. 第7章:Kubernetes存储
  6. 知识图谱 图数据库 推理_图数据库的知识表示与推理
  7. 在javafx中界面主题_最小的JavaFX演示文稿(在JavaFX中)
  8. 东方希望上云 告诉你数字化门槛儿到底有多高?
  9. 7 补充业务_哪些情况可以补充申报?金关账册报核要申报哪些数据?
  10. mysql point WKB格式 php 解析 unpack
  11. Typora 下载方法(windows/ linux)
  12. Python文本处理之按行处理大文件
  13. c语言陈湘骥答案,c语言程序设计教程陈湘骥答案
  14. 线程的终止的4种方式
  15. 平安人寿保险-深圳Java开发工程师社招面试
  16. 酷派大神F1-救砖详细教程! 酷派8297w(大神F1联通版) 恢复官方兼救砖
  17. 关爱中老年健康,践行康养华夏,中老年春晚《康养华夏》栏目启动大会在广州盛大举行
  18. JS 实战: Drag 点击拖曳效果
  19. 【路科V0】systemVerilog基础11——随机变量
  20. ILRuntime学习(之四)

热门文章

  1. 计算机控制系统开环控制有什么特点,自动控制系统基本控制方式?各有什么特点?...
  2. js实现汉字转成拼音
  3. Java第一个程序的相关解释
  4. Chrome插件安装办法【手机端】
  5. LED,LCD,CRT,TFT,TFD,STN显示屏说明
  6. 复变函数知识点整理1-3
  7. Minigui实现半透效果
  8. 微信小程序 9宫格翻牌动画
  9. Python量化交易平台:JQData | API使用文档(转)
  10. 笔记-微信订阅号开发