ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:18.50KB ,
资源ID:8805577      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8805577.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C语言写的俄罗斯方块.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C语言写的俄罗斯方块.docx

1、C语言写的俄罗斯方块请大家指教一下,由于自己算法的问题向左位移有些问题在TC2下通过#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); /*清空键盘缓冲

2、队列*/void update();void messagebox();void process();void initremove();void initinfo();void initbox();void initposition();void next_shape();typedef struct shape /*形状单一状态的记录*/ int attr;int co8;shape;typedef struct RE_AB /*相对,绝对坐标记录*/ int Rx,Ry;int x1,x2,y1,y2;RE_AB;RE_AB RA;shape p19= RED,0,1,1,0,1,1,2

3、,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 , MAGE

4、NTA,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_f1222,rs1,rs2,xcors,xcorb,ycors,ycorb;/*检查方快有没有左,右,下接触,游戏区内所有格子有无颜色记录数组,rs1形状记录,rs2为提示框用,记录小格子在游戏区中的位置,

5、按键存储*/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

6、(0x1c,oldint);enable();void HZ12(int x0,int y0,int w,int color,char *s) /*根据字模,在dos下显示汉字*/*横坐标,纵坐标,字间隔,汉字颜色,汉字字符串*/ FILE *fp;register char buffer24;register char str2;unsigned long fpos;/*fpos为最终偏移动量*/register int i,j,k;fp=fopen(hzk12,r);/*打开12*12汉字苦*/while(*s)/*一直到字符串结束为止*/if(*s0)/*汉字输出*/ str0=(*s)

7、-0xa0;str1=*(s+1)-0xa0;fpos=(str0-1)*94+(str1-1)*24L;/*计算汉字在hzk12的偏移量*/fseek(fp,fpos,SEEK_SET);/*指针移动到当前位置*/fread(buffer,24,1,fp);/*读取一个汉字到数组中*/for(i=0;i12;i+)/*12行*/for(j=0;j2;j+)/*两个字节*/for(k=0;k(7-k)&0x1)!=NULL)/*是一就画点*/putpixel(x0+8*j+k,y0+i,color);s+=2;/*一个汉字占两个字节,现在将指针移动两个字节*/x0+=w;/*显示坐标也按照间隔

8、移动*/else/*显示非汉字字符*/ settextstyle(0,0,1);setcolor(color);str0=*s;str1=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

9、 RA.y1=16*(RA.Ry-1); RA.y2=16*RA.Ry; int check_b() /*检查是否到达低部*/ int x,y,i,zf=0; /*zf为是否有颜色填充记录*/for(i=0;i=6)zf+=r_fx-15y-6+1;if(zf=0)return 1;elsereturn 0;int finish() int tfull=0,i; /*判断顶层空间是否有填充*/for(i=1;i11;i+)tfull+=r_fi1;if(tfull!=0)return 1; /*告诉judge()可以结束了*/int check_l() /*检查形状是否与左接触*/ int x

10、,y,i,zf=0;for(i=0;i6)zf+=r_fx-15-1y-6;if(y=6&x=16)zf+=1;if(zf=0)return 1;elsereturn 0;int check_r() /*检查形状是否与右接触*/ /*zf为是否有颜色填充记录*/int x,y,i,zf=0; /*zf为是否有颜色填充记录*/for(i=0;i6)zf+=r_fx-15+1y-6;if(y=6&x=25)zf+=1;if(zf=0)return 1;elsereturn 0;void check_touch() nback=check_b();nleft=check_l();nright=che

11、ck_r();void draw(int cb) /*画形状,cb=1以填充色画形状,cb=2以背景色画形状,cb=3以白色画形状*/ int i,recordx=RA.Rx,recordy=RA.Ry;for(i=0;i7;i+,i+) RA.Rx+=prs1.coi;RA.Ry+=prs1.coi+1;if(RA.Ry=6) RA.Rx=recordx;RA.Ry=recordy;continue;translation();if(cb=1)setfillstyle(1,prs1.attr);elseif(cb=2)setfillstyle(1,BLACK);elseif(cb=3) se

12、tfillstyle(1,WHITE);r_fRA.Rx-15RA.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-;elseif(key=RIGHT&nright)RA.Rx+;elseRA.Ry+;nback=check_b();if(nback) /*判断形状有没有到达底部,有就将其颜色变为白色*/draw(1);elsedraw(3);

13、void change() /*变换形状*/ int status=rs1,buffer,i,x,y,zf=0;if(prs1.attr=prs1+1.attr)rs1+;elsewhile(prs1.attr=prs1-1.attr)rs1-;for(i=0;i6)zf+=r_fx-15y-6;if(zf!=0)rs1=status;buffer=rs1;rs1=status;status=buffer;draw(2);buffer=rs1;rs1=status;status=buffer;nback=check_b(); /*判断变化后的形状是不是到达了低部,这个检查是十分必要的*/if(

14、nback)draw(1);elsedraw(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=xcors;xcor=xcorb;xcor+)for(ycor=ycors;ycor0;j-) for(i=1;i11;i+) r_fij+1=r_fij;RA.Rx=i+15;RA.Ry=j+1+6;tr

15、anslation();if(r_fij+1=1)setfillstyle(1,WHITE);elsesetfillstyle(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,正常

16、);return;void judge() int i,j,full=0; /*full等于10说明某一行满,该消除了*/if(finish() /*判断游戏是否该结束了*/messagebox(); /*win编程里有这个函数*/for(j=1;j21;j+) /*判断某一行是否满了*/ for(i=1;i11;i+)full+=r_fij;if(full=10)erasure(j); /*消除这行*/full=0;void update() /*使程序可以重新运行*/ cleardevice();setbkcolor(BLACK);initinfo(); /*提示信息初始化*/initbo

17、x(); /*游戏框架初始化*/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=0;i12;i+)for(

18、j=0;j=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();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1