看别人都编了俄罗斯方块,
我也为训练一下C编程,也编了一下
里面只用了几个绘图语句
一个二维数组存整个游戏里的方块的位置和屏幕上的一一对应
还有一个结构体定义和两个指向它的指针now(指向现在活动的方块) ,next(指向下一个活动的方块)
一个结构体数组来存每一个方块的每一个状态的坐标情况
其实程序本来可以更小的但是为了美观
又增加了一些彩色文字指示
结果源文件又增加了不少:
我的程序有一个函数,就是那个绘方块的函数
它不但可以在屏幕上绘出图像面全还可以改变在数组中对应的值,
本来以为是个好想法
但在应用又出现许多问题
比如只须改变数组的值的时候还要重绘屏幕结果减少了不少效率,
还有在编的时候
还出现了许多莫名其妙的问题
真把我气死了几回
不过那些问题还是在我的努力下
攻破了
太高兴了!!#include<graphics.h>
#include<dos.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<bios.h>
#define ESC 0x011b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ENTER 0x1c0d
#define LX 90
#define LY 3
#define WAITTIME 60
int map[10][15];
struct boxes
{int number;
int t;
int box[4][4][2];
}*now,*next;
int x,y,score=0;
char c[8];
struct boxes mybox[6]={
{4,0,{{{0,0},{1,0},{0,1},{1,1}},{{0,0},{1,0},{0,1},{1,1}},{{0,0},{1,0},{0,1},{1,1}},{{0,0},{1,0},{0,1},{1,1}}}},
{4,0,{{{0,0},{0,1},{0,2},{0,3}},{{0,0},{1,0},{2,0},{3,0}},{{0,0},{0,1},{0,2},{0,3}},{{0,0},{1,0},{2,0},{3,0}}}},
{4,0,{{0,0,1,0,1,1,1,2},{2,0,0,1,1,1,2,1},{0,0,0,1,0,2,1,2},{0,0,1,0,2,0,0,1}}},
{4,0,{{0,0,0,1,0,2,1,0},{0,0,1,0,2,0,2,1},{0,2,1,0,1,1,1,2},{0,0,0,1,1,1,2,1}}},
{4,0,{{0,0,0,1,1,1,0,2},{0,0,1,0,2,0,1,1},{0,1,1,0,1,1,1,2},{1,0,0,1,1,1,2,1}}},
{4,0,{{0,0,0,1,1,1,1,2},{1,0,2,0,0,1,1,1},{0,0,0,1,1,1,1,2},{1,0,2,0,0,1,1,1}}}
};
void initgra()
{int dr=DETECT,mode=0;
initgraph(&dr,&mode,"");
}
char *ntos(int n, char *c)
{long i=0,j,k;
if (n==0){c[0]='0';c[1]=0;return c;}
for(j=5;j>=0;j--)
{
k=n/pow(10,j);
if(k>0||n==0)
{c[i++]=k+'0';
n=n-k*pow(10,j);}
}
c[i]=0;
return©;
}
void initgame()
{int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<15;j++)
map[i][j]=0;
}
randomize();
setlinestyle(0,0,3);
setcolor(1);
rectangle(LX-3,LY-3,LX+300,LY+450);
rectangle(LX+12*30-3,LY+5*30-3,LX+16*30+3,LY+9*30+3);
setcolor(1);
settextstyle(0,0,3);
outtextxy(420,50,"score :");
setcolor(4);
outtextxy(430,100,ntos(score,c));
now=&mybox[random(5)];
next=&mybox[random(5)];
drawbox(12,5,next,4,0);
x=4;y=0;
drawbox(x,y,now,4,1);
}
int checkinbox(int x1 ,int y1)
{int i,x2,y2,t,r=0,k;
t=now->t;
for(i=0;i<now->number;i++)
{ x2=x1+now->box[t][i][0];
y2=y1+now->box[t][i][1];
if(x2<0){r=1;break;}
else if(x2>=10){r=2;break;}
else if(y2<0){r=0;break;}
else if(y2>=15){r=3;break;}
else if(map[x2][y2]==1){r=3;break;}
}
return(r);
}
drawbox(int x1,int y1,struct boxes *box,int c,int in)
{int i,x2,y2,t;
setcolor©;
setfillstyle(1,c);
t=box->t;
for(i=0;i<box->number;i++)
{ x2=x1+box->box[t][i][0];
y2=y1+box->box[t][i][1];
if (y>=0){
if(in==1){if(c==0) map[x2][y2]=0;else map[x2][y2]=1;}
x2=x2*30+LX;
y2=y2*30+LY;
bar(x2,y2,x2+27,y2+27);
我也为训练一下C编程,也编了一下
里面只用了几个绘图语句
一个二维数组存整个游戏里的方块的位置和屏幕上的一一对应
还有一个结构体定义和两个指向它的指针now(指向现在活动的方块) ,next(指向下一个活动的方块)
一个结构体数组来存每一个方块的每一个状态的坐标情况
其实程序本来可以更小的但是为了美观
又增加了一些彩色文字指示
结果源文件又增加了不少:
我的程序有一个函数,就是那个绘方块的函数
它不但可以在屏幕上绘出图像面全还可以改变在数组中对应的值,
本来以为是个好想法
但在应用又出现许多问题
比如只须改变数组的值的时候还要重绘屏幕结果减少了不少效率,
还有在编的时候
还出现了许多莫名其妙的问题
真把我气死了几回
不过那些问题还是在我的努力下
攻破了
太高兴了!!#include<graphics.h>
#include<dos.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<bios.h>
#define ESC 0x011b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ENTER 0x1c0d
#define LX 90
#define LY 3
#define WAITTIME 60
int map[10][15];
struct boxes
{int number;
int t;
int box[4][4][2];
}*now,*next;
int x,y,score=0;
char c[8];
struct boxes mybox[6]={
{4,0,{{{0,0},{1,0},{0,1},{1,1}},{{0,0},{1,0},{0,1},{1,1}},{{0,0},{1,0},{0,1},{1,1}},{{0,0},{1,0},{0,1},{1,1}}}},
{4,0,{{{0,0},{0,1},{0,2},{0,3}},{{0,0},{1,0},{2,0},{3,0}},{{0,0},{0,1},{0,2},{0,3}},{{0,0},{1,0},{2,0},{3,0}}}},
{4,0,{{0,0,1,0,1,1,1,2},{2,0,0,1,1,1,2,1},{0,0,0,1,0,2,1,2},{0,0,1,0,2,0,0,1}}},
{4,0,{{0,0,0,1,0,2,1,0},{0,0,1,0,2,0,2,1},{0,2,1,0,1,1,1,2},{0,0,0,1,1,1,2,1}}},
{4,0,{{0,0,0,1,1,1,0,2},{0,0,1,0,2,0,1,1},{0,1,1,0,1,1,1,2},{1,0,0,1,1,1,2,1}}},
{4,0,{{0,0,0,1,1,1,1,2},{1,0,2,0,0,1,1,1},{0,0,0,1,1,1,1,2},{1,0,2,0,0,1,1,1}}}
};
void initgra()
{int dr=DETECT,mode=0;
initgraph(&dr,&mode,"");
}
char *ntos(int n, char *c)
{long i=0,j,k;
if (n==0){c[0]='0';c[1]=0;return c;}
for(j=5;j>=0;j--)
{
k=n/pow(10,j);
if(k>0||n==0)
{c[i++]=k+'0';
n=n-k*pow(10,j);}
}
c[i]=0;
return©;
}
void initgame()
{int i,j;
for(i=0;i<10;i++)
{
for(j=0;j<15;j++)
map[i][j]=0;
}
randomize();
setlinestyle(0,0,3);
setcolor(1);
rectangle(LX-3,LY-3,LX+300,LY+450);
rectangle(LX+12*30-3,LY+5*30-3,LX+16*30+3,LY+9*30+3);
setcolor(1);
settextstyle(0,0,3);
outtextxy(420,50,"score :");
setcolor(4);
outtextxy(430,100,ntos(score,c));
now=&mybox[random(5)];
next=&mybox[random(5)];
drawbox(12,5,next,4,0);
x=4;y=0;
drawbox(x,y,now,4,1);
}
int checkinbox(int x1 ,int y1)
{int i,x2,y2,t,r=0,k;
t=now->t;
for(i=0;i<now->number;i++)
{ x2=x1+now->box[t][i][0];
y2=y1+now->box[t][i][1];
if(x2<0){r=1;break;}
else if(x2>=10){r=2;break;}
else if(y2<0){r=0;break;}
else if(y2>=15){r=3;break;}
else if(map[x2][y2]==1){r=3;break;}
}
return(r);
}
drawbox(int x1,int y1,struct boxes *box,int c,int in)
{int i,x2,y2,t;
setcolor©;
setfillstyle(1,c);
t=box->t;
for(i=0;i<box->number;i++)
{ x2=x1+box->box[t][i][0];
y2=y1+box->box[t][i][1];
if (y>=0){
if(in==1){if(c==0) map[x2][y2]=0;else map[x2][y2]=1;}
x2=x2*30+LX;
y2=y2*30+LY;
bar(x2,y2,x2+27,y2+27);