这个厉害呢~~呵呵,转载的飘谊的文章俄罗斯方块,这里也推荐下这个博客: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");
}
}