俄罗斯方块

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include<conio.h>

#define MOD 28
#define SIZE_N 19
#define SIZE_M 12

int cur_x, cur_y;
int score, mark, next, map[SIZE_N][SIZE_M], Gamespeed = 300;

int shape[28][6] = {
		{ 0, -1, 0, -2, 1, 0 }, { 0, 1, 1, 0, 2, 0 }, { -1, 0, 0, 1, 0, 2 }, { 0, -1, -1, 0, -2, 0 },
		{ 0, -1, 0, 1, -1, 0 }, { 0, 1, 1, 0, -1, 0 }, { 1, 0, 0, -1, 0, 1 }, { 1, 0, -1, 0, 0, -1 },
		{ -1, 1, 0, 1, 1, 0 }, { 0, -1, 1, 0, 1, 1 }, { -1, 0, 0, -1, 1, -1 }, { -1, -1, -1, 0, 0, 1 },
		{ -1, 0, 0, 1, 1, 1 }, { 0, 1, 1, -1, 1, 0 }, { -1, 0, 0, 1, 1, 1 }, { 0, 1, 1, -1, 1, 0 },
		{ -1, 0, 0, -1, 0, -2 }, { -1, 0, -2, 0, 0, 1 }, { 0, 1, 0, 2, 1, 0 }, { 0, -1, 1, 0, 2, 0 },
		{ 0, 1, 1, 0, 1, 1 }, { 0, -1, 1, 0, 1, -1 }, { -1, 0, 0, -1, -1, -1 }, { -1, 0, -1, 1, 0, 1 },
		{ 0, 1, 0, 2, 0, 3 }, { 1, 0, 2, 0, 3, 0 }, { 0, -1, 0, -2, 0, -3 }, { -1, 0, -2, 0, -3, 0 }
};

void gotoxy(int x, int y){
	COORD c;
	c.X = x - 1; c.Y = y - 1;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
void Gameover(){
	int i, j, flag = 0;
	for (j = 1; j<SIZE_M - 1; j++){
		if (map[1][j] != 0){
			flag = 1; break;
		}
	}
	if (flag == 1){
		for (i = 1; i<SIZE_N - 1; i++){
			gotoxy(2, i + 1);
			for (j = 1; j<SIZE_M - 1; j++){
				printf("□");
			}puts("");
		}
		gotoxy(7, 9);
		printf("GAME OVER!");
		gotoxy(1, SIZE_N + 1);
		exit(0);
	}
}
void ShowMap(int id){
	int i, j;
	gotoxy(1, 1);
	if (id != -1){
		for (i = 0; i<SIZE_N; i++){
			for (j = 0; j<SIZE_M; j++){
				if (i == 0 && j == 0 || i == 0 && j == SIZE_M - 1 || j == 0 && i == SIZE_N - 1 || j == SIZE_M - 1 && i == SIZE_N - 1)printf(" ");
				else if (i == 0 || i == SIZE_N - 1)printf("--");
				else if (j == 0 || j == SIZE_M - 1)printf("|");
				else if (map[i][j] == 2) printf("■");
				else if (i == cur_x + shape[id][0] && j == cur_y + shape[id][1] ||
					i == cur_x + shape[id][2] && j == cur_y + shape[id][3] ||
					i == cur_x + shape[id][4] && j == cur_y + shape[id][5] ||
					i == cur_x && j == cur_y)
					printf("■");
				else if (map[i][j] == 0) printf("  ");
			}
			if (i == 1)printf("   下一个 :");
			if (i == 11)printf("   等分 :   %d", score);
			if (i == 14)printf("   速度 :   %d", score / 100 + 1);
			puts("");
		}
	}
	else {
		mark = 1;
		for (i = 0; i<SIZE_N; i++){
			for (j = 0; j<SIZE_M; j++){
				if (i == 0 && j == 0 || i == 0 && j == SIZE_M - 1 || j == 0 && i == SIZE_N - 1 || j == SIZE_M - 1 && i == SIZE_N - 1)printf(" ");
				else if (i == 0 || i == SIZE_N - 1)printf("--");
				else if (j == 0 || j == SIZE_M - 1)printf("|");
				else if (map[i][j] == 2) printf("■");
				else if (map[i][j] == 0) printf("  ");
			}
			if (i == 1)printf("   next:");
			if (i == 11)printf("   score :   %d", score);
			if (i == 14)printf("   speed :   %d", score / 100 + 1);
			puts("");
		}
	}

	gotoxy(30, 6); printf("  ");
	for (i = 0; i<6; i = i + 2){
		gotoxy(30 + 2 * shape[id][i + 1], 6 + shape[id][i]); printf("  ");
	}
	gotoxy(30, 6); printf("■");
	for (i = 0; i<6; i = i + 2){
		gotoxy(30 + 2 * shape[next][i + 1], 6 + shape[next][i]); printf("■");
	}
	Sleep(Gamespeed);
}

void init(int id){
	int i, j;
	memset(map, 0, sizeof(map));
	for (i = 0; i<SIZE_N; i++){
		for (j = 0; j<SIZE_M; j++)
			if (i == SIZE_N - 1 || j == 0 || j == SIZE_M - 1)
				map[i][j] = -1;
	}
	cur_x = 0; cur_y = 5;
	ShowMap(id);
}

int judge_in(int x, int y, int id){
	int i;
	if (map[x][y] != 0)return 0;
	for (i = 0; i<6; i = i + 2){
		if (map[x + shape[id][i]][y + shape[id][i + 1]] != 0)return 0;
	}return 1;
}

void fun_score(){
	int i, j, ii, jj;
	for (i = 1; i<SIZE_N - 1; i++){
		int flag = 0;
		for (j = 1; j<SIZE_M - 1; j++){
			if (map[i][j] != 2){ flag = 1; break; }
		}
		if (flag == 0){
			int k = 3;
			while (k--){
				gotoxy(2, i + 1);
				for (ii = 1; ii<SIZE_M - 1; ii++){
					if (map[i][ii] == 2){
						if (k % 2 == 1)printf("  ");
						else printf("■");
					}
				}Sleep(100);
			}
			for (ii = i; ii>1; ii--){
				for (jj = 1; jj<SIZE_M - 1; jj++) map[ii][jj] = map[ii - 1][jj];
			}
			ShowMap(-1);
			score += 10;
			if (score % 100 == 0 && score != 0)Gamespeed -= 50;
		}
	}
}

int main(){
	int i, id, set = 1;

	srand(time(NULL));
	id = rand() % MOD; id = (id + MOD) % MOD;
	next = rand() % MOD; next = (next + MOD) % MOD;

	init(id);

	while (1){
	Here:        mark = 0;
		if (set == 0){
			id = next;
			next = rand() % MOD; next = (next + MOD) % MOD;
			cur_x = 0; cur_y = 5;
			set = 1;
		}

		while (!_kbhit()){
			Gameover();
			if (judge_in(cur_x + 1, cur_y, id) == 1) cur_x++;
			else {
				map[cur_x][cur_y] = 2;
				for (i = 0; i<6; i = i + 2)
					map[cur_x + shape[id][i]][cur_y + shape[id][i + 1]] = 2;
				fun_score();
				set = 0;
			}
			if (mark != 1)ShowMap(id);
			goto Here;
		}

		char key;
		key = _getch();

		if (key == 72){
			int tmp = id;
			id++;
			if (id % 4 == 0 && id != 0)id = id - 4;
			if (judge_in(cur_x, cur_y, id) != 1)id = tmp;
		}
		else if (key == 80 && judge_in(cur_x + 1, cur_y, id) == 1)cur_x++;
		else if (key == 75 && judge_in(cur_x, cur_y - 1, id) == 1)cur_y--;
		else if (key == 77 && judge_in(cur_x, cur_y + 1, id) == 1)cur_y++;
		else if (key == 27){ gotoxy(1, SIZE_N + 1); exit(0); }
	}
	_getch();
	return 0;
}

http://bbs.cyuyan.com.cn/thread-6977-1-1.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值