俄罗斯方块
来源:互联网 发布:mac不能玩qq游戏 编辑:程序博客网 时间:2024/06/05 02:51
这个也没有用到什么特别的技术,就是想法和技巧……
定位光标的函数,这个要查着看一看。
这里写代码片#define WIDTH 12#define HEIGHT 18#define LEVEL 9DWORD level[10] = { 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100 };int data[HEIGHT][WIDTH];int nextData[4][4];int TotalScore = 0;int baseLevel = 0;int addLevel = 0;BOOL bGameOver;struct Location{ int h; int l; Location(){} Location(int hang, int lie) { h = hang; l = lie; }};Location block[7][4][4] = { {//I { Location(1, 0), Location(0, 0), Location(2, 0), Location(3, 0) }, { Location(0, 1), Location(0, 0), Location(0, 2), Location(0, 3) }, { Location(1, 0), Location(0, 0), Location(2, 0), Location(3, 0) }, { Location(0, 1), Location(0, 0), Location(0, 2), Location(0, 3) } }, {//O { Location(0, 0), Location(0, 1), Location(1, 0), Location(1, 1) }, { Location(0, 0), Location(0, 1), Location(1, 0), Location(1, 1) }, { Location(0, 0), Location(0, 1), Location(1, 0), Location(1, 1) }, { Location(0, 0), Location(0, 1), Location(1, 0), Location(1, 1) } }, {//T { Location(0, 1), Location(0, 0), Location(0, 2), Location(1, 1) }, { Location(1, 1), Location(1, 0), Location(0, 1), Location(2, 1) }, { Location(1, 1), Location(1, 0), Location(0, 1), Location(1, 2) }, { Location(1, 0), Location(0, 0), Location(1, 1), Location(2, 0) } }, {//J { Location(1, 1), Location(0, 1), Location(2, 0), Location(2, 1) }, { Location(1, 1), Location(1, 0), Location(0, 0), Location(1, 2) }, { Location(1, 0), Location(0, 1), Location(0, 0), Location(2, 0) }, { Location(0, 1), Location(0, 0), Location(0, 2), Location(1, 2) } }, {//L { Location(1, 0), Location(0, 0), Location(2, 0), Location(2, 1) }, { Location(0, 1), Location(0, 0), Location(0, 2), Location(1, 0) }, { Location(1, 1), Location(0, 1), Location(0, 0), Location(2, 1) }, { Location(1, 1), Location(1, 0), Location(0, 2), Location(1, 2) } }, {//S { Location(0, 1), Location(0, 2), Location(1, 0), Location(1, 1) }, { Location(1, 0), Location(0, 0), Location(1, 1), Location(2, 1) }, { Location(0, 1), Location(0, 2), Location(1, 0), Location(1, 1) }, { Location(1, 0), Location(0, 0), Location(1, 1), Location(2, 1) } }, {//Z { Location(0, 1), Location(0, 0), Location(1, 1), Location(1, 2) }, { Location(1, 1), Location(1, 0), Location(0, 1), Location(2, 0) }, { Location(0, 1), Location(0, 0), Location(1, 1), Location(1, 2) }, { Location(1, 1), Location(1, 0), Location(0, 1), Location(2, 0) } }};Location newBlock[4];Location nextBlock[4];void Init();void PrintData();int GameStart();void UpdateData(Location newLoc);BOOL MoveDown();BOOL MoveLeft();BOOL MoveRight();BOOL ChangeA(int shape, int &state);BOOL ChangeB(int shape, int &state);int GetScore();void RemoveData(int* full, int count);
这里写代码片#include <Windows.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <conio.h>#include "Tetrics.h"int main(){ while (1) { Init(); PrintData(); int result; result = GameStart(); switch (result) { case 0: { system("cls"); printf("Do you want to quit the game?(y/n)"); while (1) { char ch = _getch(); if (ch == 'y') return 0; if (ch == 'n') { break; } } continue; } case -1: { system("cls"); printf("Game Over!\nYour Score:%d\nDo you want to try again?(y/n)", TotalScore); while (1) { char ch = _getch(); if (ch == 'n') return 0; if (ch == 'y') { break; } } continue; } } } return 0;}void Init(){ for (int i = 0; i<HEIGHT; i++) { for (int j = 0; j<WIDTH; j++) { data[i][j] = 0; } } TotalScore = 0; addLevel = 0; bGameOver = FALSE; system("cls"); printf("Please input your start Level(0~9):"); while (1) { char ch = _getche(); if (ch >= '0' && ch <= '9') { baseLevel = ch - 48; break; } else { system("cls"); printf("Wrong Input!\nPlease input your start Level(0~9):"); } } system("cls");}void PrintData(){ COORD coord1 = { 0, 0 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord1); char cNextData[4][5]; for (int i = 0; i<4; i++) { for (int j = 0; j<4; j++) { if (nextData[i][j]) { cNextData[i][j] = 2; } else cNextData[i][j] = ' '; } cNextData[i][4] = '\0'; } cNextData[3][4] = '\0'; char cData[HEIGHT][WIDTH + 3]; for (int i = 0; i<HEIGHT; i++) { cData[i][0] = '.'; for (int j = 0; j<WIDTH; j++) { if (data[i][j] == 1) cData[i][j + 1] = 2; else cData[i][j + 1] = ' '; } cData[i][WIDTH + 1] = '.'; cData[i][WIDTH + 2] = '\n'; } cData[HEIGHT - 1][WIDTH + 2] = '\0'; for (int j = 0; j<WIDTH + 15; j++) printf("."); printf("\n%s\n", cData); for (int j = 0; j<WIDTH + 2; j++) printf("*"); for (int i = 0; i<4; i++) { COORD coord2 = { WIDTH + 2, i + 1 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord2); printf(". %s .", cNextData[i]); } COORD coord3 = { WIDTH + 2, 5 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord3); printf("............."); COORD coord4 = { WIDTH + 2, 7 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord4); printf(" SCORE:%d", TotalScore); COORD coord5 = { WIDTH + 2, 9 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord5); printf(" LEVEL:%d", baseLevel + addLevel>9 ? 9 : baseLevel + addLevel); COORD coord6 = { WIDTH + 2, 11 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord6); printf(" 操作说明"); COORD coord7 = { WIDTH + 2, 12 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord7); printf(" LEFT :A"); COORD coord8 = { WIDTH + 2, 13 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord8); printf(" RIGHT :D"); COORD coord9 = { WIDTH + 2, 14 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord9); printf(" DOWN :S"); COORD coord10 = { WIDTH + 2, 15 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord10); printf(" BOTTOM:W"); COORD coord11 = { WIDTH + 2, 16 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord11); printf(" CHANGE:J&K"); COORD coord12 = { WIDTH + 2, 17 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord12); printf(" QUIT :Q"); COORD coord13 = { WIDTH + 2, 18 }; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord13); printf(" PAUSE :P");}int GameStart(){ //随机产生图形和图形的形态(乘以2防止开始两个方块相同) srand((unsigned)time(NULL) * 2); int nextShape = rand() % 7; srand((unsigned)time(NULL) * 2); int nextState = rand() % 4; //获得方块初始数据 for (int i = 0; i<4; i++) { nextBlock[i] = block[nextShape][nextState][i]; } while (1) { //在出现下一个方块之前判断游戏有没有结束 if (bGameOver) { Sleep(1000); return -1; } //根据现在的分数设定方块下落速度 addLevel = TotalScore / 100; //记录当前的形状和状态 int shape = nextShape; int state = nextState; //随机产生下一个图形和图形的形态 srand((unsigned)GetTickCount()); nextShape = rand() % 7; srand((unsigned)GetTickCount()); nextState = rand() % 4; //获得当前的方块并获得下一个方块初始数据 for (int i = 0; i<4; i++) { newBlock[i] = nextBlock[i]; nextBlock[i] = block[nextShape][nextState][i]; } //图形中心点的初始坐标 Location loc(1, WIDTH / 2); //定位并更新数据 UpdateData(loc); PrintData(); DWORD starttime = 0; DWORD endtime = GetTickCount(); while (1) { if (_kbhit()) { BOOL b = FALSE; BOOL down = TRUE; char ch = _getch(); switch (ch) { case 's': down = b = MoveDown(); break; case 'w': while (down = MoveDown()); break; case 'a': b = MoveLeft(); break; case 'd': b = MoveRight(); break; case 'j': b = ChangeA(shape, state); break; case 'k': b = ChangeB(shape, state); break; case 'q': return 0; case 'p': system("pause"); system("cls"); break; } if (!down) { int score = GetScore(); if (score) TotalScore = TotalScore + 2 * score - 1; PrintData(); break; } if (b) { endtime = GetTickCount(); if (endtime - starttime >= level[baseLevel + addLevel>9 ? 9 : baseLevel + addLevel]) { starttime = endtime; if (MoveDown()) PrintData(); else { int score = GetScore(); if (score) TotalScore = TotalScore + 2 * score - 1; PrintData(); break; } } PrintData(); } }//if (_kbhit()) endtime = GetTickCount(); if (endtime - starttime >= level[baseLevel + addLevel>9 ? 9 : baseLevel + addLevel]) { starttime = endtime; if (MoveDown()) PrintData(); else { int score = GetScore(); if (score) TotalScore = TotalScore + 2 * score - 1; PrintData(); break; } } }//while(1) }//while(1)}void UpdateData(Location newLoc){ int hoffset = newLoc.h - newBlock[0].h; int loffset = newLoc.l - newBlock[0].l; int nexth = 1 - nextBlock[0].h; int nextl = 1 - nextBlock[0].l; for (int i = 0; i<4; i++) for (int j = 0; j<4; j++) { nextData[i][j] = 0; } for (int i = 0; i<4; i++) { newBlock[i].h += hoffset; newBlock[i].l += loffset; data[newBlock[i].h][newBlock[i].l] = 1; nextData[nextBlock[i].h + nexth][nextBlock[i].l + nextl] = 1; }}BOOL MoveDown(){ Location temp[4]; for (int i = 0; i<4; i++) { temp[i].h = newBlock[i].h + 1; temp[i].l = newBlock[i].l; if (temp[i].h >= HEIGHT) return FALSE; } for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 0; } for (int i = 0; i<4; i++) { if (data[temp[i].h][temp[i].l]) { for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 1; } if (newBlock[0].h == 1 && newBlock[0].l == WIDTH / 2) bGameOver = TRUE; return FALSE; } } Location newLoc = temp[0]; UpdateData(newLoc); return TRUE;}BOOL MoveLeft(){ Location temp[4]; for (int i = 0; i<4; i++) { temp[i].h = newBlock[i].h; temp[i].l = newBlock[i].l - 1; if (temp[i].l < 0) return FALSE; } for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 0; } for (int i = 0; i<4; i++) { if (data[temp[i].h][temp[i].l]) { for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 1; } return FALSE; } } Location newLoc = temp[0]; UpdateData(newLoc); return TRUE;}BOOL MoveRight(){ Location temp[4]; for (int i = 0; i<4; i++) { temp[i].h = newBlock[i].h; temp[i].l = newBlock[i].l + 1; if (temp[i].l >= WIDTH) return FALSE; } for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 0; } for (int i = 0; i<4; i++) { if (data[temp[i].h][temp[i].l]) { for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 1; } return FALSE; } } Location newLoc = temp[0]; UpdateData(newLoc); return TRUE;}BOOL ChangeA(int shape, int &state){ Location temp[4]; for (int i = 0; i<4; i++) { temp[i] = block[shape][(state + 1) % 4][i]; } int hoffset = newBlock[0].h - temp[0].h; int loffset = newBlock[0].l - temp[0].l; for (int i = 0; i<4; i++) { temp[i].h += hoffset; temp[i].l += loffset; if (temp[i].h >= HEIGHT || temp[i].l<0 || temp[i].l >= WIDTH) return FALSE; } for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 0; } for (int i = 0; i<4; i++) { if (data[temp[i].h][temp[i].l]) { for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 1; } return FALSE; } } for (int i = 0; i<4; i++) { newBlock[i] = temp[i]; data[newBlock[i].h][newBlock[i].l] = 1; } state++; state %= 4; return TRUE;}BOOL ChangeB(int shape, int &state){ Location temp[4]; for (int i = 0; i<4; i++) { temp[i] = block[shape][(state + 3) % 4][i]; } int hoffset = newBlock[0].h - temp[0].h; int loffset = newBlock[0].l - temp[0].l; for (int i = 0; i<4; i++) { temp[i].h += hoffset; temp[i].l += loffset; if (temp[i].h >= HEIGHT || temp[i].l<0 || temp[i].l >= WIDTH) return FALSE; } for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 0; } for (int i = 0; i<4; i++) { if (data[temp[i].h][temp[i].l]) { for (int i = 0; i<4; i++) { data[newBlock[i].h][newBlock[i].l] = 1; } return FALSE; } } for (int i = 0; i<4; i++) { newBlock[i] = temp[i]; data[newBlock[i].h][newBlock[i].l] = 1; } state += 3; state %= 4; return TRUE;}int GetScore(){ int score = 0; int full[4]; for (int i = 0; i<4; i++) { int h = newBlock[i].h; BOOL same = FALSE; for (int j = 0; j<score; j++) { if (h == full[j]) same = TRUE; } if (same) { continue; } int test = 1; for (int j = 0; j<WIDTH; j++) { test *= data[h][j]; } if (test) { full[score] = h; score++; } } for (int k = 0; k<5; k++) { for (int i = 0; i<score; i++) { for (int j = 0; j<WIDTH; j++) { data[full[i]][j] = k % 2; } } if (score) { PrintData(); Sleep(100); } } Sleep(100); RemoveData(full, score); //PrintData(); return score;}void RemoveData(int *full, int count){ //先从大到小排序 for (int i = 0; i<count - 1; i++) { for (int j = i + 1; j<count; j++) { if (full[i]<full[j]) { int temp = full[i]; full[i] = full[j]; full[j] = temp; } } } for (int i = 0; i<count; i++) { if (i == count - 1) { for (int j = full[i] + i; j>0; j--) { for (int k = 0; k<WIDTH; k++) { data[j][k] = data[j - i - 1][k]; } } } else { for (int j = full[i] - i; j>full[i + 1] - i + 1; j--) { for (int k = 0; k<WIDTH; k++) { data[j][k] = data[j - i - 1][k]; } } } }}
0 0
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块!
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- C语言注释符
- 菜鸟之路-02
- hdu 2711 Lost Cows(单点更新)
- swift课程 02 swift高级
- javaweb 自定义标签
- 俄罗斯方块
- 原码、反码、补码详解
- 写模板--Smarty类的编译功能仿写
- 6个Java项目UML反向工程工具
- 解决os x el capitan proxychains 不能用 (关闭SIP)
- c语言的基础数据类型
- 《剑指Offer》面试题:树中两结点最低公共祖先
- ORACLE CONNECT BY 整理
- IOS开发-C语言基础篇