求代码。用c语言实现炸d俄罗斯方块,形状尽量多一些,取得一定成绩会自动清空图中方块。

求代码。用c语言实现炸d俄罗斯方块,形状尽量多一些,取得一定成绩会自动清空图中方块。,第1张

你好。试试这个#include 

#include 

#include 

#include 

#include 

#include 

#include 

#define ESC 0x011b

#define UP 0x4800

#define DOWN 0x5000

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define SPACE 0x3920

#define Y 0x1579

#define N 0x316e

#define clearkbd() while(bioskey(1)) bioskey(0) /*清空键盘缓冲队列*/

void update()

void messagebox()

void process()

void initremove()

void initinfo()

void initbox()

void initposition()

void next_shape()

typedef struct shape /*形状单一状态的记录*/

{ int attr

int co[8]

}shape

typedef struct RE_AB /*相对,绝对坐标记录*/

{ int Rx,Ry

int x1,x2,y1,y2

}RE_AB

RE_AB RA

shape p[19]={ { RED,0,1,1,0,1,1,2,1 }, /*数组中保证y最大的在最后,以便initposition使用*/

{ RED,0,1,1,0,1,1,1,2 },

{ RED,0,0,1,0,2,0,1,1 },

{ RED,0,0,0,1,1,1,0,2 },

{ GREEN,0,0,1,0,2,0,3,0 },

{ GREEN,0,0,0,1,0,2,0,3 },

{ CYAN,0,0,0,1,1,0,1,1 },

{ BROWN,0,0,1,0,1,1,2,1 },

{ BROWN,1,0,0,1,1,1,0,2 },

{ BLUE,1,0,2,0,1,1,0,1 },

{ BLUE,0,0,0,1,1,1,1,2 戚凳},

{ MAGENTA,0,0,0,1,0,2,1,2 },

{ MAGENTA,2,0,0,1,1,1,2,1},

{ MAGENTA,0,0,1,0,1,1,1,2 },

{ MAGENTA,0,0,0,1,1,0,2,0 },

{ YELLOW,0,2,1,0,1,1,1,2 },

{ 灶仔租YELLOW,0,0,1,0,2,0,2,1 },

{ YELLOW,1,0,0,0,0,1,0,2},

{ YELLOW,0,0,0,1,1,1,2,1 },

}

int nback,nleft,nright,r_f[12][22],rs1,rs2,xcors,xcorb,ycors,ycorb 

/*检查隐兆方快有没有左,右,下接触,游戏区内所有格子有无颜色记录数组,rs1形状记录,rs2为提示框用,记录小格子在游戏区中的位置,按键存储*/

void interrupt (*oldint)() /*系统定时中断*/

int count_down=0,count_other=0 /*中断记时*/

void interrupt newint() /*设置新的中断程序*/

{ count_down++

count_other++

oldint()

}

void intenable() /*设置中断向量表,启动新的中断程序*/

{ oldint=getvect(0x1c)

disable()

setvect(0x1c,newint)

enable()

}

void intrestore() /*恢复中断向量*/

{ disable()

setvect(0x1c,oldint)

enable()

}

void HZ12(int x0,int y0,int w,int color,char *s) /*根据字模,在dos下显示汉字*/

/*横坐标,纵坐标,字间隔,汉字颜色,汉字字符串*/

{ FILE *fp

register char buffer[24]

register char str[2]

unsigned long fpos/*fpos为最终偏移动量*/

register int i,j,k

fp=fopen(hzk12,r)/*打开12*12汉字苦*/

while(*s)/*一直到字符串结束为止*/

{

if(*s<0)/*汉字输出*/

{ str[0]=(*s)-0xa0

str[1]=*(s+1)-0xa0

fpos=((str[0]-1)*94+(str[1]-1))*24L/*计算汉字在hzk12的偏移量*/

fseek(fp,fpos,SEEK_SET)/*指针移动到当前位置*/

fread(buffer,24,1,fp)/*读取一个汉字到数组中*/

for(i=0i<12i++)/*12行*/

for(j=0j<2j++)/*两个字节*/

for(k=0k<8k++)/*8位*/

if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)/*是一就画点*/

putpixel(x0+8*j+k,y0+i,color)

s+=2/*一个汉字占两个字节,现在将指针移动两个字节*/

x0+=w/*显示坐标也按照间隔移动*/

}

else/*显示非汉字字符*/

{ settextstyle(0,0,1)

setcolor(color)

str[0]=*sstr[1]=0

outtextxy(x0,y0+3,str)/*显示单个字符*/

x0+=w-7/*显示单个字符后的x坐标变化*/

s++/*指针移动到下一个字节*/

}

}

fclose(fp)

}

void translation() /*把相对坐标解释为绝对坐标*/

{ if(RA.Rx==1)

{ RA.x1=1 RA.x2=16 }

else

{ RA.x1=16*(RA.Rx-1) RA.x2=16*RA.Rx }

if(RA.Ry==1)

{ RA.y1=1 RA.y2=16 }

else

{ RA.y1=16*(RA.Ry-1) RA.y2=16*RA.Ry }

}

int check_b() /*检查是否到达低部*/

{ int x,y,i,zf=0 /*zf为是否有颜色填充记录*/

for(i=0i<7i++,i++)

{ x=RA.Rx+p[rs1].co[i]

y=RA.Ry+p[rs1].co[i+1]

if(y>=6)

zf+=r_f[x-15][y-6+1]

}

if(zf==0)

return 1

else

return 0

}

int finish()

{ int tfull=0,i /*判断顶层空间是否有填充*/ 

for(i=1i<11i++)

tfull+=r_f[i][1]

if(tfull!=0)

return 1 /*告诉judge()可以结束了*/

}

int check_l() /*检查形状是否与左接触*/

{ int x,y,i,zf=0

for(i=0i<7i++,i++)

{ x=RA.Rx+p[rs1].co[i]

y=RA.Ry+p[rs1].co[i+1]

if(y>6)

zf+=r_f[x-15-1][y-6]

if(y<=6&&x==16)

zf+=1

}

if(zf==0)

return 1

else

return 0

int check_r() /*检查形状是否与右接触*/

{ /*zf为是否有颜色填充记录*/

int x,y,i,zf=0 /*zf为是否有颜色填充记录*/

for(i=0i<7i++,i++)

{

x=RA.Rx+p[rs1].co[i]

y=RA.Ry+p[rs1].co[i+1]

if(y>6)

zf+=r_f[x-15+1][y-6]

if(y<=6&&x==25)

zf+=1

}

if(zf==0)

return 1

else

return 0

}

void check_touch()

{ nback=check_b()

nleft=check_l()

nright=check_r()

}

void draw(int cb) /*画形状,cb=1以填充色画形状,cb=2以背景色画形状,cb=3以白色画形状*/

{ int i,recordx=RA.Rx,recordy=RA.Ry

for(i=0i<7i++,i++)

{ RA.Rx+=p[rs1].co[i]

RA.Ry+=p[rs1].co[i+1]

if(RA.Ry<=6)

{ RA.Rx=recordx

RA.Ry=recordy

continue

}

translation()

if(cb==1)

setfillstyle(1,p[rs1].attr)

else

if(cb==2)

setfillstyle(1,BLACK)

else

if(cb==3)

{ setfillstyle(1,WHITE)

r_f[RA.Rx-15][RA.Ry-6]=1 /*置对应数组标记元素*/

}

bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1)

RA.Rx=recordx

RA.Ry=recordy

}

}

void mov(int key) /*向下,左,右移动方块*/

{ draw(2)

if(key==LEFT&&nleft)

RA.Rx--

else

if(key==RIGHT&&nright)

RA.Rx++

else

RA.Ry++

nback=check_b()

if(nback) /*判断形状有没有到达底部,有就将其颜色变为白色*/

draw(1)

else

draw(3)

}

void change() /*变换形状*/

{ int status=rs1,buffer,i,x,y,zf=0

if(p[rs1].attr==p[rs1+1].attr)

rs1++

else

while(p[rs1].attr==p[rs1-1].attr)

rs1--

for(i=0i<7i++,i++) /*检查变化形状后是否与已存形状发生冲突*/

{ x=RA.Rx+p[rs1].co[i]

y=RA.Ry+p[rs1].co[i+1]

if(y>6)

zf+=r_f[x-15][y-6] 

}

if(zf!=0) 

rs1=status 

buffer=rs1

rs1=status

status=buffer

draw(2)

buffer=rs1

rs1=status

status=buffer

nback=check_b() /*判断变化后的形状是不是到达了低部,这个检查是十分必要的*/

if(nback) 

draw(1)

else

draw(3)

}

void accelerate()

{ if(count_down>=1)

{ check_touch() /*消除上一步动作对方块状态的影响*/

count_down=0

if(nback) /*0表示到达底部,1表示没有到达*/

mov(DOWN)

}

}

void drawbox() /*画方块所在方框*/

{ int xcor,ycor

for(xcor=xcorsxcor<=xcorbxcor++)

for(ycor=ycorsycor<=ycorbycor++)

{ if(xcor==xcors||xcor==xcorb||ycor==ycors||ycor==ycorb)

{ RA.Rx=xcor

RA.Ry=ycor

translation()

setfillstyle(1,DARKGRAY)

bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1)

}

}

}

void erasure(int k)

{ int i,j,recordx=RA.Rx,recordy=RA.Ry

{ j=k-1

for(j>0j--)

{ for(i=1i<11i++)

{ r_f[i][j+1]=r_f[i][j]

RA.Rx=i+15

RA.Ry=j+1+6

translation()

if(r_f[i][j+1]==1)

setfillstyle(1,WHITE)

else

setfillstyle(1,BLACK)

bar(RA.x1+1,RA.y1+1,RA.x2-1,RA.y2-1)

RA.Rx=recordx

RA.Ry=recordy

}

}

}

}

void pause()

{ HZ12(450,400,15,BLACK,正常)

HZ12(450,400,15,GREEN,暂停)

for()

if(bioskey(1)&&bioskey(0)==SPACE)

{ clearkbd()

HZ12(450,400,15,BLACK,暂停)

HZ12(450,400,15,RED,正常)

return

}

}

void judge() 

{ int i,j,full=0 /*full等于10说明某一行满,该消除了*/ 

if(finish()) /*判断游戏是否该结束了*/

messagebox() /*win编程里有这个函数*/ 

for(j=1j<21j++) /*判断某一行是否满了*/

{ for(i=1i<11i++)

full+=r_f[i][j]

if(full==10)

erasure(j) /*消除这行*/ 

full=0

}

}

void update() /*使程序可以重新运行*/

{ cleardevice()

setbkcolor(BLACK)

initinfo() /*提示信息初始化*/

initbox() /*游戏框架初始化*/

srand((unsigned)time(NULL)) /*随机器函数的初始化*/

rs1=random(19)

rs2=random(19)

next_shape()

initposition() /*方块最开始的出现位置*/

initremove() /*记录每个方格有无颜色填充数组初始化*/

HZ12(450,400,15,RED,正常)

process()

}

void EXIT()

{ closegraph()

intrestore() /*恢复中断向量*/

exit(0)

}

void initremove()

{ int i,j

for(i=0i<12i++)

for(j=0j<22j++)

if(i==0||i==11||j==0||j==21)

r_f[i][j]=1

else

r_f[i][j]=0

}

void initinfo()

{ char aStr[2]

setcolor(RED)

outtextxy(450,100,This game's writer is:)

HZ12(450,140,15,RED,该程序作者:NULL)

outtextxy(525,110,NULL)

outtextxy(450,180,FUNCTION FOR KEYS:)

outtextxy(450,200,UP:change the shape)

outtextxy(450,210,DOWN:accelerate)

outtextxy(450,220,LEFT:move left)

outtextxy(450,230,RIGHT:move right)

outtextxy(450,240,ESC:exit this game)

outtextxy(450,250,SPACE:pause)

HZ12(450,260,20,RED,上:)

HZ12(450,280,20,RED,下:)

HZ12(450,300,20,RED,左:)

HZ12(450,320,20,RED,右:)

HZ12(450,340,20,RED,ESC:退出)

HZ12(450,360,15,RED,空格: 暂停/开始)

HZ12(450,380,15,RED,目前状态:)

HZ12(20,200,15,RED,下一个形状)

aStr[0]=24

aStr[1]=0

aStr[6]=0

HZ12(480,260,12,GREEN,aStr)

HZ12(500,260,12,GREEN,( 变形 ))

aStr[0]=25

aStr[1]=0

HZ12(480,280,12,GREEN,aStr)

HZ12(500,280,12,GREEN,( 加速 ))

aStr[0]=27

aStr[1]=0

HZ12(480,300,12,GREEN,aStr)

HZ12(500,300,12,GREEN,向左)

aStr[0]=26

aStr[1]=0

HZ12(480,320,12,GREEN,aStr)

HZ12(500,320,12,GREEN,向右)

}

void messagebox()

{ int key

setcolor(GREEN)

setfillstyle(1,DARKGRAY)

rectangle(220,200,420,300)

bar(221,201,419,299)

HZ12(280,210,15,GREEN,GAME OVER)

HZ12(275,230,15,GREEN,重新游戏: Y) 

HZ12(275,270,15,GREEN,退出游戏: N) 

HZ12(450,400,15,BLACK,正常)

HZ12(450,400,15,GREEN,GAME OVER)

for()

if(bioskey(1))

{ key=bioskey(0)

if(key==Y)

{ clearkbd()

update()

}

else

if(key==N)

{ clearkbd()

EXIT()

}

else

clearkbd()

}

}

void initbox()

{ xcors=15 /*画游戏框*/

xcorb=26

ycors=6

ycorb=27

drawbox()

xcors=2 /*画提示框*/

xcorb=7

ycors=6

ycorb=11

drawbox()

}

void initposition()

{ RA.Rx=18

RA.Ry=6-p[rs1].co[7]

RA.x1=0

RA.x2=0

RA.y1=0

RA.y2=0

}

void next_shape() /*画下一形状提示框*/

{ int recordx=RA.Rx,recordy=RA.Ry,buffer

RA.Rx=3

RA.Ry=7

draw(2)

buffer=rs1

rs1=rs2

rs2=buffer

draw(1)

RA.Rx=recordx

RA.Ry=recordy

buffer=rs1

rs1=rs2

rs2=buffer

}

void process() /*游戏过程*/

{ for()

{ check_touch()

if(!nback)

{ rs1=rs2

rs2=random(19) /*产生另一种方块的码数*/ 

initposition()

judge() /*判断某一行是否满了和这个游戏是否可以结束了*/

draw(1)

next_shape()

}

if(count_other>=1) 

{ count_other=0 

if(bioskey(1)) /*对按键的处理*/

{ int key=bioskey(0)

clearkbd() /*清除键盘缓冲队列*/

if(key==ESC)

EXIT()

if(key==LEFT&&nleft&&nback)

mov(LEFT) 

if(key==RIGHT&&nright&&nback)

mov(RIGHT)

if(key==UP&&nback) 

change()

if(key==SPACE)

pause()

if(key==DOWN)

accelerate()

}

}

if(count_down>=4)

{ check_touch() /*消除上一步动作对方块状态的影响*/

count_down=0

if(nback) /*0表示到达底部,1表示没有到达*/

mov(DOWN)

}

}/*for*/

}

main()

{ int gdriver=DETECT,gmode=0 

initgraph(&gdriver,&gmode,d:turboc) /*启动图形与中断部分*/

intenable()

update()

}

本代码片誉凳段,只作为vb语言编程练习,不具备定时炸d控制功能。

Dim tt As Date, ttt As Date, tttt 庆仔旅As Date

Private Sub Command1_Click()

  Timer1.Interval = 1000

  tt = InputBox("输入格式:0:00:00", "请输入定时时长", "0:00:30")

  Label1.Caption = "定时时长:" & tt

  tttt = tt + Time

End Sub

Private Sub Form_Load()

  Timer1.Interval = 0

End Sub

Private Sub Timer1_Timer()

  ttt = tttt - Time

  Label2.Caption = ttt

  If ttt = 0 Then

  戚袭  Beep

    Timer1.Interval = 0

  End If

End Sub


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12393740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存