收藏 分销(赏)

俄罗斯方块游戏(C语言).docx

上传人:二*** 文档编号:4522889 上传时间:2024-09-26 格式:DOCX 页数:48 大小:306.29KB 下载积分:5 金币
下载 相关 举报
俄罗斯方块游戏(C语言).docx_第1页
第1页 / 共48页
本文档共48页,全文阅读请下载到手机保存,查看更方便
资源描述
俄罗斯方块游戏(C语言) 摘要 俄罗斯方块是一款风行全球的掌上游戏机和PC机游戏,它造成的轰动与 创造的经济价值可以说是游戏史上的一件大事。它由俄罗斯人阿列克谢•帕基 特诺夫创造,故得此名。俄罗斯方块的基本规那么是移动、旋转和摆放游戏自动 输出的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却 变化无穷,俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技 巧,难度却不低。作为家喻户晓老少皆宜的群众游戏,其普及程度可以说是史 上任何一款游戏都无法相比的。相信大多数人都还记得为它痴迷得茶不思饭不 想的那个俄罗斯方块时代。由于俄罗斯方块具有的数学性、动态性与知名度, 也经常拿来作为游戏程序设计的练习题材: 关键词:俄罗斯方块开发游戏编程程序开发Abstracts Tetris is a fashionable global handheld game and PC games,it caused stir and create the economic value of gaming history is a great event.lt is invented by the Russian Alexey Pazhitnov.The basic rule of tetris is moving,rotation and put the Game output squares,It an,anged in a complete row or a complete multi row,eliminate and score.lt seems simple but Full of change.As household the mass games all ages,Its popularity is any games that cannot be compared.Tetris often used for game programming practice subject. 3.1.5 游戏速度分数更新 当判断出一行满时,score变量一固定值(如10),可以吧等级level看作是速 度speed,因为速度speed是根据计分score值不断上升的,所以我们定义 Ievel=speed==score/speed_step,其中 speed_step 是每升一级所需要的分数。方 块下落速度加快,这是不断修改了定时计数器变量TimerCounter判断条件的 结果。速度越快,时间中断的间隔就越短。 3.1.6 游戏帮助 实现比拟简单,使用outtextxy。函数实现。 3.2数据结构设计 3.2.1 游戏底板BOARD结构体 Struct BOARD ( Int var; Int color; }Table_board[Vertical_boxs][Horizontal_boxs]; BOARD结构体表示游戏底板中每个小方块所具有的属性。其中var表示小 方块当前状态,只有0与1两个值,表示此小方块已被占用,0表示未被占 用。Color表示小方块的颜色,游戏底板的每个小方块可以拥有不同的颜色, 以增强美观。Vertical.boxs为游戏底板上垂直的方向上小方块的个数, Horizontal_boxs为游戏底板上水平的方向上小方块的个数。 3.2.2 游戏方块SHAPE结构体struct SHAPE char box[2]; int color;/*每个方块的颜色*/ int next;/*下个方块的编号*/ ); SHAPE结构体表示某个游戏方块具有的属性。其中,char box[2]表示用2 个字节来表示这个游戏方块的形状。每4位来表示一个游戏方块的一行。 Color表示每个游戏方块的颜色,颜色可设为BLACK、BLUE、GREEN、 CYAN、RE、MAGENTA、BROWN、LIGHTGRAY、DARKGRAY、 LIGHTBLUE> LIGHTCYAN > LIGHTRED. LIGHTMAGENTA > YELLOW 和 WHITEo next表示下个游戏方块的编号,在旋转时需要用到此编号。 如box[0]="0x88”,box[l]="0xc0”,其中0x88和OxcO为十六进制表示形式,具 体表现的含义如图3.3所示。 1000 ■口 □口1000 ■口 □口 1100 ■■口 口 0000 口 □□口 图3.3 SHAPE结构示意图 3.2.3 SHAPE结构数组 初始化游戏方块内容,即定义MAX.BOX个SHAPE类型的结构数组,并 初始化。MAX_BOX为19。应为一共有19种不同形状的俄罗斯方块。 struct SHAPE shapes[MAX_BOX]= * 口 □ □口 口 口 口 * □ □ □ □ □口 * 口 口 □ */ {0x88, OxcO, CYAN, 1}, {0xe8, 0x0, CYAN, 2}, {0xc4, 0x40, CYAN, 3}, {0x2e, 0x(), CYAN, ()}, * □ □ 口 □□口 * 口 口 口 口 * □口 □□口 口 */ {0x44, OxcO, MAGENTA, 5}, {Ox8e, 0x0, MAGENTA, 6}, {Oxc8, 0x80, MAGENTA, 7}, {0xe2, 0x0, MAGENTA, 4}, 口 口 口 口 口 口 口 口 {0x8c, 0x40, YELLOW, 9), {0x6c, 0x0, YELLOW, 8}, * 口口口 * □口*/ k {0x4c, {0xc6, 0x80, 0x0, BROWN, BROWN, 11}, 10), * □ □ □ * □ □口 口 口 □ □口 口 口 * □ □ □ */ {0x4e, 0x0, WHITE, 13}, {0x8c, 0x80, WHITE, 14}, {0xe4, 0x0, WHITE, 15}, {0x4c, 0x40, WHITE, 12}, k □ * 口 * 口 口口□口 * □ */ {0x88, 0x88, RED, ⑺, k {OxfO, 0x0, RED, 16), * □ 口 * 口 口 */ {Oxcc, 0x0, BLUE, 18) 10 3.3函数功能描述 (1) newtimer() 函数原型:void interrupt newtimer(void) Newtimer。函数用于为新的时钟中断处理函数。 (2) SetTimer() 函数原型:void SetTimer(void interrupt(*IntProc)(void)) SetTimer。函数用于设置新的时钟中断处理过程。 (3) KillTimer() 函数原型:void KillTimer() KillTimer。函数用于恢复原有的时钟中断处理过程。 (4) initialize() 函数原型:void initialize( int x,int y,int m,int n) Initialize。函数用于初始化界面,具体为在传入参数x、y指明位置上画m行 n列小方块,并显示积分、等级、帮助及预览游戏方块等。 (5) DelFullRow() 函数原型:int DelFullRow(int y) DelFullRow。函数用于处理删除一满行的情况。Y指明具体哪一行为满行。 (6) setFullRow() 函数原型:void setFullRow(int t_boardy) setFullRow()函数用于找到满行,并调用DelFullRow。函数来处理满行。 t_boardy为在游戏底板中的垂直方向的坐标值。 (7) MkNextBox() 函数原型:int MkNextBox(int box_numb) MkNextBox。函数用于生成下一个游戏方块,并返回方块号。Box.numb表 示当前的游戏方块号。 (8) EraseBox() 函数原型:void EraseBox(int x,int y,int box_numb)ii EraseBox。函数用于清除(x,y)位置开始的编号为box_numb的游戏方块。 (9) show_box() 函数原型:void show_box(int x,int y,int box_numb,int color) show_box()函数用于显示(x,y)位置开始的编号为box_numb的、颜色值为 color的游戏方块。 (10) MoveAble() 函数原型:int MoveAble(int x,int y,int box_numb,int direction) MoveAble。函数判断是否可以移动。(x,y)为当前方块位置,box_numb为方 块号,direction为方向标志,返回true和false。 (11)主函数main。 整个游戏的主控局部。 4.程序实现 4.1 源码分析 4.1.1 程序预处理 包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。 /*加载头文件*/#include <stdio.h> #include <stdlib.h>#include <dos.h> #include <graphics.h> /*图形函数库*//*定义按键码*/ #define VK_LEFT 0x4b00#define VK_RIGHT 0x4d00 12#define VK_DOWN 0x5000 #define VK_UP 0x4800 #define VK_ESC 0x01 lb #define TIMER Oxlc/*设置中断号号/*定义常量*/ #define MAX.BOX 19/*总共有19种各形态的方块*/#define BSIZE 20/*方块的边长是20个象素*/ # define Sys_x 160/*显示方块界面的左上角x座标*/define Sys_y 25/*显示方块界面的左上角y座标列 # define Horizontal_boxs 10 /*水平的方向以方块为单位的长度*/define Vertical_boxs 15/*垂直的方向以方块为单位的长度*/ # define Begin_boxs_x Horizontal_boxs/2 /*产生第一个方块时出现的起始位置*/define FgColor 3/*前景颜色,如文字.2-green*/ # define BgColor 0/*背景颜色.0-blac*/define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右边状态栏的 x 座标*/ # define false 0define true 1 /*移动的方向刃define MoveLeft 1 # define MoveRight 2define MoveDown 3 # define MoveRoll 4/*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/ /*定义全局变量*/int current_box_numb; /*保存当前方块编号*/ int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y; /*x,y 是保存方块 的当前坐标的*/int flag_newbox=false; /*是否要产生新方块的标记0*/ 13int speed=O; int speed=O; /*下落速度*/ int score=0; /*总分*/ int speed_step=3(); /*每等级所需要分数*/ void interrupt (*oldtimer)(void); /*指向原来时钟中断处理过程入口的中断处 理函数指针*/ struct BOARD/*游戏底板结构,表示每个点所具有的属性*/ int var; /*当前状态只有。和1』表示此点已被占用*/ int color;/*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/}Table_board[Vertical_boxs][Horizontal_boxs]; /*方块结构*/struct SHAPE char box[2]; 行 /*一个字节等于8位,每4位来表示一个方块的一 如:box[0]="0x88”,box[l]="0xc0” 表示的是: 1000 1000 1100 0000*/ int color; /*每个方块的颜色*/ int next; /*下个方块的编号号 ); /*初始化方块内容.即定义MAX.BOX个SHAPE类型的结构数组,并初始化*/struct SHAPE shapes[MAX_BOX]= □ □口 口口14 * □ □ □ □ □口 * 口 口 □ */ {0x88, OxcO, CYAN, “, {0xe8, 0x0, CYAN, 2}, {0xc4, 0x40, CYAN, 3}, {0x2e, 0x0, CYAN, 0}, □ 口 口□口 □ □口 {0x44, OxcO, {Ox8e, 0x0, {0xc8, 0x80, {0xe2, 0x0, MAGENTA, 5}, MAGENTA, 6}, MAGENTA, 7}, MAGENTA, 4}, * 口 * 口口口口 * 口口口 */ {0x8c, 0x40,YELLOW, 9), {0x6c, 0x0,YELLOW, 8}, * 口口口 * 口口口口 * □ */ {0x4c, 0x80, BROWN, 11},15 15 * □□口 {Oxc6, 0x0, BROWN, 10),口 口 □ □ {0x4e, 0x0, WHITE, 13}, {0x8c, 0x80, WHITE, 14}, {0xe4, 0x0, WHITE, 15}, {0x4c, 0x40, WHITE, 12), □ □口* */ 口口□口 */{0x88, {OxfO, /* {0x88, {OxfO, /* 0x88, 0x0, * 口口 * 口口 */ {Oxcc, ); 0x0, RED, RED, ⑺, 16), BLUE, 18) /*定时计数器变量*/ unsigned int TimerCounter=0; 4.1.2 主函数 main() Main。函数主要是实现了对整个程序的运行控制,以及相关功能模块的调fflo 16 Key: Tetris development , Game programming , program development目录 1 .前言1.功能描述2 2 .总体设计3 2.1 功能模块设计3游戏执行主流程3 2.1.1 游戏方块预览3游戏方块控制5 2.1.2 游戏显示更新6游戏速度分数更新7 2.1.3 游戏帮助7 2.2 数据结构设计7游戏底板BOARD结构体7 2.2.1 游戏方块SHAPE结构体7SHAPE结构数组8 2.3 函数功能描述11.程序实现12 2.4 源码分析12程序预处理12 2.4.1 主函数 main。16初始化界面21 2.4.2 时钟中断处理22void main() int GameOver=0; int key,nextbox; int Currentaction=0;/*标记当前动作状态*/ int gd=VGA,gm=VGAHI,errorcode; initgraph(&gd,&gm;H,); errorcode = graphresult(); if (errorcode != grOk) (printf(H\nNotice:Graphics error: %s\nM, grapherrormsg(errorcode)); printf("Press any key to quit!");getch(); exit(l); ) setbkcolor(BgColor); setcolor(FgColor); randomize(); SetTimer(newtimer); initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/* 初始化*/ nextbox=MkNextBox(-1);show_box(Curbox_x,Curbox_y,current_box_numb,shapeslcurrent_box_numbJ.color ); show_box(LeftWin_x,Curbox_y+200,nextbox,shapeslnextboxj.color); show_intro(Sys_x,Curbox_y+320); getch(); while(l)/* Currentaction=0; 17flag_newbox=false; 检测是否有按键*/ if (bioskey(l)){key=bioskey(0); } else{ key=O; } switch(key) (case VK_LEFT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft)) {EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x- =BSIZE;Currentaction=MoveLeft;}break; case VK_RIGHT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)){EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentact ion=MoveRight;} break; case VK_DOWN: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)){EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentact ion=MoveDown;) else flag_newbox=true; break;case VK_UP:/*旋转方块*/ if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll))18 {EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[cur rent_box_numbl.next;Currentaction=MoveRoll; ) break;case VK_ESC: GameOver= 1;break; default: break;) if(Currentaction){/*表示当前有动作,移动或转动*/ show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color );Currentaction=0; ) /*按了往下键,但不能下移,就产生新方块*/ if(flag_newbox)( /*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ ErasePreBox(LeftWin_x,Sys_y+200,nextbox);nextbox=MkNextBox(nextbox); show_box(LeftWin_x,Curbox_y+200,nextbox,shapeslnextbox].color);if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))/*Ri]一开始,游 19戏结束*/ show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color );GameOver= 1; ) else (flag_newbox=false; )Currentaction=0; )else /*自由下落*/ (if (Currentaction==MoveDown || TimerCounter> (20-speed*2)) (if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)) ( EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color ); )TimerCounter=0; 20if(GameOver )/*|| flag_newbox==-1 */ printf(ugame over,thank you! your score is %dn,score);getch(); break; getch(); KillTimer(); closegraph(); 初始化界面 玩家进行游戏时,需要对游戏界面进行初始化工作。此代码被main。函数调 用。主要进行的工作如下: (1)循环调用line()函数绘制当前游戏板。 (2)调用ShowScore。函数显示初始的成绩,初始成绩为0。 ⑶调用ShowSpeed。函数显示初始的速度(等级),初始速度1。 /**********初始化界面******* *参数说明: x,y为左上角坐标m,n 对应于 Vertical_boxs,Horizontal_boxs 分别表示纵横方向上方块的个数(以方块为单位)BSIZE Sys_x Sys_y *2* 7,7,*5^ *3*7,****1* 7,7,*1* 7.7,/ .卜 rj% rj* 4.rj%rj*rjw rj»,.rrj* ,.、,「,卜 rj* rj* /void initialize(int x,int y,int m,int n) 21 int i,j,oldx; oldx=x; for(j=0;j<n;j++) ( for(i=0;i<m;i++) (Table_board [j][i].var=O; Table_board[j][i].color=BgColor;line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE; ) y+=BSIZE; x=oldx; ) Curbox_x=x; Curbox_y=y;/*x,y是保存方块的当前坐标的*/ flag_newbox=false; /*是否要产生新方块的标记0*/ speed=0;/*下落速度*/ score=0;/* 总分*/ ShowScore(score); ShowSpeed(speed);时钟中断处理 随着用户等级的提高,需要加快方块的下落速度,以增加游戏难度。速度越22 快,时间中断的间隔就越短。主要进行的工作如下: (1)定义新的时钟中断处理函数void interrupt newtimer(void)o (2)使用SetTimer()设置新的时钟中断处理过程。 (3)定义中断恢复过程KillTimer。。 void interrupt newtimer(void)( (*oldtimer)(); /* call the old routine */ TimerCounter++;/* increase the global counter */ )/*设置新的时钟中断处理过程列 void SetTimer(void interrupt(*IntProc)(void)) ( oldtimer=getvect(TIMER); /*获取中断号为TIMER的中断处理函数的入口 地址*/ disable。;/*设置新的时钟中断处理过程时,禁止所有中断*/ setvect(TIMER,IntProc); /*将中断号为TIMER的中断处理函数的入口地址改为IntProc。函数的入 口地址 即中断发生时,将调用IntProc。函数。*/ enable(); /* 开启中断 */ )/*恢复原有的时钟中断处理过程*/ void KillTimer() disable(); setvect(TIMER,oldtimer);23 enable(); 2.4.3 成绩、速度及帮助的显示 成绩、速度及帮助的显示是此游戏开发的一局部。不要进行的工作如下: (I)调用ShowScore。函数,显示当前用户的成绩,成绩是不断提高的。 (2)调用ShowSpeedO函数,显示当前游戏方块的下落速度,速度与等级是成正比的。 (3)调用Show_help()函数,提示用户如何进行游戏的相关操作,此函数只 在初始局部调用。 /*显示分数*/void ShowScore(int score) int x,y; char score_str[5];/*保存游戏得分*/ setfillstyle(SOLID_FILL,BgColor); x=LeftWin_x; y=100; bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3); sprintf(score_str," %3d'\score); outtextxy(x,y,nSCORE"); outtextxy(x,y+10,score_str);/*显示速度*/ void ShowSpeed(int speed) int x,y;24 char speed_str[5];/* 保存速度值*/ setfillstyle(SOLID_FILL,BgColor); x=LeftWin_x; y=150; bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3); /*确定一个以(xl,yl)为左上角,(x2,y2)为右下角的矩形窗口,再按规定图模 和颜色填充。刃 sprintf(speed_str,n%3dn,speed+1); outtextxy(x,y,"Level"); outtextxy(x,y+10,speed_str); /*输出字符串指针speed_str所指的文本在规定的(x, y)位置*/ outtextxy(x,y+50,',Nextboxn);) 2.4.4 满行处理 在左移、右移、旋转和下落动作不能进行时,即游戏方块不满足相关操作条 件时,需要对游戏主板进行是否有满行的判断,假设有满行的情况,那么必须进行 消除满行的处理。如图4.1所示,当竖直的游戏方块下落在当前游戏板中,不 能再下移时,出现了两个行事满的,那么必须进行满行处理。满行处理包括两个 动作:第一,找到满行;第二,处理此满行。 1)调用selFuURow。函数 调用setFullRow。函数,找到一满行。具体过程如下: (1)对当前游戏方块落在的位置,从下到上逐行判断,假设该行的小方块的值 为1的个数等于游戏主板行的大小时,那么该行为满行,立即调用DelFullRow() 函数进行满行处理,并返回当前的游戏主板的非空行的最高点。否那么,继续进 行对上一行的判断,直到游戏方块的最上行。 (2)假设有满行,那么根据DelFullRow。函数处理后的游戏主板Tabljboard数组25 中的值,进行游戏主板的重绘,即显示消除行后的游戏界面,并且对成绩和速 度进行更新。 2)调用 DelFullRow。函数 调用DelFullRow。函数,处理此满行,主要执行的是将上行数据移至下移的 操作。 图4.1满行示意图/*找到一行满的情况*/ void setFullRow(int t_boardy) ( int n,full_numb=0,top=0;/*top保存的是当前方块的最高点*/ register m;/* t_boardy 口 5口6 □□口□□口7n□□□□□□8 */ for(n=t_boardy+3;n>=t_boardy;n—) (if(n<0 || n>=Vertical_boxs ){continue;} /*超过低线了*/ for(m=0;m<Horizontal_boxs;m++)/* 水平的方向*/26 4.1.5 成绩、速度及帮助的显示24满行处理25 4.1.6 游戏方块的显示和清除29游戏方块操作判断处理34 4.2运行结果40游戏初始状态40 4.2.1 游戏进行状态415.结论42 致谢43参考文献44 /*发现有一个是 if(!Table_board[n+full_numb][m].var)break;空就跳过该行*/ )/*找到满行了*/ /*第一次献给了 n,最高的 /*清除游戏板里的该 /*统计找到的行数*/ /*找到满行了*/ /*第一次献给了 n,最高的 /*清除游戏板里的该 /*统计找到的行数*/ if(m==Horizontal_boxs)( if(n==t_boardy+3)*/ top=DelFullRow(n+full_numb);行,并下移数据*/ elseDelFullRow(n+full_numb); full_numb++; if(full_numb) (int oldx,x=Sys_x,y二BSIZE*top+Sys_y; oldx=x;score=score+fun_numb*10;/* 加分数*/ /*这里相当于重显调色板*/for(n=top;n<t_boardy+4;n++) (if(n>=Vertical_boxs)continue;/* 超过低线 了 */ for(m=0;m<Horizontal_boxs;m+4-) /* 水平的方向 */ (if(Table_board[n] [m]. var) setfillstyle(SOLID_FILL,Table_board[n][m].color);/*TabIe_board[n][m] .color*/27 27 else setfillstyle(SOLID_FILL,BgColor); bar(x,y,x+BSIZE,y+BSIZE);line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE);line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE);x+=BSIZE; )y+=BSIZE; x=oldx;) ShowScore(score);if(speed! =score/speed_step) {speed=score/speed_step; ShowSpeed(speed);} else{ShowSpeed(speed);} }) /*删除一行满的情况 * 这里的y为具体哪一行为满 */int DelFullRow(int y) ( /*该行游戏板往下移一行列 int n,top=0;/*top保存的是当前最高点,出现一行全空就表示为最点了,移动是到最高点结束*/ register m,totoal;28 for(n=y;n>=0;n--)/*从当前行往上看*/ (totoal=0; for(m=0;m<Horizontal_boxs;m++) ( if( !Table_boardLn] [mJ. var)totoal++;/* 没占有方格+ 1*/ if(Table_board[n] [m]. var! =Table_board[n-1 ] [m]. var) /* 上行不等 于下行就把上行传给下行xor关系刃 ( Table_board[n] [m]. var=Table_board[n-1 ] [m] .var; Table_boardlnJ [mJ .color=Table_boardLn-1J LmJ .color; ) ) if(totoal==Horizontal_boxs)/* 发现上面有连续的空行提前结束*/ ( top=n; break; ) ) return(top);/* 返回最高点*/ ) 游戏方块的显示和清除游戏方块的显示和清除是游戏中经常出现的操作。主要进行的过程如下: (1)调用 show_box(int x,int y,int box_numb,int color)函数,在(x,y)位置开始, 用指定颜色color显示编号为box_numb的游戏方块。 29 (2)调用 EraseBox(int x,int y,int box_numb)函数,清除在(x,y)位置开始的方 块编号为box_numb的游戏方块。 *显示指定的方块 */void show_box(int x,int y,int box_numb,int color) ( int i,ii,ls_x=x; if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/box_numb=MAX_BOX/2; setfillstyle(SOLID_FILL,color);/•曲•曲4k f »Tw rr» *7、■卜 *7、*7、*7、*T* *T・ »T» *7* »T» *T»«• *T» »T» <7• ・[• * 移位来判断第哪一位是1 * 方块是每1行用半个字节来表示 * 128d=1000 0000b•]. •:. ] ・[• »T» »TW ^Tw 〃・r1• »T» »T»*1• *T* *7• »T» ri»■[• f for(ii=0;ii<2;ii++) (int mask=128; for(i=0;i<8;i++)( if(i%4==0 && i!=0)/*表示转到方块的下一行了*/{ y+=BSIZE;x=ls_x; }if((shapes[box_numb].box[ii])&mask) bar(x,y,x+BSIZE,y+BSIZE);30 line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE); Iine(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE);
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 初中其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服