VC++6.0 下 C语言做俄罗斯方块 (<graphics.h> )图形函数库问题

供稿:hz-xin.com     日期:2025-01-18
急求VC6.0下用C语言编写的俄罗斯方块的源代码,急!!!

#include
#include
#include
#include
#include

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

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

int shape[28][6]={//这是个比较偷懒的方法,就是7种方块,加上旋转总共28种
{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){//gotoxy在TC中是在system.h库文件里的一个函
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(" next:");
if(i==11)printf(" score : %d",score);
if(i==14)printf(" speed : %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("");
}
}
/*对于next 方块的处理,先擦除再画图*/
for(i=2;i<=10;i++){
for(j=23;j<=34;j++){
gotoxy(j+1,i+1);printf(" ");
}
}
gotoxy(29,6); printf("■");
for(i=0;i<6;i=i+2){
gotoxy(29+2*shape[next][i+1],6+shape[next][i]); printf("■");
}
Sleep(Gamespeed);
}

void init(int id){//初始化函数,cur_x,cur_y是全局变量,标记了移动方块的位置
memset(map,0,sizeof(map));
for(int i=0;i<SIZE_N;i++){
for(int 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=6;
ShowMap(id);
}

int judge_in(int x,int y,int id){//判断是否出界,或者说是否合法
if(map[x][y]!=0)return 0;
for(int 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(){//得分,擦除行的闪烁,还有图形的向下平移
for(int i=1;i<SIZE_N-1;i++){
int flag=0;
for(int 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(int ii=1;ii<SIZE_M-1;ii++){
if(map[i][ii]==2){
if(k%2==1)printf(" ");
else printf("■");
}
}Sleep(100);
}
for(int ii=i;ii>1;ii--){
for(int 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=6;
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;
set=0;
}
fun_score();
if(mark!=1)ShowMap(id);
goto Here;
}//end of while(!kbhit())

key=getch();
if(key1==-32 && 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(key1==-32 && key==80 && judge_in(cur_x+1,cur_y,id)==1)cur_x++;
else if(key1==-32 && key==75 && judge_in(cur_x,cur_y-1,id)==1)cur_y--;
else if(key1==-32 && key==77 && judge_in(cur_x,cur_y+1,id)==1)cur_y++;
else if(key==27)return 0;
key1=key;
}return 0;
}

#include
#include
#include
#define mDRAW 5
#define mLINE 6
#define mADOWN 7
#define mGEN 8
#define mLEFT 75
#define mRIGHT 77
#define mSPACE 57
#define mDOWN 80
#define mESC 1
#define TIMEINT 2
#define MAXX 9
#define MAXY 30
#define BACKCOLOR BLACK
#define WINX 50
#define WINY 470
#define GAP 6
#define AREAX (WINX+GAP)
#define AREAY (WINY-GAP)
#define BOXW 15

int oldarea[MAXY+1][MAXX];
int area[MAXY+1][MAXX];
int actW,actH,actX,actY;
int curX,curY,curColor,curW,curH;
int newX,newY,newColor,newW,newH;
int active;
int box[4][4];
int FORCOLOR;
int MESSAGE;
int BOX[7][4][4]={
{
{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,1,0},
{1,0,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,1,0},
{0,0,1,0},
{0,0,0,0},
{0,0,0,0}

},{
{1,1,1,0},
{0,1,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,0,0},
{0,1,1,0},
{0,0,0,0},
{0,0,0,0}
},{
{0,1,1,0},
{1,1,0,0},
{0,0,0,0},
{0,0,0,0}
},{
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{0,0,0,0}
}
};


void init();
void draw();
int genBox();
int getKey();
void lineFull();
int moveLeft();
int moveRight();
int moveDown();
int rotate();
int getW();
int getH();
void clearOldBox();
void putNewBox();
int collisionRotate(int box[][4]);
void getMessage();
void dispatchMessage();
int timeCome();
void fallDown();
int gameOver();

main()
{
int i;
init();
do
{
getMessage();
dispatchMessage();
}
while(!gameOver());

getch();
closegraph();
}

void getMessage()
{
if(MESSAGE) return;
if(timeCome())
{
MESSAGE=mADOWN;
return;
}
if(bioskey(1))
{
MESSAGE=bioskey(0)>>8;
return;
}
}

void dispatchMessage()
{
switch(MESSAGE)
{
case mLEFT: moveLeft();break;
case mRIGHT: moveRight();break;
case mADOWN: moveDown();break;
case mSPACE: rotate();break;
case mDOWN: fallDown(); break;
case mDRAW: draw();break;
case mLINE: lineFull();break;
case mGEN: genBox();break;
case mESC: closegraph(); exit(0);
default: MESSAGE=0;
}
}

void fallDown()
{
while(active)
{
moveDown(); draw();
}

MESSAGE=mLINE;
}

int timeCome()
{

static long tm, old;
tm=biostime(0,tm);
if(tm-old<TIMEINT) return 0;
else
{
old=tm; return 1;
}
}

void init()
{
int i,j,x1,y1,x2,y2;
int driver=DETECT, mode=0;
randomize();
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
cleardevice();
setfillstyle(SOLID_FILL,BLUE);
bar(0,0,639,479);
x1=AREAX;
y1=AREAY-BOXW*MAXY;
x2=AREAX+MAXX*BOXW;
y2=AREAY;
rectangle(--x1,--y1,++x2,++y2);
setfillstyle(SOLID_FILL,BLACK);
bar(++x1,++y1,--x2,--y2);
y1=AREAY-MAXY*BOXW; y2=AREAY;
setcolor(DARKGRAY);
for(i=0;i<MAXX;i++)
{
x1=AREAX+i*BOXW;
line(x1,y1,x1,y2);
}

x1=AREAX; x2=x1+MAXX*BOXW;
for(j=0;j<MAXY;j++)
{
y1=AREAY-j*BOXW;
line(x1,y1,x2,y1);
}
for(j=0;j<MAXY;j++)
for(i=0;i<MAXX;i++)
area[j][i]=oldarea[j][i]=0;
actX=0; actY=0; actW=MAXX-1; actH=MAXY-1;
draw();
MESSAGE=mGEN;
}

int genBox()
{
int i,j,boxidx;
boxidx=random(7); FORCOLOR=random(7)+1;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=BOX[boxidx][j][i];
curW=getW(); curH=getH();
curX=(MAXX+curW)/2;
if(curX+curW>=MAXX)curX=MAXX-1-curW;
curY=MAXY-1-curH;
newX=curX; newY=curY; actX=curX;actY=curY;
actW=newW=curW; actH=newH=curH;
active=1;
if(collision(box)) return 0;
putNewBox();
draw(); MESSAGE=0;
return 1;
}

void lineFull()
{
int row,col, rowEnd,full,i,j;
rowEnd=newY+newH;
if(rowEnd>=MAXY-1) rowEnd=MAXY-2;
for(row=newY; row<=rowEnd;)
{
full=1;
for(col=0;col<MAXX;col++)
if(!area[row][col]){full=0; break;}
if(!full){++row; continue;}
for(j=row; j<MAXY-1;j++)
for(i=0;i<MAXX;i++)
area[j][i]=area[j+1][i];
actX=0;actY=row; actW=MAXX-1; actH=MAXY-1-row;
draw(); rowEnd--;
}
MESSAGE=mGEN;
}

void draw()
{
int row,col,x1,y1,x2,y2;
for(row=actY;row<=actY+actH;row++)
for(col=actX;col<=actX+actW;col++)
if(area[row][col]!=oldarea[row][col])
{
if(area[row][col]==0)
setfillstyle(SOLID_FILL,BACKCOLOR);
else
setfillstyle(SOLID_FILL,FORCOLOR);

x1=AREAX+col*BOXW; x2=x1+BOXW;
y1=AREAY-(row+1)*BOXW; y2=y1+BOXW;
bar(++x1,++y1,--x2,--y2);
oldarea[row][col]=area[row][col];
}

MESSAGE=0;
}

int moveLeft()
{
newX=curX-1; clearOldBox();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return 0;
}
putNewBox();
actW=curW+1; actX=curX=newX;
MESSAGE=mDRAW;
return 1;
}

int moveRight()
{
newX=curX+1; clearOldBox();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return 0;
}
putNewBox();
actW=curW+1; actX=curX; curX=newX;
MESSAGE=mDRAW;
return 1;
}

int moveDown()
{
int i,j;
newY=curY-1;
clearOldBox();
if(collision(box))
{
newY=curY;
putNewBox();
active=0;
MESSAGE=mLINE;
return 0;
}
putNewBox();
actH=curH+1; actY=newY; curY=newY;
MESSAGE=mDRAW;
return 1;
}

int rotate()
{
int newBox[4][4];
int i,j;
clearOldBox();

for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[j][i]=0;

for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[curW-i][j]=box[j][i];
newW=curH; newH=curW;
if(collisionRotate(newBox))
{
newW=curW; newH=curH; newX=curX; newY=curY;
putNewBox();
MESSAGE=0;
return 0;
}

for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=newBox[j][i];
putNewBox();
actH=newH>curH? newH:curH;
actW=curX+actH-newX;
actX=newX; actY=newY; curX=newX;
curY=newY; curW=newW; curH=newH;
MESSAGE=mDRAW;
return 1;
}

int getW()
{
int i,j;
for(i=3;i>0;i--)
for(j=0;j<4;j++)
if(box[j][i]) return i;
return 0;
}

int getH()
{
int i,j;
for(j=3;j>0;j--)
for(i=0;i<4;i++)
if(box[j][i]) return j;
return 0;
}


void clearOldBox()
{
int i,j;
for(j=0;j<=curH; j++)
for(i=0;i<=curW; i++)
if(box[j][i])
area[curY+j][curX+i]=0;
}

void putNewBox()
{
int i,j;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(box[j][i])
area[newY+j][newX+i]=FORCOLOR;
}

int collision(int cbox[][4])
{
int i,j;
if(newX<0) return 1;
if(newX+newW>=MAXX) return 1;
if(newY<0) return 1;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(area[newY+j][newX+i]&&cbox[j][i]) return 1;
return 0;
}

int collisionRotate(int cbox[][4])
{
int i,j;
if(newX+newW>=MAXX) newX=MAXX-1-newW;
if(newY+newH>=MAXY) newY=MAXY-1-newH;
if(collision(cbox)) return 1;
for(i=0;i<=newW;i++)
for(j=0;j<=newH;j++)
if(area[newY+j][newX+i])
{
newX-=newW-i+1; goto L;
}
L: return collision(cbox);
}

int gameOver()
{
if(!active &&(curY+curH>MAXY-3)) return 1;
else return 0;
}

#include <windows.h>
#include <conio.h>
#include <string>
#include <time.h>
#include <iostream>
#define up 72
#define down 80
#define left 75
#define right 77
#define esc 27
using namespace std;//-----------------------
// 重要数据定义
typedef struct m_point { //控制台中的坐标点定义, 其中0<=x<=24, 0<=y<79
int x;
int y;
}m_point;
typedef struct block { //方块定义, 一个方块有四个点, 例如: ■■■
// ■
m_point opt;
m_point pt2;
m_point pt3;
m_point pt4;
}block;
block bloary[6][4]; //方块数组,一共有6种,每种有4个方向
bool scrop[15][10]; //游戏空间定义,初始值全标记为0,向屏幕打印蓝色方块,
//如果标记为1,则向屏幕找印深蓝色方块
// 数据定义完毕//---------------------------
// 功能函数声明
void begin(); //开始函数
void color(int n_color); //设置字符颜色
int getrand(int max); //获得不大于max的随机数
void go(int x, int y); //使光移动到指定位置
void show_unit(); //输出 ■ 字符
char getudlr(); //接受键盘上的上下左右及回车键并返回相应字符 u d l r k
void show_block(block b); //输出方块
void init(); //初始化block bloary[6][4]数组
void show_scrop(); //根据scrop[15][10]的值打印相应颜色的方块
bool isexist(block b); //判断当前方块中的四个坐标是否在游戏空间中被标记为 1
void markspace(block b); //当方块停留时,把方块四个点的坐标在游戏空间数组scrop[][]中的相应位置标记为1
void move_block(block &b, char ch, int &lark); //移动方块
void change_block(block &b, int i, int &j, int lark); //改变当前方块的方向,注:一共有四个方向
void check(int &score); //消行函数
void wait(float secs); //让程序等待secs秒
void othergetch(); //起暂停功能
void out(char* chars, int n); //相当于C++中的cout功能
void initb(int optx, int opty, //容易看出这个函数中传递了8个int值,分别用于这四点的横坐标和纵坐标,
//另外bloc是一个block结构体,block结构体中含有8个int值来表示方块的4个点
int pt2x, int pt2y,
int pt3x, int pt3y,
int pt4x, int pt4y,
block &bloc);
// 功能函数声明完毕
void show_unit2()
{
WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE)," ",2,0,0);
}
void show_block2(block b)
{
go(b.opt.x, b.opt.y);
show_unit2();
go(b.pt2.x, b.pt2.y);
show_unit2();
go(b.pt3.x, b.pt3.y);
show_unit2();
go(b.pt4.x, b.pt4.y);
show_unit2();
}
int main()
{
system("color ec");
system("title 俄罗斯方块");
color(0xec);
go(33,2);
out("制作人:赵晨晔",22);
go(33,3);
out("游戏规则:",10);
go(33,4);
out("1.按左右下键进行移动",20);
go(33,5);
out("2.按向上键改变形状",18);
go(10,0);
for (int ckh=0; ckh<15; ckh++)
{
go(20,ckh);
cout<<"║";
}
go(0,15);
cout<<"══════════■";
begin();
return 0;
}// 以下是功能函数定义部分
void begin()
{
init();
static int score = 0;
for(int i=0; i<15; i++)
for(int j=0; j<10; j++)
scrop[i][j]=0;
int lev=0;
cout<<"请输入速度(1~9)";
cin>>lev;
while(1)
{
block b;
int lark=1;
int i=getrand(6);
int j=getrand(4);

go(20,21);
b = bloary[i][j];
show_scrop();
show_block(b);
if(isexist(b))
{
system("cls");
go(37,12);
out("失败,结束!",10);
othergetch();
exit(-1);
} while(lark!=0)
{
show_scrop();
show_block(b);
int delay=10*lev;
int max_delay=100;
char ch='\0';

while(delay<max_delay)
{
if(_kbhit())
{
int key=_getch();
switch (key)
{
case up:
show_block2(b);
change_block(b, i, j, lark);
show_block(b);
break;
case down:
ch='d';
delay=max_delay;
break;
case left:
ch='l';
show_block2(b);
move_block(b, ch, lark);
show_block(b);
break;
case right:
ch='r';
show_block2(b);
move_block(b, ch, lark);
show_block(b);
break;
case esc:
exit(-1);
break;
}
}
_sleep(3);
delay++;
}

if (ch='d'){
show_block2(b);
move_block(b,ch,lark);
show_block(b);
}
}
if(lark==0)
{
markspace(b);
}
check(score);
}
}// 函数作用:初始化bloary[6][4]数组,这个数组表示16个方块的结构体,具体是,
// 一共有6种方块,每种方块又有4种不同的方向(也就是种不同的形状)
// 其中initb函数将在下面定义
void init(){
////////////////////////////////////////////////////////////
/**/ initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][0]); /////
/**/ initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][1]); /////
/**/ initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][2]); /////
/**/ initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][3]); /////
/**/ initb(2, 1, 0, 1, 4, 1, 6, 1, bloary[1][0]); /////
/**/ initb(2, 1, 2, 0, 2, 2, 2, 3, bloary[1][1]); /////
/**/ initb(2, 1, 0, 1, 4, 1, 6, 1, bloary[1][2]); /////
/**/ initb(2, 1, 2, 0, 2, 2, 2, 3, bloary[1][3]); /////
/**/ initb(2, 1, 0, 0, 0, 1, 4, 1, bloary[2][0]); /////
/**/ initb(2, 1, 2, 0, 4, 0, 2, 2, bloary[2][1]); /////
/**/ initb(2, 1, 0, 1, 4, 1, 4, 2, bloary[2][2]); /////
/**/ initb(2, 1, 2, 0, 0, 2, 2, 2, bloary[2][3]); /////
/**/ initb(2, 1, 4, 0, 0, 1, 4, 1, bloary[3][0]); /////
/**/ initb(2, 1, 2, 0, 2, 2, 4, 2, bloary[3][1]); /////
/**/ initb(2, 1, 0, 1, 4, 1, 0, 2, bloary[3][2]); /////
/**/ initb(2, 1, 0, 0, 2, 0, 2, 2, bloary[3][3]); /////
/**/ initb(2, 1, 2, 0, 0, 1, 4, 1, bloary[4][0]); /////
/**/ initb(2, 1, 2, 0, 4, 1, 2, 2, bloary[4][1]); /////
/**/ initb(2, 1, 0, 1, 4, 1, 2, 2, bloary[4][2]); /////
/**/ initb(2, 1, 2, 0, 0, 1, 2, 2, bloary[4][3]); /////
/**/ initb(2, 1, 2, 0, 4, 0, 0, 1, bloary[5][0]); /////
/**/ initb(2, 1, 2, 0, 4, 1, 4, 2, bloary[5][1]); /////
/**/ initb(2, 1, 2, 0, 4, 0, 0, 1, bloary[5][2]); /////
/**/ initb(2, 1, 2, 0, 4, 1, 4, 2, bloary[5][3]); /////
////////////////////////////////////////////////////////////
}
// 函数作用:初始化方块,一个方块具有四个坐标,如 ■■■
// ■
// 容易看出这个函数中传递了8个int值,分别用于这四点的横坐标和纵坐标,
// 另外bloc是一个block结构体,block结构体中含有8个int值来表示方块的4个点
void initb(int optx, int opty,
int pt2x, int pt2y,
int pt3x, int pt3y,
int pt4x, int pt4y,
block &bloc)
{
bloc.opt.x = optx;
bloc.opt.y = opty;
bloc.pt2.x = pt2x;
bloc.pt2.y = pt2y;
bloc.pt3.x = pt3x;
bloc.pt3.y = pt3y;
bloc.pt4.x = pt4x;
bloc.pt4.y = pt4y;
}
// 函数作用:这个函数的作用是在控制台下打印游戏空间,即数组scrop[15][10],
// 如果scrop[i][j]是0,则用0xab色打印■字符
// 如果scrop[i][j]是1,则用0xb3色打印■字符
// 打印效果为10*15的矩形方块,我把它称为游戏空间
void show_scrop(){
go(0,0);
for (int i=0; i<15; i++)
{
for (int j=0; j<10; j++)
{
if (0==scrop[i][j])
{
color(0x00);
show_unit();
}
else
{
color(0x03);
show_unit();
}
}
go(0,i+1);
}
go(0,0);
color(0x0c);
}
//函数作用:判断当前方块中的四个坐标是否在游戏空间中被标记为 1
bool isexist(block b)
{
if (scrop[b.opt.y][b.opt.x/2]==1||
scrop[b.pt2.y][b.pt2.x/2]==1||
scrop[b.pt3.y][b.pt3.x/2]==1||
scrop[b.pt4.y][b.pt4.x/2]==1)
return true;
else
return false;
}
//函数作用:移动方块
void move_block(block &b, char ch, int &lark){
block copyb = b;
switch(ch)
{
case 'l': //左移
b.opt.x=b.opt.x-2;
b.pt2.x=b.pt2.x-2;
b.pt3.x=b.pt3.x-2;
b.pt4.x=b.pt4.x-2;
break;
case 'r': //右移
b.opt.x=b.opt.x+2;
b.pt2.x=b.pt2.x+2;
b.pt3.x=b.pt3.x+2;
b.pt4.x=b.pt4.x+2;
break;
case 'd': //下移
b.opt.y=b.opt.y+1;
b.pt2.y=b.pt2.y+1;
b.pt3.y=b.pt3.y+1;
b.pt4.y=b.pt4.y+1;
break;
}

if(b.opt.x<0||b.opt.x>18||
b.pt2.x<0||b.pt2.x>18||
b.pt3.x<0||b.pt3.x>18||
b.pt4.x<0||b.pt4.x>18
) //过左右界还原
{
b = copyb;
}
if(b.opt.y>14||
b.pt2.y>14||
b.pt3.y>14||
b.pt4.y>14||
isexist(b)
) //到底还原或重叠还原
{
b = copyb;
lark = 0; //lark = 0 表示方块停下
}
//消除按左右键导致重叠时发生停留现象
if(ch=='l'||ch=='r')
{
lark = 1;
}
//消除按左右键导致重叠时发生停留现象...
}
//函数作用:改变当前方块的方向,注:一共有四个方向
void change_block(block &b, int i, int &j, int lark){
block copyb = b;
int orx = b.opt.x;
int ory = b.opt.y;
j = j+1;
j = j%4;
b = bloary[i][j];

if(b.opt.x<orx)
{
int i = orx - b.opt.x;
for(int j=0; j<i/2; j++)
{
b.opt.x=b.opt.x+2;
b.pt2.x=b.pt2.x+2;
b.pt3.x=b.pt3.x+2;
b.pt4.x=b.pt4.x+2;
}
}
if(b.opt.y<ory)
{
int i = ory - b.opt.y;
for(int j=0; j<i; j++)
{
b.opt.y=b.opt.y+1;
b.pt2.y=b.pt2.y+1;
b.pt3.y=b.pt3.y+1;
b.pt4.y=b.pt4.y+1;
}
}
if(b.opt.x<0||b.opt.x>18||
b.pt2.x<0||b.pt2.x>18||
b.pt3.x<0||b.pt3.x>18||
b.pt4.x<0||b.pt4.x>18
)
{
b = copyb;
j--;
}
if(b.opt.y>14||
b.pt2.y>14||
b.pt3.y>14||
b.pt4.y>14||
isexist(b)
)
{
b = copyb;
j--;
lark = 0;
}
}
// 函数作用:消行
void check(int &score){
bool mark = 1;
int line = 0;
int line_marked[4] = {0, 0, 0, 0}; // line_marked用于记录游戏空间中被全部标记的某一行的行号,(即需要被消去的行的行号)
int kai=0; // s 用于记录line_marked中当前被标记的个数
//检查哪些行需要消去
for(int i=0; i<15; i++)
{
for(int j=0; j<10; j++)
{
if(scrop[i][j]==0)
mark = 0;
}
if(mark==1)
{
line++;
line_marked[kai++] = i;
score++;
}
mark=1;
}
//检查哪些行需要消去...
go(25,21);
go(28, 21);
cout<<"分数: "<<score; //打印分数
if(score==100)
{
system("cls");
go(37,12);
out("通关",4);
othergetch();
exit(-1);
}
int dis = line;
//消行前闪烁
for(int goline=0; goline<kai; goline++)
{
color(0x04);
go(0,line_marked[goline]);

int s=0;
for(; s<10; s++)
{
out("■",2);
}
wait(.1f);
color(0x0d);
go(0,line_marked[goline]);
for(s=0; s<10; s++)
{
out("■",2);
}
wait(.1f);

}
//消行前闪烁...
kai = 0;
//消行
for(int k=1; k<=dis; ++k)
{
for (int p=line_marked[kai++]; p>=1; p--)
{
for (int q=0; q<10; q++)
{
scrop[p][q]=scrop[p-1][q];
}
}
for(int h=0; h<10; h++)
{
scrop[0][h]=0;
}
}
//消行...
}
//函数作用:当方块停留时,把方块四个点的坐标在游戏空间数组scrop[][]中的相应位置标记为1
void markspace(block b)
{
for (int i=0; i<15; i++)
{
for (int j=0; j<10; j++)
{
if((b.opt.x==2*j && b.opt.y==i)||
(b.pt2.x==2*j && b.pt2.y==i)||
(b.pt3.x==2*j && b.pt3.y==i)||
(b.pt4.x==2*j && b.pt4.y==i))
{
scrop[i][j]=1;
}
}
}
}
//函数作用:输出方块
void show_block(block b)
{
go(b.opt.x, b.opt.y);
show_unit();

换 TUROBO C吧 那个有汉化版的 其实用着挺简单的 你这个东西要是用VC改来改去太麻烦了 而且你还不太熟练 很难的

要你看懂? 你先看书吧。先学C++,《window程序设计》,再学VC++,然后学MFC,要C++都看不懂,退回去从C学起。

那代码是在Turbo C下编的吧?

vc6.0下想用C语言编写程序应该创建哪个文件?c++源文件就可以?_百度...
点击VC6.0->选择文件->点击新建->点击文件->选择C\/C++ Header File就可以直接用C语言来编程了

C语言开发软件 Visual C++ 6.0 下载和安装教程(附安装包)
确认安装信息无误后,点击"安装"按钮开始安装过程,耐心等待几分钟即可完成。兼容模式调整如果安装后无法运行,需将 VC++ 6.0 的兼容模式设置为Windows XP SP3 或 SP2。右键点击程序,选择"属性",在"兼容性"选项卡中,勾选"以兼容模式运行此程序"。软件资源下载对于寻找C语言开发工具的同学,我已经...

如何用visual c++6.0编写一个简单c语言程序
在Visual C++6.0中编写一个简单的C语言程序是一项基本技能,它可以帮助初学者了解程序的基本结构与运行流程。下面是一个简单的示例程序,该程序仅输出"Hello, World!"。要开始编写这个程序,您需要在Visual C++6.0环境中创建一个新的项目。选择"文件"菜单下的"新建"选项,然后选择"项目",在弹出的...

microsoft visual studio6.0里面能用C语言吗
可以是可以,不过可能有点问题,VS是面向对象可视化编程的环境,用C可能在编译调试时有些问题,可以用VC++!

C语言(Visual c++ 6.0版),解释下输出结果:
楼主你好,我的分析是,不可出现3,2的情况的。请你看下你下面的那条语句,vc中是先执行j,++j之后才会执行打印动作,打印完了一条语句才是结束。所以这两个i是都会变的,怎么也不会出现3,2的情况,除非你是打印 i+1,i;楼主应该知道i++,i的值的改变是在一条语句结束之后才会发生,也就是...

VC6.0(Visual C++ 6.0)使用教程(使用VC6.0编写C语言程序)
接着,新建C源文件。在“文件 -> 新建 ”菜单中选择“C++ Source File ”,填写文件名,如“ info.c ”。点击“确定 ”添加到工程中。编写C语言代码。双击源文件“ info.c ”,进入编辑界面。输入所需代码,完成编写。编译并运行代码。在菜单栏中选择“编译、组建、执行 ”,或使用快捷键Ctrl+f5...

怎么编写C语言程序,如:Helloworld的?
二、接下来,再点击工具栏下的文件,里面有个新建菜单,点击它,出现下图的对话框:1、点击确定即可,创建出一个helloworld.c的小程序,然后我们就可以编写我们的Hello World小程序了。此时就需要我们的VC++ 6.0来编译此程序,编译无错误才运行此程序,编译按钮和运行按钮如下图的红色箭头处:2、或者...

怎么用vc++6.0编写程序
正常的C\/C++编程过程是:编辑——编译——链接构建——执行。 编辑:即编写源码,用C\/C++来描述程序的执行流程及算法。 编译:即将C\/C++源码转换成汇编语言,再有汇编编译器,将汇编语言编译成二进制文件。在VC++6.0中这个程序是cl.exe(在vc++6.0的安装目录可以找到它)。 链接构建:每个程序会...

C语言C++6.0里我想打扑克牌的花色符号
如果你想按键输入再输出的话,可以把按键的ASCII值再减去相应的值,就可以得到 比如 按键为 “0” 然后减去0x27(十六进制) 这样就得到 红桃字符,以此类推...简单的输出这四个字符:include <stdio.h> void main(){ char i;i = 3;for(i;i<7;i++){ printf("%c\\n",i);} } 下面...

dev-c++中的c语言游戏代码
include include <stdio.h> include <stdlib.h> include <windows.h> define U 1 define D 2 define L 3 define R 4 \/\/蛇的状态,U:上 ;D:下;L:左 R:右 typedef struct SNAKE { \/\/蛇身的一个节点 int x;int y;struct SNAKE *next;} snake;\/\/全局变量\/\/ int score=0,ad...