俄罗斯方块
2024-08-24 20:28:40
发布于:江苏
AD左右移动, S加速下落, W旋转
更改W,H以改变地图尺寸
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
const int W = 10, H = 20;
string p[] = {"00100111", "10111213", "01112131", "10200111", "00011112", "00101121", "10110102", "10111222", "01112102", "00101112", "20011121", "10111202", "00011121", "10201112", "01112122", "10011121", "10112112", "01112112", "10011112"};
int index[] = {0, 1, 3, 5, 7, 11, 15, 19};
int x, y, t, d, mp[H][W], block[4][2], dir[4][2] = {0, -1, 0, 1, -1, 0, 1, 0};
void init(){
x = 0, y = 0;
t = rand() % 7, d = 0;
for (int i = 0; i < H; i++){
for (int j = 0 ; j < W; j++){
cout << " ";
}
cout << "|" << endl;
}
for (int i = 0; i < W * 2; i++){
cout << "-";
}
cout << "+";
}
void generate(){
for (int i = 0; i < 4; i++){
block[i][0] = x + (p[index[t] + d][i * 2] - '0');
block[i][1] = y + (p[index[t] + d][i * 2 + 1] - '0');
}
}
bool determine(){
for (int i = 0; i < 4; i++){
if (block[i][0] < 0 || block[i][0] > W - 1 || block[i][1] > H - 1){
return true;
}
for (int j = 0; j < 4; j++){
if (mp[block[j][1]][block[j][0]] == 1){
return true;
}
}
}
return false;
}
void move(int f){
x = x + dir[f][0];
y = y + dir[f][1];
generate();
if (determine()){
x = x - dir[f][0];
y = y - dir[f][1];
}
generate();
}
void add(){
for (int i = 0; i < 4; i++){
mp[block[i][1]][block[i][0]] = 1;
}
}
bool lose(){
for (int i = 0; i < W; i++){
if (mp[0][i] == 1){
return true;
}
}
return false;
}
void delete_block(){
for (int i = 0; i < H; i++){
int sum = 0;
for (int j = 0; j < W; j++){
if (mp[i][j] == 1){
sum = sum + 1;
}
}
if (sum == W){
for (int j = 0; j < W; j++){
mp[i][j] = 0;
}
for (int j = i - 1; j >= 0; j--){
for (int k = 0; k < W; k++){
mp[j + 1][k] = mp[j][k];
mp[j][k] = 0;
}
}
}
}
}
void gotoxy(int x, int y){
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void draw(){
for (int i = 0; i < H; i++){
for (int j = 0; j < W; j++){
gotoxy(j * 2, i);
if (mp[i][j]){
cout << "[]";
}else{
cout << " ";
}
}
}
}
void draw_block(){
for (int i = 0; i < 4; i++){
gotoxy(block[i][0] * 2, block[i][1]);
cout << "[]";
}
}
void clear_block(){
for (int i = 0; i < 4; i++){
gotoxy(block[i][0] * 2, block[i][1]);
cout << " ";
}
}
int main(){
srand(time(0));
init();
generate();
char c;
int T = time(0);
while (!lose()){
if (_kbhit()){
clear_block();
c = _getch();
if (c == 'w'){
d = d + 1;
d = d % (index[t + 1] - index[t]);
generate();
if (determine()){
d = d - 1;
if (d == -1){
d = index[t + 1] - index[t] - 1;
}
generate();
}
}
if (c == 's'){
move(1);
}
if (c == 'a'){
move(2);
}
if (c == 'd'){
move(3);
}
}
draw_block();
if (time(0) - T){
clear_block();
move(1);
T = time(0);
}
y = y + 1;
generate();
if (determine()){
y = y - 1;
generate();
add();
delete_block();
x = 0, y = 0;
t = rand() % 7, d = 0;
draw();
generate();
}else{
y = y - 1;
generate();
}
}
gotoxy(0, H);
return 0;
}
这里空空如也
有帮助,赞一个