【C++教程】制作俄罗斯方块小游戏

所需工具:

聪明的大脑

勤劳的双手

 

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究。

 

教程如下:

操作说明:

D F:左右旋转
J L:左右移动
E(一堆键都行): 加快下落速度
空格: 开始游戏 与 一落到底

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <windows.h>
#include <ctime>
#include <conio.h>
#include <iostream>
using namespace std;
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define inf 2147483647
struct type_block
{
int a[10][10];
int color;
int size;
}now, nextA, nextB, nextC, hold;
int sblock[20][10][10] = {{{7, 0, 0, 0}, {0, 0, 1, 1}, {0, 1, 1, 0}, {0, 0, 0, 0}},
{{8, 0, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 0}},
{{9, 0, 0, 0}, {1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{10, 0, 0, 0}, {0, 0, 0, 1}, {0, 1, 1, 1}, {0, 0, 0, 0}},
{{13, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 1}, {0, 0, 0, 0}},
{{5, 0, 0, 0}, {0, 1, 1, 0}, {0, 1, 1, 0}, {0, 0, 0, 0}},
{{16, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 1}, {0, 0, 0, 0}},
{{0, 0, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}},
{{1, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 0}, {0, 1, 0, 0}},
{{2, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}},
{{11, 0, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 0}},
{{12, 0, 0, 0}, {0, 1, 1, 1}, {0, 1, 0, 0}, {0, 0, 0, 0}}, //11
{{3, 0, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}},
{{14, 1, 1, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {0, 0, 0, 0}},
{{15, 1, 1, 1}, {0, 0, 0, 1}, {0, 0, 0, 0}, {0, 0, 0, 0}},
{{4, 0, 0, 1}, {0, 0, 0, 1}, {0, 0, 1, 1}, {0, 0, 0, 0}},
{{17, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 1, 0}},
{{18, 0, 0, 0}, {0, 0, 0, 0}, {0, 1, 1, 1}, {0, 0, 1, 0}}, //17
{{6, 0, 0, 0}, {0, 0, 1, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}}};
HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE);
int map[22][12];
int mode = 1;
int fraction = 0;
int positionX, positionY;
bool locked;
int keytime = 100000000;
bool keytimeflag;
int sleeptime = 0;
bool holdflag = 1;
int passcondition = 200;
int addlinetime = 10000, addlineflag;
int locktime = 1000;
int keydownflag;
int xray = 0;
int firstwin = 1;
int exfraction = 0;
int exgamestarttime;
int blind = 0;
int lockdelay = 300;
int clockms, stclockms;
double blockpersecond, blockperminute;
int blocknum;
void gotoxy (int x, int y);
void welcomepage ();
void reset ();
void choosedifficulty ();
void ready_go ();
void updatedata ();
void updatetime ();
type_block roundblock ();
void printblock (type_block m_block, int x, int y);
void clearblock (type_block m_block, int x, int y);
int checkblock (type_block m_block, int x, int y);
type_block myup (type_block m_block);
type_block mydown (type_block m_block);
void checkkey ();
void checkline ();
void addline ();
void gameover ();
void win ();
void easy_extra_game ();
void master_extra_game ();
void shirase_extra_game ();
int main()
{
welcomepage ();
reset ();
choosedifficulty();
ready_go ();
clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock();
printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
positionX = 0; positionY = 4; locked = 0;
keytime = clock(); keytimeflag = 1;
addlineflag = clock (); stclockms = clock ();
while (1)
{
updatedata (); updatetime ();
if (locked)
{
++blocknum;
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
now.color = -xray * 2;
printblock (now, positionY * 2 + 8, positionX + 1);
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
if (!(i + j))
continue;
if (now.a[i][j])
map[positionX + i][positionY + j] = 1;
}
}
checkline ();
Sleep (lockdelay);
updatetime ();
if (blind)
clearblock (now, positionY * 2 + 8, positionX + 1);
locked = 0;
clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock();
printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
positionX = 0; positionY = 4;
if (!checkblock (now, positionX, positionY))
gameover ();
if (fraction % 100 != 99 && fraction != passcondition)
++fraction;
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
gotoxy (56, 10);
printf ("%4d", fraction);
gotoxy (57, 11);
printf ("---");
gotoxy (56, 12);
int lssc = fraction % 100 ? (fraction / 100 + 1) * 100 : fraction;
if (mode == 1 && lssc >= 200) lssc = 200;
if (mode == 2 && lssc >= 999) lssc = 900;
if (mode == 3 && lssc >= 1300) lssc = 1300;
printf ("%4d", lssc);
keytime = clock(); holdflag = 1;
if (clock () - addlineflag > addlinetime)
{
addlineflag = clock ();
addline ();
}
keydownflag = 0;
}
if (checkblock (now, positionX + 1, positionY))
while (checkblock (now, positionX + 1, positionY))
{
++positionX; updatetime ();
if (sleeptime)
{
printblock (now, positionY * 2 + 8, positionX + 1);
int sttime = clock (), timeover;
while ((timeover = (clock () - sttime < sleeptime)) && !kbhit());
clearblock (now, positionY * 2 + 8, positionX + 1);
if (timeover)
checkkey ();
}
checkkey ();
}
printblock (now, positionY * 2 + 8, positionX + 1);
Sleep (100);
clearblock (now, positionY * 2 + 8, positionX + 1);
checkkey ();
}
}
void gotoxy (int x, int y)
{
COORD pos;
pos.X = x; pos.Y = y;
SetConsoleCursorPosition (hOut, pos);
}
void welcomepage ()
{
puts (" ");
puts (" ■■■■■■■■■■ ");
puts (" ■■■■■■■■■■ ");
puts (" ■■ ");
puts (" ■■ ");
puts (" ■■ ");
puts (" ■■ ■■■■ ■ ■ ■ ■■■ ");
puts (" ■■ ■ ■ ■■■■ ■ ■■■ ■ ■ ");
puts (" ■■ ■■■■ ■ ■■ ■ ■ ");
puts (" ■■ ■ ■ ■ ■ ■■■ ");
puts (" ■■ ■■■■ ■ ■ ■ ■ ");
puts (" ■ ");
puts (" ■■■■ ");
puts (" ");
puts (" ------------------------------------------------------------------ ");
puts (" CHAMPION ");
puts (" ");
puts (" ");
puts (" ");
puts (" ");
puts (" ");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
int modnum = 0;
while (1)
{
gotoxy (22, 20);
if (modnum)
puts ("PUSH START BUTTOM");
else
puts (" ");
int sttime = clock (), timeover;
while ((timeover = (clock () - sttime < 700)) && !kbhit());
if (timeover)
{
if (_getch () == ' ')
break;
}
modnum ^= 1;
}
gotoxy (0, 0);
for (int i = 1; i <= 25; ++i)
puts (" ");
gotoxy (0, 0);
}
void reset ()
{
srand (time (0));
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
puts ("");
puts (" ■■■■■■■■■■■■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■■■■■■■■■■■■");
nextA = roundblock (); nextB = roundblock (); nextC = roundblock ();
for (int i = 34; i <= 34 + nextA.size; ++i)
{
gotoxy (i, 4);
for (int j = 4; j <= 4 + nextA.size; ++j)
printf (" ");
}
printblock (nextA, 34, 4);
for (int i = 38 + nextA.size; i <= 38 + nextA.size + nextB.size; ++i)
{
gotoxy (i, 4);
for (int j = 4; j <= 4 + nextB.size; ++j)
printf (" ");
}
printblock (nextB, 38 + nextA.size, 4);
for (int i = 42 + nextA.size + nextB.size; i <= 42 + nextA.size + nextB.size + nextC.size; ++i)
{
gotoxy (i, 4);
for (int j = 4; j <= 4 + nextC.size; ++j)
printf (" ");
}
printblock (nextC, 42 + nextA.size + nextB.size, 4);
for (int i = 1; i <= 20; ++i)
map[i][0] = map[i][11] = 1;
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo (hOut, &CursorInfo);
CursorInfo.bVisible = 0;
SetConsoleCursorInfo (hOut, &CursorInfo);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
gotoxy (56, 10);
printf ("%4d", fraction);
gotoxy (57, 11);
printf ("---");
gotoxy (56, 12);
if (fraction)
printf ("%4d", fraction % 100 ? (fraction / 100 + 1) * 100 : fraction);
else
printf (" 100");
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
gotoxy (45, 20);
printf ("00:00:00");
}
void choosedifficulty ()
{
while (1)
{
gotoxy (0, 0);
switch (mode)
{
case 1:
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
puts ("");
puts (" ■■■■■■■■■■■■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■■■■■■■■■■■■");
gotoxy (18, 9);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
puts (" EASY ");
gotoxy (10, 16);
printf ("慢速的经典俄罗斯");
gotoxy (10, 17);
printf ("方块,适合初学者.");
break;
case 2:
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
puts ("");
puts (" ■■■■■■■■■■■■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■■■■■■■■■■■■");
gotoxy (17, 9);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
puts ("MASTER ");
gotoxy (10, 16);
printf ("中速的街机俄罗斯");
gotoxy (10, 17);
printf ("方块,适合中级者.");
break;
case 3:
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
puts ("");
puts (" ■■■■■■■■■■■■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■ ■");
puts (" ■■■■■■■■■■■■");
gotoxy (16, 9);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
puts ("SHIRASE");
gotoxy (10, 16);
printf ("高速俄罗斯方块,");
gotoxy (10, 17);
printf ("挑战速度的极限.");
break;
}
char key = _getch ();
if (key == 'i' && mode != 1)
--mode;
if (key == 'k' && mode != 3)
++mode;
gotoxy (10, 16);
printf (" ");
gotoxy (10, 17);
printf (" ");
if (key == ' ')
break;
}
gotoxy (16, 9);
printf (" ");
}
void ready_go ()
{
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
Sleep (1000);
gotoxy (18, 8);
puts ("READY");
Sleep (800);
gotoxy (18, 8);
puts (" GO! ");
Sleep (800);
gotoxy (18, 8);
puts (" ");
}
void updatedata ()
{
switch (mode)
{
case 1:
addlinetime = inf; lockdelay = 300;
if (fraction >= 0)
{
sleeptime = 2000 - fraction * 5;
locktime = 800;
}
else if (fraction >= 100)
{
sleeptime = 1000 - fraction * 5 / 2;
locktime = 700;
}
if (fraction >= 200)
win ();
break;
case 2:
addlinetime = inf; lockdelay = 300;
if (fraction >= 0)
{
sleeptime = 1000 - fraction * 3;
locktime = 700;
}
if (fraction >= 100)
{
sleeptime = 1000 - fraction * 3;
locktime = 600;
}
if (fraction >= 200)
{
sleeptime = 1000 - fraction * 3;
locktime = 500;
if (fraction >= 300)
locktime = 700;
else if (fraction >= 400)
locktime = 600;
}
if (fraction >= 999)
win ();
break;
case 3:
addlinetime = inf; lockdelay = 300 - fraction / 400 * 50; sleeptime = 0;
locktime = 240 - fraction / 300 * 40;
if (fraction >= 600)
addlinetime = 10000;
if (fraction >= 800)
addlinetime = 7000;
if (fraction >= 1000)
{
addlinetime = inf;
xray = 1;
}
if (fraction >= 1300)
win ();
}
}
void updatetime ()
{
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
gotoxy (45, 20); clockms = clock () - stclockms;
printf ("%02d:%02d:%02d", clockms / 60000 % 100, clockms / 1000 % 60, clockms % 1000 / 10);
}
type_block roundblock ()
{
type_block c;
int kind = rand () % 7;
while (kind < 2 && fraction <= 6)
kind = rand () % 7;
c.size = 4; c.color = kind + 1;
if (xray) c.color = -2;
for (int i = 0; i < c.size; ++i)
for (int j = 0; j < c.size; ++j)
c.a[i][j] = sblock[kind][i][j];
return c;
}
void printblock (type_block m_block, int x, int y)
{
switch (m_block.color)
{
case 1:
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case 2:
SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
case 3:
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case 4:
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_RED);
break;
case 5:
SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case 6:
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
case 7:
SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_BLUE);
break;
case -1:
SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED);
break;
case -2:
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
break;
default:
SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
}
for (int i = 0; i < m_block.size; ++i)
{
for (int j = 0 + !i; j < m_block.size; ++j)
if (m_block.a[i][j])
{
gotoxy (x + j * 2, y + i);
if (xray)
puts ("[]");
else
puts ("■");
}
}
}
void clearblock (type_block m_block, int x, int y)
{
for (int i = 0; i < m_block.size; ++i)
{
for (int j = 0 + !i; j < m_block.size; ++j)
if (m_block.a[i][j])
{
gotoxy (x + j * 2, y + i);
puts (" ");
}
}
}
int checkblock (type_block m_block, int x, int y)
{
for (int i = 0; i < m_block.size; ++i)
for (int j = 0; j < m_block.size; ++j)
{
if (!(i + j))
continue;
if (m_block.a[i][j] && (map[x + i][y + j] || x + i > 20 || y + j < 1 || y + j > 10))
return 0;
}
return 1;
}
type_block myup (type_block m_block)
{
type_block c;
int kind = m_block.a[0][0];
for (int i = 0; i < m_block.size; ++i)
for (int j = 0; j < m_block.size; ++j)
c.a[i][j] = sblock[kind][i][j];
c.size = m_block.size; c.color = m_block.color;
return c;
}
type_block mydown (type_block m_block)
{
type_block c = m_block;
for (int t = 1; t <= 3; ++t)
c = myup (c);
return c;
}
void checkkey ()
{
if (checkblock (now, positionX + 1, positionY) && keydownflag < (sleeptime > 100 ? 0 : 4))
{
++keydownflag;
if (KEY_DOWN('J'))
{
if (checkblock (now, positionX, positionY - 1))
--positionY;
}
if (KEY_DOWN('L'))
{
if (checkblock (now, positionX, positionY + 1))
++positionY;
}
}
if (kbhit())
{
keytime = clock ();
char key = _getch();
if (key == 'j')
{
if (checkblock (now, positionX, positionY - 1))
--positionY;
}
if (key == 'l')
{
if (checkblock (now, positionX, positionY + 1))
++positionY;
}
if (key == 's')
{
if (!holdflag)
return;
if (hold.a[0][0])
{
clearblock (hold, 60, 5);
type_block t = now; now = hold; hold = t;
printblock (hold, 60, 5);
positionX = 0; positionY = 4; keytime = clock();
holdflag = 0;
}
else
{
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
gotoxy (60, 4);
puts ("Hold");
clearblock (hold, 60, 5);
hold = now;
printblock (hold, 60, 5);
clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
now = nextA; nextA = nextB; nextB = nextC; nextC = roundblock();
printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
positionX = 0; positionY = 4; keytime = clock();
}
}
if (key == 'f')
{
type_block newnow = myup (now);
if (checkblock (newnow, positionX, positionY))
now = newnow;
else if (checkblock (newnow, positionX - 1, positionY))
{
now = newnow;
--positionX;
}
else if (checkblock (newnow, positionX - 2, positionY))
{
now = newnow;
positionX -= 2;
}
else if (checkblock (newnow, positionX, positionY - 1))
{
now = newnow;
--positionY;
}
else if (checkblock (newnow, positionX, positionY + 1))
{
now = newnow;
++positionY;
}
}
if (key == 'd')
{
type_block newnow = mydown (now);
if (checkblock (newnow, positionX, positionY))
now = newnow;
else if (checkblock (newnow, positionX - 1, positionY))
{
now = newnow;
--positionX;
}
else if (checkblock (newnow, positionX - 2, positionY))
{
now = newnow;
positionX -= 2;
}
else if (checkblock (newnow, positionX, positionY - 1))
{
now = newnow;
--positionY;
}
else if (checkblock (newnow, positionX, positionY + 1))
{
now = newnow;
++positionY;
}
}
if (KEY_DOWN(' '))
{
for (int i = 1; i <= 20; ++i)
if (checkblock (now, positionX + 1, positionY))
++positionX;
locked = 1;
}
}
if (clock() - keytime > locktime && !checkblock (now, positionX + 1, positionY))
locked = 1;
}
void checkline ()
{
bool tf = 0;
for (int i = 1; i <= 20; ++i)
{
int x = 0;
for (int j = 1; j <= 10; ++j)
if (map[i][j])
++x;
if (x == 10)
{
tf = 1;
for (int k = i; k >= 1; --k)
for (int l = 1; l <= 10; ++l)
map[k][l] = map[k - 1][l];
SetConsoleTextAttribute (hOut, FOREGROUND_RED);
gotoxy (10, i + 1);
for (int k = 1; k <= 10; ++k)
{
map[1][k] = 0;
printf ("..");
}
if (firstwin)
++fraction;
}
}
if (tf)
{
Sleep (100);
if (xray)
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
else
SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
for (int i = 1; i <= 20; ++i)
{
gotoxy (10, i + 1);
for (int j = 1; j <= 10; ++j)
if (map[i][j] && !blind)
if (xray)
printf ("[]");
else
printf ("■");
else
printf (" ");
}
}
}
void addline ()
{
for (int i = 1; i <= 19; ++i)
for (int j = 1; j <= 10; ++j)
map[i][j] = map[i + 1][j];
for (int i = 1; i <= 10; ++i)
map[20][i] = map[19][i];
if (xray)
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
else
SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
for (int i = 1; i <= 20; ++i)
{
gotoxy (10, i + 1);
for (int j = 1; j <= 10; ++j)
if (map[i][j] && !(i != 1 && blind))
if (xray)
printf ("[]");
else
printf ("■");
else
printf (" ");
}
if (blind)
{
Sleep (200);
gotoxy (10, 2);
printf (" ");
}
}
void gameover ()
{
clockms = clock () - stclockms;
blockpersecond = (double) blocknum / clockms * 1000; blockperminute = blockpersecond * 60.0;
for (int i = 20; i >= 1; --i)
{
for (int j = 1; j <= 10; ++j)
{
gotoxy (j * 2 + 8, i + 1);
puts (" ");
}
Sleep (150);
}
Sleep (2000);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
gotoxy (14, 10);
puts (" 暂定段位");
gotoxy (13, 19);
printf ("BPS %lf", blockpersecond);
gotoxy (13, 20);
printf ("BPM %lf", blockperminute);
for (int i = 1; i <= 29; ++i)
{
if (i % 2)
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
else
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
gotoxy (19, 13);
switch (mode)
{
case 1:
gotoxy (18, 13);
printf ("H%d", fraction + exfraction * 10 + rand () % 10);
break;
case 2:
if (fraction >= 999)
printf ("S13");
else if (fraction >= 950)
printf ("S12");
else if (fraction >= 900)
printf ("S11");
else if (fraction >= 850)
printf ("S10");
else if (fraction >= 800)
printf ("S9");
else if (fraction >= 750)
printf ("S8");
else if (fraction >= 700)
printf ("S7");
else if (fraction >= 650)
printf ("S6");
else if (fraction >= 600)
printf ("S5");
else if (fraction >= 550)
printf ("S4");
else if (fraction >= 500)
printf ("S3");
else if (fraction >= 450)
printf ("S2");
else if (fraction >= 400)
printf ("S1");
else if (fraction >= 350)
printf (" 1");
else if (fraction >= 300)
printf (" 2");
else if (fraction >= 250)
printf (" 3");
else if (fraction >= 200)
printf (" 4");
else if (fraction >= 150)
printf (" 5");
else if (fraction >= 100)
printf (" 6");
else if (fraction >= 50)
printf (" 7");
else printf (" 8");
break;
case 3:
if (fraction >= 1300)
printf ("S13");
else if (fraction >= 1200)
printf ("S12");
else if (fraction >= 1100)
printf ("S11");
else if (fraction >= 1000)
printf ("S10");
else if (fraction >= 900)
printf ("S9");
else if (fraction >= 800)
printf ("S8");
else if (fraction >= 700)
printf ("S7");
else if (fraction >= 600)
printf ("S6");
else if (fraction >= 500)
printf ("S5");
else if (fraction >= 400)
printf ("S4");
else if (fraction >= 300)
printf ("S3");
else if (fraction >= 200)
printf ("S2");
else if (fraction >= 100)
printf ("S1");
else
{
gotoxy (15, 13);
printf ("Let's go");
gotoxy (15, 14);
printf ("better");
gotoxy (15, 15);
printf ("next time!");
}
break;
}
Sleep (120);
}
Sleep (2000);
system ("pause>nul");
exit (0);
}
void win ()
{
if (firstwin)
{
for (int i = 20; i >= 1; --i)
{
for (int j = 1; j <= 10; ++j)
{
gotoxy (j * 2 + 8, i + 1);
puts (" ");
map[i][j] = 0;
}
Sleep (150);
}
Sleep (1000);
firstwin = 0;
switch (mode)
{
case 1:
easy_extra_game ();
break;
case 2:
master_extra_game ();
break;
case 3:
shirase_extra_game ();
break;
default:
break;
}
return;
}
gotoxy (15, 9);
switch (mode)
{
case 1:
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
puts (" EASY MODE ");
break;
case 2:
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
puts (" MASTER MODE");
break;
case 3:
SetConsoleTextAttribute(hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
puts ("SHIRASE MODE");
break;
}
gotoxy (15, 10);
puts (" ALL CLEAR ");
Sleep (5000);
gotoxy (15, 9);
puts (" ");
gotoxy (15, 10);
puts (" ");
gameover ();
}
void easy_extra_game ()
{
sleeptime = 0; exgamestarttime = clock (); locktime = 300; keytime = clock ();
if (mode == 3)
locktime = 200;
while (clock () - exgamestarttime < 40000)
{
if (locked)
{
++exfraction;
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
now.color = -xray * 2;
printblock (now, positionY * 2 + 8, positionX + 1);
for (int i = 0; i < 4; ++i)
{
for (int j = 0; j < 4; ++j)
{
if (!(i + j))
continue;
if (now.a[i][j])
map[positionX + i][positionY + j] = 1;
}
}
checkline ();
Sleep (lockdelay);
if (blind)
clearblock (now, positionY * 2 + 8, positionX + 1);
locked = 0;
clearblock (nextA, 34, 4); clearblock (nextB, 38 + nextA.size, 4); clearblock (nextC, 42 + nextA.size + nextB.size, 4);
now = nextA; nextA = nextB; nextB = nextC;
if (mode == 3 && !rand () % 4)
xray = 0;
nextC = roundblock();
xray = 1;
printblock (nextA, 34, 4); printblock (nextB, 38 + nextA.size, 4); printblock (nextC, 42 + nextA.size + nextB.size, 4);
positionX = 0; positionY = 4;
if (!checkblock (now, positionX, positionY))
gameover ();
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
gotoxy (56, 10);
printf ("%4d", fraction);
gotoxy (57, 11);
printf ("---");
gotoxy (56, 12);
int lssc = fraction % 100 ? (fraction / 100 + 1) * 100 : fraction;
if (mode == 1 && lssc >= 200) lssc = 200;
if (mode == 2 && lssc >= 999) lssc = 900;
if (mode == 3 && lssc >= 1300) lssc = 1300;
printf ("%4d", lssc);
keytime = clock(); holdflag = 1;
if (clock () - addlineflag > addlinetime)
{
addlineflag = clock ();
addline ();
}
keydownflag = 0;
}
if (checkblock (now, positionX + 1, positionY))
while (checkblock (now, positionX + 1, positionY))
{
++positionX;
if (sleeptime)
{
printblock (now, positionY * 2 + 8, positionX + 1);
int sttime = clock (), timeover;
while ((timeover = (clock () - sttime < sleeptime)) && !kbhit());
clearblock (now, positionY * 2 + 8, positionX + 1);
if (timeover)
checkkey ();
}
checkkey ();
}
printblock (now, positionY * 2 + 8, positionX + 1);
Sleep (100);
clearblock (now, positionY * 2 + 8, positionX + 1);
checkkey ();
}
if (xray)
SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
else
SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
for (int i = 1; i <= 20; ++i)
{
gotoxy (10, i + 1);
for (int j = 1; j <= 10; ++j)
if (map[i][j])
if (xray)
printf ("[]");
else
printf ("■");
else
printf (" ");
}
win ();
}
void master_extra_game ()
{
blind = 1;
easy_extra_game ();
}
void shirase_extra_game ()
{
blind = 1;
easy_extra_game ();
}

标签

发表评论