俄罗斯方块

4 篇文章 0 订阅

这个厉害呢~~呵呵,转载的飘谊的文章俄罗斯方块,这里也推荐下这个博客:nyist_飘谊,具体代码如下:

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

#define PLUS(x) (x == 1 ? 1 : -1)
#define ZFROM_W 21//游戏框的宽
#define ZFROM_H 21//游戏框的高
#define FFROM_W 9
#define MODE 7
#define NORN 3
#define NORM 4
#define STARTX 7
#define STARTY -1
#define SANG 100

int map[ZFROM_W + 5][ZFROM_H + 5];
int Srow[ZFROM_H + 5];
double TIME;
int type,idx,next;
int score;
int norm,stage;
int x,y;

int fig[MODE][4] = {183141,183141,183141,183141,215916,187177,215849,186789,249132,162213,249132,162213,
220012,182885,220012,182885,191333,203561,191333,203561,215845,191340,204076,190885,220005,182693,220460,182890};//# , T  ,|,Z反,Z正,F正,

HANDLE g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE g_hInput  = GetStdHandle(STD_INPUT_HANDLE);
int dir[4][2] = {0,-1,2,0,0,1,-2,0};//up , right , down , left

void SetCursor(int x,int y)//设置光标位置
{
    COORD cd = {x , y};
    SetConsoleCursorPosition(g_hOutput , cd);
}

void Draw_from(int w,int h,int x,int y)//打印方框
{
    int i,j;
    SetCursor(x,y);
    printf(" ");
    for(i = 1;i < w;i ++) {
        printf("-");
    }
    puts(" ");
    for(i = 1;i < h;i ++) {
        SetCursor(x,i);
        for(j = 0;j <= w;j ++) {
            if(j == 0 || j == w)
                printf("|");
            else printf(" ");
        }
        puts("");
    }
    SetCursor(x,h);
    printf(" ");
    for(i = 1;i < w;i ++) {
        printf("-");
    }
    SetCursor(23 , 2);
    printf("NEXT:");
    SetCursor(23 , 10);
    printf("SPEED:");
    SetCursor(23,15);
    printf("SCORE:");
}

void Print_fig(int x,int y,int type,int flag)//打印,擦除,记录点
{
    int i;
    int tx = x , ty = y;
    int tmp = fig[type][idx];
    SetCursor(tx , ty);
    for(i = 1;i <= 4;i ++) {
        if(ty > 0){
            if(flag == 1)printf("■");
            else if(flag == 0) printf("  ");
            else if(flag == 2) {
                map[ty][tx] = 1;
                Srow[ty] += 2;
            }
        }
        tx = x + (PLUS((tmp & NORM) / 4) * (tmp & NORN) * 2);
        tmp >>= 3;
        ty = y + (PLUS((tmp & NORM) / 4) * (tmp & NORN));
        tmp >>= 3;
        SetCursor(tx , ty);
    }
    SetCursor(30,21);
    return ;
}

void Inite_game()//初始化游戏界面
{
    memset(map,0,sizeof(map));
    memset(Srow,0,sizeof(Srow));
    srand(time(NULL));
    type = rand() % MODE;
    next = rand() % MODE;
    Print_fig(24 , 4 ,next, 1);
    idx = 0;
    score = 0;
    x = STARTX;
    y = STARTY;
    TIME = 400;
    norm = 50;
    stage = 1;
    Print_fig(x , y , type , 1);
    SetCursor(24 , 11);
    printf("%c",2);
    SetCursor(24 , 16);
    printf("%d",score);
}

int Judge(int id,int x,int y)//判断动作是否可以进行
{
    int i;
    int tx,ty;
    bool flag = false;
    int tmp = fig[type][idx];

    if(id == 0) {
        tmp = fig[type][(idx+1)%4];
        tx = x , ty = y;
    }
    else {
        tx = x += dir[id][0];
        ty = y += dir[id][1];
    }
    for(i = 1;i <= 4;i ++) {
        if(ty < 1) flag = true;
        if(tx < 1 || tx >= ZFROM_W - 1 || ty >= ZFROM_H) {
            if(flag)
                return 2;
            return 0;
        }
        if(map[ty][tx]){
            if(flag)
                return 2;
            return 0;
        }
        tx = x + (PLUS((tmp & NORM) / 4) * (tmp & NORN) * 2);
        tmp >>= 3;
        ty = y + (PLUS((tmp & NORM) / 4) * (tmp & NORN));
        tmp >>= 3;
    }
    return 1;
}

void Deal_judge()//处理消除一行
{
    int i,j,k,n;
    int gde = 5;
    while(true){
        for(i = 1;i < ZFROM_H;i ++) {
            if(Srow[i] == ZFROM_W - 1)
                break;
        }
        n = i;
        if(i == ZFROM_H){
            SetCursor(24 , 16);
            printf("%d",score);
            if(score > norm) {
                norm *= 50 * stage;
                stage ++;
                TIME -= TIME * 0.1;
                SetCursor(24,11);
                for(k = 1;k <= stage;k ++)
                    printf("%c",2);
            }
            return ;
        }
        score += gde;
        gde *= 2;
        for(k = 1;k <= 3;k ++){
            SetCursor(1 , i);
            for(j = 1;j <= ZFROM_W / 2;j ++) {
                if(k & 1) printf("  ");
                else printf("■");
            }
            Sleep(SANG);
        }
        for(i ;i > 1;i --) {
            Srow[i] = Srow[i-1];
            for(j = 1;j < ZFROM_W;j ++) {
                map[i][j] = map[i-1][j];
            }
        }
        for(i = 1;i <= n;i ++) {
            for(j = 1;j < ZFROM_W;j += 2) {
                SetCursor(j , i);
                if(map[i][j]) {printf("■");}
                else printf("  ");
            }
        }
    }
    return ;
}

int Move_fig(int id)//改变,移动方块
{
    int tans = Judge(id,x,y);
    if(tans == 0) {//如果移动不了了
        if(id == 2){
            Print_fig(x , y , type , 2);
            Deal_judge();
            type = next;
            idx = 0;
            next = rand() % MODE;
            Print_fig(24 , 4 , type , 0);
            Print_fig(24 , 4 , next , 1);
            x = STARTX;
            y = STARTY;
        }
        return 1;
    }
    if(tans == 2)
        return 0;
    Print_fig(x , y , type , 0);
    if(id == 0){
        idx = (idx + 1) % 4;
    }
    else {
        x += dir[id][0];
        y += dir[id][1];
    }
    Print_fig(x , y , type , 1);
    return 1;
}

void Deal_gameover()//游戏结束
{
    int i,j,k;
    Print_fig(24 , 4 , next , 0);
    SetCursor(24,11);
    SetCursor(24 , 16);
    printf("      ");
    for(k = 1;k <= stage;k ++){
        printf(" ");
    }
    for(i = 1;i <= 5;i ++) {
        SetCursor(0 , 1);
        for(j = 1;j < ZFROM_H;j ++) {
            for(k = 0;k <= ZFROM_W / 2;k ++) {
                if(!k) {printf("|");continue;}
                if(i & 1)printf("  ");
                else printf("■");
            }
            puts("");
        }
        Sleep(SANG);
        if(i == 4) {
            SetCursor(5 , 10);
            printf("GAME OVER");
            Sleep(2000);
            SetCursor(5 , 10);
            printf("按 ESC 退出");
            Sleep(2000);
            if(GetAsyncKeyState(VK_ESCAPE)) {
                exit(0);
            }
        }
    }
    return ;
}

int main()
{
    int pre,cur;
    Draw_from(ZFROM_W,ZFROM_H,0,0);
    Draw_from(FFROM_W,ZFROM_H,ZFROM_W + 1 , 0);
    while(true) {
        Inite_game();
        while(true) {
            cur = pre = GetTickCount();
            while(cur - pre < TIME) {
                if(GetAsyncKeyState(VK_UP)) {
                    //printf("%c",7);
                    Move_fig(0);
                }
                if(GetAsyncKeyState(VK_DOWN)) {
                    if(Move_fig(2) == 0)
                        break;
                }
                if(GetAsyncKeyState(VK_LEFT)) {
                    Move_fig(3);
                }
                if(GetAsyncKeyState(VK_RIGHT)) {
                    Move_fig(1);
                }
                if(GetAsyncKeyState(VK_SPACE)) {
                    while(true) {
                        Sleep(1000);
                        if(GetAsyncKeyState(VK_SPACE)) {
                            break;
                        }
                    }
                }
                if(GetAsyncKeyState(VK_ESCAPE)) {
                    exit(0);
                }
                Sleep(100);
                cur = GetTickCount();
            }
            if(Move_fig(2) == 0)
                break;
        }
        Deal_gameover();
    }
    return 0;
}

同样是来自他的博客,下面这个涉及到句柄,不是这个竟然可以在DEV里直接运行(好像这个说的有点傻额),呵呵呵~自己也拷过去输出看看吧

#include <stdio.h>
#include <windows.h>
#define N 50
HANDLE hConsole; 
void gotoxy(int x, int y) 
{ 
	COORD coord; 
	coord.X = x; 
	coord.Y = y; 
	SetConsoleCursorPosition(hConsole, coord); 
} 
void main()
{
	int i,j,k;
	hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTextAttribute(hConsole, FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY); 
	for(k=0;k<3;k++)
	{
		gotoxy(4,6);

		for(i = 0;i<11;i ++)

		{
			printf("*");
			Sleep(N);

		}

		for(i = 0;i<12;i++)
		{
			gotoxy(9,7+i);
			printf("*");
			Sleep(N);
		}
		gotoxy(4,18);
		for(i = 0;i<11;i ++)
		{
			printf("*");
			Sleep(N);
		}
		gotoxy(36,10);
		printf("*");
		Sleep(N);

		gotoxy(25,10);
		printf("*");
		Sleep(N);

		gotoxy(47,10);
		printf("*");
		Sleep(N);

		gotoxy(34,8);
		printf("*");
		Sleep(N);

		gotoxy(38,8);
		printf("*");
		Sleep(N);

		gotoxy(30,7);
		printf("*");
		Sleep(N);

		gotoxy(42,7);
		printf("*");
		Sleep(N);

		gotoxy(27,8);
		printf("*");
		Sleep(N);

		gotoxy(45,8);
		printf("*");
		Sleep(N);

		gotoxy(25,11);
		printf("*");
		Sleep(N);

		gotoxy(47,11);
		printf("*");
		Sleep(N);
		for(i=1,j=1;i<6,j<6;i++,j++)
		{
			gotoxy(25+i,11+j);
			printf("*");
			Sleep(N);
		}
		gotoxy(32,17);
		printf("*");
		Sleep(N);

		gotoxy(34,18);
		printf("*");
		Sleep(N);


		for(i=1,j=1;i<6,j<6;i++,j++)
		{
			gotoxy(47-i,11+j);
			printf("*");
			Sleep(N);
		}
		gotoxy(40,17);
		printf("*");
		Sleep(N);

		gotoxy(38,18);
		printf("*");
		Sleep(N);

		gotoxy(36,19);
		printf("*"); 
		Sleep(N);
		for(i=0;i<11;i++)
		{
			gotoxy(59,6+i);
			printf("*");
			Sleep(N);
		}
		gotoxy(61,17);
		printf("*");
		Sleep(N);
		for(i=0;i<11;i++)
		{
			gotoxy(63+i,18);
			printf("*");
			Sleep(N);
		}
		gotoxy(74,17);
		printf("*");
		Sleep(N);

		gotoxy(76,16);
		printf("*");
		Sleep(N);
		for(i=0;i<10;i++)
		{
			gotoxy(76,15-i);
			printf("*");
			Sleep(N);
		}
		system("cls");
	}
	while(1)
	{
		gotoxy(4,6);

		for(i = 0;i<11;i ++)

		{
			printf("*");


		}

		for(i = 0;i<12;i++)
		{
			gotoxy(9,7+i);
			printf("*");

		}
		gotoxy(4,18);
		for(i = 0;i<11;i ++)
		{
			printf("*");

		}
		gotoxy(36,10);
		printf("*");


		gotoxy(25,10);
		printf("*");


		gotoxy(47,10);
		printf("*");


		gotoxy(34,8);
		printf("*");


		gotoxy(38,8);
		printf("*");


		gotoxy(30,7);
		printf("*");

		gotoxy(42,7);
		printf("*");


		gotoxy(27,8);
		printf("*");


		gotoxy(45,8);
		printf("*");


		gotoxy(25,11);
		printf("*");


		gotoxy(47,11);
		printf("*");

		for(i=1,j=1;i<6,j<6;i++,j++)
		{
			gotoxy(25+i,11+j);
			printf("*");

		}
		gotoxy(32,17);
		printf("*");


		gotoxy(34,18);
		printf("*");



		for(i=1,j=1;i<6,j<6;i++,j++)
		{
			gotoxy(47-i,11+j);
			printf("*");

		}
		gotoxy(40,17);
		printf("*");


		gotoxy(38,18);
		printf("*");


		gotoxy(36,19);
		printf("*"); 

		for(i=0;i<11;i++)
		{
			gotoxy(59,6+i);
			printf("*");

		}
		gotoxy(61,17);
		printf("*");

		for(i=0;i<11;i++)
		{
			gotoxy(63+i,18);
			printf("*");

		}
		gotoxy(74,17);
		printf("*");
		Sleep(100);
		gotoxy(76,16);
		printf("*");

		for(i=0;i<10;i++)
		{
			gotoxy(76,15-i);
			printf("*");

		}
		gotoxy(25,22);
		Sleep(1000);
		system("cls");
	}

}



 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值