- 浏览: 37358 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
originwxit:
顶楼主... 哎 人活在这个世界上本来就不是一 ...
做程序员10年有感,程序员必须要懂的---转自java诺曼底_kleen
Author : 周天涯
email : menjitianya2007@163.com
blog : http://www.cppblog.com/menjitianya/
Description : 即兴创作,《C控制台 俄罗斯方块》,欢迎交流与探讨,直接将代码粘贴到VC6.0的环境下即可运行。
← 左移
→ 右移
↓ 加速
↑ 旋转
连续消去1行得1分、2行得3分、3行得5分、4行得7分。
积分达到一定程度,会有换命的活动,命最多6条。
难度会随积分的上升逐渐上升,最多到6的难度。
email : menjitianya2007@163.com
blog : http://www.cppblog.com/menjitianya/
Description : 即兴创作,《C控制台 俄罗斯方块》,欢迎交流与探讨,直接将代码粘贴到VC6.0的环境下即可运行。
← 左移
→ 右移
↓ 加速
↑ 旋转
连续消去1行得1分、2行得3分、3行得5分、4行得7分。
积分达到一定程度,会有换命的活动,命最多6条。
难度会随积分的上升逐渐上升,最多到6的难度。
#include <iostream> #include <windows.h> #include <vector> #include <mmsystem.h> #pragma comment(lib, "winmm.lib") using namespace std; #define GameW 10 #define GameH 20 const int CtrlLeft = GameW*2+4 + 3; 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 = 2; 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", "■"); else printf(" "); } 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); } SetCursor(CtrlLeft-1, 19); printf("by Zty"); SetCursor(CtrlLeft-1, 20); printf("Baidu A*"); } 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; } int main() { 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 >= 1000 / 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); printf("按ESC键退出游戏"); while(1) { if (GetAsyncKeyState(VK_ESCAPE)) break; } return 0; }
发表评论
-
Windows系统下编译连接源代码方法
2011-07-02 11:46 1071Windows系统下编译连接源代码方法: cl -GX tes ... -
吉林大学acm在线评判系统的关键技术
2011-06-05 20:19 1468随着将JOJ的footer版本号 ... -
进制转换问题
2011-04-29 12:28 656十进制转换为任意r进制 输入:n(原始十进制数),r(转换成r ... -
N!阶乘的高效算法
2011-04-29 12:21 9295阶乘递归代码:(教材) #include<stdio ... -
KMP算法
2011-04-29 12:17 655KMP算法 求模式串在原串中的匹配个数或首个匹配的index值 ... -
Fbonacci模板
2011-04-29 12:05 933Fbonacci递归算法:(n最大为100以内) ====== ...
相关推荐
这是一个微信小游戏项目源码,是经典怀旧的俄罗斯方块游戏,适合新手入门参考学习,下面还有↓ ...② 俄罗斯方块-单机游戏-微信小程序项目开发入门https://blog.csdn.net/zs1028/article/details/128383343
俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块游戏--JAVA实现(含双人联机对战).zip 俄罗斯方块...
俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip 俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip 俄罗斯方块游戏-Java-Swing实现.zip俄罗斯方块游戏-Java-Swing实现.zip...
自己暑假做的C#俄罗斯方块--大家帮看下
"俄罗斯方块-shell源码" 指的是使用Shell脚本语言编写的俄罗斯方块游戏的源代码。俄罗斯方块是一款经典的电子游戏,由Alexey Pajitnov于1984年设计,而在这里,开发者用Shell编程语言重新实现了这个游戏。 【描述...
《俄罗斯方块-C#》是针对C#初学者的一个编程实践项目,旨在帮助他们通过实际操作来学习和理解C#语言。俄罗斯方块是一款经典的益智游戏,它的实现涉及到了许多编程基础知识,对于初学者来说,这是一个非常好的学习...
其中,《俄罗斯方块-改进版》正是这样一款在保留经典玩法基础上,通过加入现代游戏元素进而提升玩家体验的优秀作品。在对原始的俄罗斯方块游戏进行深入研究后,开发者团队成功地为其加入了排行榜功能、暂停功能、...
【标题】"蓝光俄罗斯方块-cool"指的是一个基于经典游戏俄罗斯方块的特别版本,具有高清蓝光画质的特色。这个标题暗示了游戏可能具有改进的图形效果,提供更加清晰、色彩鲜明的游戏体验,同时保持了原有的游戏玩法。 ...
《俄罗斯方块-MFC-源码》是一款基于MFC(Microsoft Foundation Classes)框架开发的经典游戏——俄罗斯方块的源代码实现。MFC是微软提供的一个C++类库,用于简化Windows应用程序的开发,它提供了丰富的控件和界面...
《俄罗斯方块-C#编程实例》是一个非常适合C#初学者的项目,旨在通过实现经典游戏“俄罗斯方块”来深入理解和应用C#的基础知识。在这个项目中,你将学习到如何利用C#进行Windows应用程序开发,包括图形用户界面(GUI...
《基于Android平台的Java开发——俄罗斯方块手机游戏详解》 在移动设备的软件开发领域,Android平台以其开源、灵活性和广泛的应用性占据着重要地位。对于计算机科学专业的学生而言,进行一次基于Android的毕业设计...
《俄罗斯方块--源代码--VS6.0》是一个关于经典游戏俄罗斯方块的编程实践项目,使用了Visual Studio 6.0作为开发环境。这个项目对于初学者来说,是理解游戏开发、图形界面设计以及C++编程的一个很好的实例。 在源...
自己写的一个可视化编程环境的一个课程设计,使用WIN32 SDK实现图形界面的俄罗斯方块小游戏,具有开头动画、关卡选择、背景音乐播放、音效播放、加载存档、开始游戏、方块碰撞检测、暂停游戏和恢复游戏、保存功能、...
在这个标题为“j2me俄罗斯方块-手机版”的项目中,开发者利用J2ME技术实现了一个经典游戏——俄罗斯方块的手机版。虽然只有可执行程序而无源代码可供学习,但我们仍能从中探讨J2ME在游戏开发中的应用以及俄罗斯方块...
Java 游戏开发是IT行业中一个有趣的领域,尤其对于初学者来说,通过创建经典游戏如俄罗斯方块,能够深入理解编程概念和游戏逻辑。在这个基于Java的简单基础版俄罗斯方块课程设计中,我们将探讨一些关键知识点,这些...
【俄罗斯方块】是一款经典的电子游戏,其设计灵感源自俄罗斯科学家阿列克谢·帕基特诺夫在1984年所创造。这款游戏的基本原理是不同形状的方块(通常由四个单元格组成)从屏幕顶部连续下落,玩家需要通过旋转和横向...
《俄罗斯方块》是一款经典的电子游戏,自1984年首次发布以来,因其简单易上手、富有挑战性而广受欢迎。在这个基于Java的版本中,我们可以深入学习到一些核心的编程概念和技术,特别是在游戏开发领域。以下是相关知识...
《俄罗斯方块-简陋版》是一款基于C#编程语言开发的小型游戏,它利用了Windows Forms(WINFORM)的基本元素来实现经典游戏——俄罗斯方块的玩法。在这个项目中,开发者显然正在学习XNA框架,尽管游戏当前还未移植到...
《俄罗斯方块——C++与WinAPI实现》 在计算机编程的世界里,经典游戏的重制和实现一直是学习新技能的热门课题。这次我们要探讨的是一个使用C++语言和Windows API(Application Programming Interface)编写的...
【标题】: "基于FPGA的俄罗斯方块-VGA显示" 是一个项目,它利用了现场可编程门阵列(FPGA)技术来实现经典的电子游戏——俄罗斯方块的显示功能,通过VGA(视频图形阵列)接口在显示器上呈现游戏画面。这个项目涵盖了...