简介
高一时写的、继推箱子之后的第二个C++小游戏
代码
#include <iostream>
#include <sstream>
#include <fstream>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>
#define TIMEUSUALLY500 100
using namespace std;
string o(int i)
{
switch (i)
{
case 0:return " ";
case 1:return "▇";
case 2:return "□";
}
}
char f(int i)
{
switch (i)
{
case 0:return '0';
case 1:return '1';
case 2:return '2';
case 3:return '3';
case 4:return '4';
case 5:return '5';
case -1:return ' ';
case 20:return 'n';
case 21:return 'y';
}
}
void drawmap(int H, int L, int x, int y, int maptest[][100], int mapobj[][6])
{
stringstream ss;
for (int i = 0; i <= H + 1; i++)
{
for (int j = 0; j <= L + 1; j++)
{
if (i - x <= 4 && i - x >= 1 && j - y >= 1 && j - y <= 4)
{
if (mapobj[i - x][j - y] == 2)
ss << o(2);
else
ss << o(maptest[i][j]);
}
else
{
ss << o(maptest[i][j]);
}
}
ss << endl;
}
string out = ss.str();
system("cls"); //删去此行可以防画面抖动
cout << out;
}
void drawobj(int mapobj[][6])
{
for (int i = 0; i <= 5; i++)
{
for (int j = 0; j <= 5; j++)
{
//cout<<o(mapobj[i][j]);
cout << f(mapobj[i][j]);
}
cout << endl;
}
}
void objfootfind(int mapobj[][6])
{
for (int j = 1; j <= 4; j++)
{
mapobj[5][j] = -1;
for (int i = 4; i >= 1; i--)
{
if (mapobj[i][j] == 2)
{
mapobj[5][j] = i + 1;
break;
}
}
}
for (int j = 1; j <= 4; j++)
{
mapobj[0][j] = -1;
for (int i = 1; i <= 4; i++)
{
if (mapobj[i][j] == 2)
{
mapobj[0][j] = i - 1;
break;
}
}
}
for (int i = 1; i <= 4; i++)
{
mapobj[i][0] = -1;
for (int j = 1; j <= 4; j++)
{
if (mapobj[i][j] == 2)
{
mapobj[i][0] = j - 1;
break;
}
}
}
for (int i = 1; i <= 4; i++)
{
mapobj[i][5] = -1;
for (int j = 4; j >= 1; j--)
{
if (mapobj[i][j] == 2)
{
mapobj[i][5] = j + 1;
break;
}
}
}
}
void objchange(int mapobj[][6])
{
srand((int)time(0));
int type = rand() % 7 + 1;
for (int i = 0; i <= 5; i++)
{
for (int j = 0; j <= 5; j++)
{
mapobj[i][j] = 0;
}
}
// cout << type << endl;
int freedom = 0;
switch (type)
{
case 1:mapobj[1][3] = 2, mapobj[2][3] = 2, mapobj[3][3] = 2, mapobj[4][3] = 2, freedom = 20; break;
case 2:mapobj[2][2] = 2, mapobj[2][3] = 2, mapobj[3][2] = 2, mapobj[3][3] = 2, freedom = 1; break;
case 3:mapobj[2][2] = 2, mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[3][4] = 2, freedom = 4; break;
case 4:mapobj[3][1] = 2, mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[2][3] = 2, freedom = 4; break;
case 5:mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[2][3] = 2, mapobj[2][4] = 2, freedom = 20; break;
case 6:mapobj[2][2] = 2, mapobj[2][3] = 2, mapobj[3][3] = 2, mapobj[3][4] = 2, freedom = 20; break;
case 7:mapobj[3][2] = 2, mapobj[3][3] = 2, mapobj[3][4] = 2, mapobj[2][3] = 2, freedom = 4; break;
}
mapobj[0][0] = freedom;
mapobj[0][5] = freedom;
mapobj[5][0] = freedom;
mapobj[5][5] = freedom;
objfootfind(mapobj);
}
void objtwist(int mapobj[][6], int mapobj2[][6])
{
int freedom = mapobj[0][0];
int time = 0;
if (freedom == 1);
else if (freedom / 10 == 2)
{
if (freedom % 10 == 1)
{
time = 3;
freedom = 20;
}
else if (freedom % 10 == 0)
{
time = 1;
freedom = 21;
}
}
else if (freedom == 4)
{
time = 1;
}
int mapobj3[6][6];
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
mapobj3[i][j] = mapobj[i][j];
mapobj2[i][j] = mapobj[i][j];
}
}
for (; time >= 1; time--)
{
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
mapobj2[5 - j][i] = mapobj3[i][j];
}
}
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
mapobj3[i][j] = mapobj2[i][j];
}
}
}
mapobj2[0][0] = freedom;
mapobj2[0][5] = freedom;
mapobj2[5][0] = freedom;
mapobj2[5][5] = freedom;
objfootfind(mapobj2);
}
void objmove(char dir, int& x, int& y, int mapobj[][6], int maptest[][100])
{
if (dir == 'a')
{
bool mov = 1;
for (int i = 1; i <= 4; i++)
{
if (mapobj[i][0] != -1)
{
if (maptest[i + x][mapobj[i][0] + y] != 2 && maptest[i + x][mapobj[i][0] + y] != 1)
{
mov = 1;
}
else
{
mov = 0;
break;
}
}
}
if (mov == 1)
{
y--;
}
}
if (dir == 'd')
{
bool mov = 1;
for (int i = 1; i <= 4; i++)
{
if (mapobj[i][5] != -1)
{
if (maptest[i + x][mapobj[i][5] + y] != 2 && maptest[i + x][mapobj[i][5] + y] != 1)
{
mov = 1;
}
else
{
mov = 0;
break;
}
}
}
if (mov == 1)
{
y++;
}
}
if (dir == 'w')
{
int mapobj2[6][6];
objtwist(mapobj, mapobj2);
bool mov = 1;
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
if (mapobj2[i][j] == 2)
{
if (maptest[x + i][y + j] == 2 || maptest[x + i][y + j] == 1)
{
mov = 0;
break;
}
}
}
if (mov == 0)
break;
}
if (mov == 1)
{
for (int i = 0; i <= 5; i++)
{
for (int j = 0; j <= 5; j++)
{
mapobj[i][j] = mapobj2[i][j];
}
}
}
}
}
void dirread(int& x, int& y, int mapobj[][6], int maptest[][100])
{
int t1 = clock();
int t2 = clock();
while (t2 - t1 <= TIMEUSUALLY500 && x >= 1)
{
if (_kbhit() != 0)
{
char dir = _getch();
objmove(dir, x, y, mapobj, maptest);
}
t2 = clock();
}
}
int objdown(int& x, int& y, int mapobj[][6], int maptest[][100])
{
bool down = 1;
if (x >= 0)
{
for (int i = 1; i <= 4; i++)
{
if (mapobj[5][i] != -1)
{
if (maptest[mapobj[5][i] + x][i + y] != 2 && maptest[mapobj[5][i] + x][i + y] != 1)
{
down = 1;
}
else
{
down = 0;
break;
}
}
}
}
if (down == 1)
{
x++;
return 1;
}
else
{
return 0;
}
}
bool mapnext(int H, int L, int& x, int& y, int next, int maptest[][100], int mapobj[][6])
{
if (next == 0)
{
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
if (mapobj[i][j] == 2)
{
maptest[x + i][y + j] = mapobj[i][j];
}
}
}
x = 0;
y = L / 2 - 2;
// cout << x << " " << y << endl;
objchange(mapobj);
for (int i0 = H; i0 >= 1; i0--)
{
int eat;
for (int j = 1; j <= L; j++)
{
if (maptest[i0][j] == 2)
{
eat = i0;
}
else
{
eat = 0;
break;
}
}
if (eat > 0)
{
for (int i = eat; i > 1; i--)
{
for (int j = 1; j <= L; j++)
{
maptest[i][j] = maptest[i - 1][j];
}
}
i0 = i0 + 1;
}
}
bool mov = 1;
for (int i = 1; i <= 4; i++)
{
for (int j = 1; j <= 4; j++)
{
if (mapobj[i][j] == 2)
{
if (maptest[x + i][y + j] == 2 || maptest[x + i][y + j] == 1)
{
mov = 0;
break;
}
}
}
if (mov == 0)
break;
}
if (mov == 0)
return 1;
}
return 0;
}
void gamemain()
{
int maptest[100][100];
int H = 30, L = 10;
int mapobj[6][6];
int x = 0, y = L / 2 - 2;
{//maptest初始程序
for (int i = 0; i <= H + 1; i++)
{
for (int j = 0; j <= L + 1; j++)
{
maptest[i][j] = 0;
}
}
for (int i = 0; i <= L + 1; i++)
{
maptest[0][i] = 1;
maptest[H + 1][i] = 1;
}
for (int j = 0; j <= H + 1; j++)
{
maptest[j][0] = 1;
maptest[j][L + 1] = 1;
}
drawmap(H, L, x, y, maptest, mapobj);
}
objchange(mapobj);
for (;;)
{//出物块
int next = objdown(x, y, mapobj, maptest);
int die=mapnext(H, L, x, y, next, maptest, mapobj);
if (die == 1)
return;
drawmap(H, L, x, y, maptest, mapobj);
dirread(x, y, mapobj, maptest);
}
}
void findwrong()
{
for (;;)
{
int mapobj[6][6];
objchange(mapobj);
drawobj(mapobj);
cout << endl;
int mapobj2[6][6];
objtwist(mapobj, mapobj2);
drawobj(mapobj2);
cout << endl;
int mapobj3[6][6];
objtwist(mapobj2, mapobj3);
drawobj(mapobj3);
cout << endl;
Sleep(20000);
}
}
int main()
{
gamemain();
//findwrong();
cout << endl << "You died." << endl;
return 0;
}