自己写的俄罗斯方块
<P>好久没来了,现在做单片机去了.也把以前老想做的俄罗斯方块弄完了.弄出来大家看看,有什么意见建议尽管说.<br>第一次传的时候没有把EGAVGA.BGI放进去就不能运行.现在有了可以运行了.斑竹重新下吧.<br><br></P>[attach]13801[/attach]<br>[align=right][color=#000066][此贴子已经被作者于2006-11-14 17:08:23编辑过][/color][/align]
[align=right][color=#000066][此贴子已经被作者于2006-11-13 14:31:25编辑过][/color][/align]
<P>第一次忘了考.BGI.大家要看的话下后一个.太冷了.</P> 呵呵 [IMG]C:\Documents and Settings\Administrator\桌面\俄罗斯方快\到顶是的画面.bmp[/IMG][IMG]C:\Documents and Settings\Administrator\桌面\俄罗斯方快\刚开始.bmp[/IMG] [IMG]C:\Documents and Settings\Administrator\桌面\俄罗斯方快\运行中.bmp[/IMG] [IMG]C:\Documents and Settings\Administrator\桌面\俄罗斯方快\到顶是的画面.bmp[/IMG] [IMG]C:\Documents and Settings\Administrator\桌面\俄罗斯方快\再次玩的画面.bmp[/IMG] <P>斑竹看过没有?有什么建议?</P>
[align=right][color=#000066][此贴子已经被作者于2006-11-14 16:15:10编辑过][/color][/align]
我只看了截图,因为无法进入游戏。 <P>你重新下后面的那一个啊.</P>郁闷,图被删了.
[align=right][color=#000066][此贴子已经被作者于2006-11-14 17:01:52编辑过][/color][/align]
是下的后面那个,有BGI有那个 <P>斑竹能不能把让jig把五子棋的算法给我一下或者放论坛里面?我很感兴趣.<a href="mailto:hjj1123@sina.com" target="_blank" >hjj1123@sina.com</A></P> JIG晚上应该会来论坛,你可以等他的回复。 <P>算了我把原代码贴上来得了.你那去编译下,用TC.<br>如果有人转贴请写上作者和出处.<br>#include<stdio.h><br>#include<stdlib.h><br>#include<conio.h><br>#include<time.h><br>#include<dos.h><br>#include<graphics.h><br>#define INDEX 10<br>#define COLOR 2<br>unsigned int i,j;<br>unsigned int b[4][4];<br>unsigned int xiao[4];<br>unsigned int i,j,m;<br>unsigned int q,c[8];<br>struct data{ int a[4][4];}k[5]={{1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},<br> {0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0},<br> {0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0},<br> {1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0},<br> {1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}<br> };<br>void welcome()<br>{ unsigned int i,j;<br> clrscr();<br> textmode(C40);<br> for(i=0;i<40;i++)<br> printf("*");<br> for(j=1;j<24;j++)<br> { printf("*");<br> gotoxy(40,j);<br> printf("*");<br> }<br> for(i=0;i<40;i++)<br> printf("*");<br> gotoxy(10,8);<br> textcolor(RED);<br> cprintf("WELCOME !");<br> gotoxy(15,15);<br> textcolor(YELLOW);<br> cprintf("made by HJJ ");<br> gotoxy(15,16);<br> cprintf("2006-11-11");<br> gotoxy(5,20);<br> textcolor(GREEN);<br> cprintf("press any key to continue !");<br> getch();<br>}<br>void mydelay(int clicks)<br>{ unsigned int now=*(unsigned int far *)0x0000046c;<br> while(abs(*(unsigned int far *)0x0000046c-now)<clicks)<br> { }<br>}<br>void minidraw(int x,int y,int index,int color)<br>{ setcolor(color);<br> setlinestyle(SOLID_LINE,0,1);<br> line(x,y,x+index,y);<br> line(x+index,y,x+index,y+index);<br> line(x+index,y+index,x,y+index);<br> line(x,y+index,x,y);<br>}<br>void draw(int x,int y,int index,int color)<br>{ minidraw(x,y,index,color);<br> minidraw(x+1,y+1,index-2,color);<br> minidraw(x+2,y+2,index-4,color);<br>}<br>void drawall(int x,int y,int index,int color)<br>{ unsigned int r,s;<br> for(r=0;r<4;r++)<br> for(s=0;s<4;s++)<br> if(b[r][s]==1) draw(x+s*INDEX,y+r*INDEX,index,color);<br>}<br>int mygetimage(int x,int y,int index,char *filename)<br>{ unsigned long size;<br> char *buffer;<br> FILE *fp;<br> size=(unsigned long)imagesize(0,0,4*index,4*index);<br> fp=fopen(filename,"wb") ;<br> if(fp==NULL) { fclose(fp);<br> printf("file open failled !");<br> exit(0);<br> }<br> buffer=(char *)malloc(size);<br> if(buffer==NULL) return 0;<br> getimage(x,y,x+4*index,y+4*index,buffer);<br> fwrite(buffer,size,1,fp);<br> free(buffer);<br> fclose(fp);<br> return(1);<br>}<br>void myputimage(int x,int y,char *filename)<br>{ FILE *fp;<br> char *buffer;<br> unsigned long size=imagesize(0,0,4*INDEX,4*INDEX);<br> fp=fopen(filename,"rb");<br> if(fp==NULL) { fclose(fp);<br> printf("open file failled !");<br> exit(0);<br> }<br> buffer=(char *)malloc(size) ;<br> fread(buffer,size,1,fp);<br> putimage(x,y,buffer,XOR_PUT);<br> free(buffer);<br> fclose(fp);<br>}<br>void converting()<br>{ unsigned int r,s;<br> for(r=0;r<4;r++)<br> for(s=0;s<4;s++)<br> b[r][s]=k[m].a[r][s];<br>}<br>void initial()<br>{ unsigned int gdriver=ATT400,gmode=ATT400C3;<br> registerbgidriver(EGAVGA_driver);<br> initgraph(&gdriver,&gmode,"");<br> cleardevice();<br> line(100,10,250,10);<br> line(250,10,250,170);<br> line(250,170,100,170);<br> line(100,170,100,10);<br> line(200,10,200,170);<br> i=130;<br> j=10;<br> m=randmake();<br> converting();<br> drawall(205,15,INDEX-1,COLOR);<br> mygetimage(205,15,INDEX,"picture.dat");<br>}<br>int getkey()<br>{ union REGS rg;<br> rg.h.ah=0;<br> int86(0x16,&rg,&rg);<br> return rg.x.ax;<br>}<br>int checktop()<br>{ if(checktopmini()<=10+ymini()*INDEX) return 0;<br> return 1;<br>}<br>int checktopmini()<br>{ int r,s,mini=160,flagx=0;<br> for(s=170;s>0;s-=INDEX)<br> { for(r=100;r<201;r+=INDEX)<br> if(getpixel(r,s-1)==COLOR)<br> { if(s<=mini) mini=s;<br> r=201;<br> flagx=1;<br> }<br> if(flagx==0) s=10;<br> }<br> return mini;<br>}<br>int checkdown(unsigned int y1)<br>{ unsigned int r,s,x1;<br> x1=i;<br> for(r=0;r<4;r++)<br> for(s=0;s<4;s++)<br> if(b[r][s]==1&&(b[r+1][s]==0||r==3))<br> if(getpixel(x1+s*INDEX+1,y1+(r+1)*INDEX+2)==COLOR)<br> return 0;<br> return 1;<br>}<br>int checknow()<br>{ unsigned int r,s;<br> for(r=0;r<4;r++)<br> for(s=0;s<4;s++)<br> if(b[r][s]==1&&(b[r+1][s]==0||r==3))<br> if(getpixel(i+s*INDEX+1,j+r*INDEX+2)==COLOR)<br> return 0;<br> return 1;<br>}<br>int checkfull()<br>{ int r,s,flag;<br> int o=0;<br> for(s=10;s<170;s+=INDEX)<br> { flag=1;<br> for(r=100;r<200;r+=INDEX)<br> if(getpixel(r+1,s+2)!=COLOR)<br> { flag=0;<br> r=190;<br> }<br> if(flag==1) xiao[o++]=s;<br> }<br> return o;<br>}<br>void inexistence()<br>{ int p,t;<br> char *buffer;<br> unsigned int size=imagesize(101,10,199,19);<br> buffer=(char *)malloc(size);<br> if(buffer==NULL) { free(buffer);<br> printf("malloc failed !");<br> exit(0);<br> }<br> for(p=0;p<4;p++)<br> { if(xiao[p]>0)<br> { getimage(101,xiao[p],199,xiao[p]+9,buffer);<br> putimage(101,xiao[p],buffer,XOR_PUT);<br> for(t=xiao[p]-10;t>10;t-=INDEX)<br> { getimage(101,t,199,t+INDEX-1,buffer);<br> putimage(101,t,buffer,XOR_PUT);<br> putimage(101,t+INDEX,buffer,COPY_PUT);<br> }<br> xiao[p]=0;<br> }<br> }<br> free(buffer);<br>}<br>void rightmove()<br>{ int r,s,xm;<br> int flag=1;<br> xm=xmini();<br> for(r=0;r<4;r++)<br> for(s=0;s<4;s++)<br> if(b[r][s]==1&&(s==3||b[r][s+1]==0))<br> if(getpixel(i+(s+1)*INDEX+2,j+r*INDEX+2)==COLOR) flag=0;<br> if(flag==1&&i<200-xm*INDEX)<br> { myputimage(i,j,"picture.dat");<br> i+=INDEX;<br> myputimage(i,j,"picture.dat");<br> }<br>}<br>void leftmove()<br>{ int r,s;<br> int flag=1;<br> for(r=0;r<4;r++)<br> for(s=0;s<4;s++)<br> if(b[r][s]==1&&(s==0||b[r][s-1]==0))<br> if(getpixel(i+s*INDEX-2,j+r*INDEX+2)==COLOR) flag=0;<br> if(flag==1&&i>100)<br> { myputimage(i,j,"picture.dat");<br> i-=INDEX;<br> myputimage(i,j,"picture.dat");<br> }<br>}<br>int fastmove()<br>{<br> unsigned int x,y;<br> x=i;<br> y=j;<br> while(checkdown(y)&&y<160-ymini()*INDEX)<br> y+=INDEX;<br> myputimage(i,j,"picture.dat");<br> myputimage(x,y,"picture.dat");<br> j=y;<br>}<br>int ymini()<br>{ int r,s,mini=0;<br> for(r=0;r<4;r++)<br> { for(s=0;s<4;s++)<br> if(b[r][s]==1)<br> { mini+=1;<br> s=4;<br> }<br> }<br> return mini;<br>}<br>int xmini()<br>{ int r,s,mini=0;<br> for(r=0;r<4;r++)<br> { for(s=0;s<4;s++)<br> if(b[s][r]==1)<br> { mini+=1;<br> break;<br> }<br> }<br> return mini;<br>}<br>int randmake()<br>{ unsigned int m;<br> srand((unsigned)time(NULL));<br> m=rand()%5;<br> return m;<br>}<br>void endmanage()<br>{ myputimage(205,15,"picture.dat");<br> j=10;<br> i=130;<br> m=randmake();<br> converting();<br> drawall(205,15,INDEX-1,COLOR);<br> mygetimage(205,15,INDEX,"picture.dat");<br> mygetimage(205,15,INDEX,"picture1.dat");<br> if(checkfull()) inexistence();<br>}<br>void fall()<br>{ unsigned int clock=4;<br> unsigned char *adress;<br> myputimage(i,j,"picture.dat");<br> myputimage(i,j+INDEX,"picture.dat");<br> j+=INDEX;<br> while(clock--)<br> { if(bioskey(1)==0) mydelay(2);<br> else return;<br> }<br>}<br>unsigned int checkmove()<br>{ if(checknow())<br> { if(j<checktopmini()-xmini()*INDEX&&i<200-ymini()*INDEX&&i>99)<br> return 0;<br> }<br> return 1;<br>}<br>void move()<br>{ unsigned int r,s;<br> unsigned int h=0;<br> float co,si;<br> for(r=0;r<4;r++)<br> for(s=0;s<4;s++)<br> if(b[r][s]==1)<br> {<br> c[h++]=s;<br> c[h++]=r;<br> b[r][s]=0;<br> }<br> b[c[0]][c[1]]=1;<br> b[c[2]][c[3]]=1;<br> b[c[4]][c[5]]=1;<br> b[c[6]][c[7]]=1;<br> myputimage(i,j,"picture.dat");<br> myputimage(205,15,"picture.dat");<br> if(checkmove()) converting();<br> drawall(205,15,INDEX-1,COLOR);<br> mygetimage(205,15,INDEX,"picture.dat");<br> myputimage(i,j,"picture.dat");<br>}<br>void main()<br>{ unsigned char p;<br> welcome();<br> loop:initial();<br> do<br> { if(checknow(j)>0) myputimage(i,j,"picture.dat");<br> while(checkdown(j)>0&&j<161-ymini()*INDEX)<br> { if(bioskey(1)==0) fall();<br> else { q=getkey();<br> switch(q)<br> { case 0x4b00: leftmove();break;<br> case 0x4800: move();break;<br> case 0x4d00: rightmove();break;<br> case 0x5000: fastmove(i,j);<br> }<br> }<br> }<br> endmanage();<br> }while(checktop());<br> getch();<br> cleardevice();<br> printf("if you want to paly the game another time,input 'y'");<br> p=bioskey(0);<br> if(p=='y') goto loop;<br> getch();<br> closegraph();<br>}</P><br>非常抱歉没有写注释,我也知道这样不大好,但是懒得去写,等那天我没事的时候补上.
[align=right][color=#000066][此贴子已经被作者于2006-11-14 19:51:18编辑过][/color][/align]
与有些不同,我没有采用数组去查询是否有方块,而取那个点的颜色值的.最前面的数组是控制方块的,0表示没有方块,1表示有.是4*4的数组.晚上上课去了.斑竹麻烦一下.
[align=right][color=#000066][此贴子已经被作者于2006-11-14 17:23:37编辑过][/color][/align]
页:
[1]
2
