收藏 分享(赏)

c++代码.doc

上传人:天天快乐 文档编号:1144110 上传时间:2018-06-15 格式:DOC 页数:10 大小:34.50KB
下载 相关 举报
c++代码.doc_第1页
第1页 / 共10页
c++代码.doc_第2页
第2页 / 共10页
c++代码.doc_第3页
第3页 / 共10页
c++代码.doc_第4页
第4页 / 共10页
c++代码.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、/*俄罗斯方块-C+源代码*/#include#include#include#include#include/* 组成形状的方块的大小 */#define BLOCKWIDTH 18/* 游戏区的大小 */#define AREAWIDTH 12#define AREALEN 24/* 定义背景色,函数 setbarByIndex()用此颜色来隔开每个形状的方块 */#define BKCOLOR LIGHTGRAY #define CLIP_ON 1#define TRUE 1/* 适中中断的中断号 */#define TIMER 0x1c/* 速度为 10/(level*18.2) 秒/

2、格 */#define LEVEL 2 /* bioskey(0)左移八位 */ #define LEFT 30 /* a */#define RIGHT 32 /* b */#define DOWN 31 /* s */#define ROTATE 17 /* w */#define QUIT 16 /* q */* c 和 C+定义不同 */#ifdef _cplusplus#define _CPPARGS .#else#define _CPPARGS#endifstruct Point int x;int y;/* 每个图形都用位于 4*4 数组中的四个点来表示,points4保存了这四

3、个点的坐标.* 注意: 以13为原点,得到其余点的坐标 .* rotateTo 记录了逆时针旋转 90 后的形状的索引.*/struct Shape int color;struct Point points4;int rotateTo;/* 给出所有可能形状的坐标. 尽可能把图像安排在 4*4 数组的最左下方 */struct Shape const shapes19 = RED,-1,-2,-1,-1,-1,0,0,0, 1,YELLOW,1,-1,1,0,0,0,-1,0, 2,GREEN, -1,-2,0,-2,0,-1,0,0, 3,YELLOW,-1,-1,0,-1,1,-1,-1

4、,0, 0,CYAN, -1,0,0,0,0,-1,0,-2, 5,BLUE, -1,-1,0,-1,1,-1,1,0, 6,BROWN,-1,0,-1,-1,-1,-2,0,-2, 7,RED,-1,-1,-1,0,0,0,1,0, 4,YELLOW,-1,-1,0,-1,-1,0,0,0, 8,GREEN,0,0,0,-1,0,-2,0,-3, 10,YELLOW,-1,0,0,0,1,0,2,0, 9,CYAN,-1,-2,-1,-1,0,-1,0,0, 12,BLUE,-1,0,0,0,0,-1,1,-1, 11,BROWN,-1,0,-1,-1,0,-1,0,-2, 14,RED,-

5、1,-1,0,-1,0,0,1,0, 13,YELLOW,-1,-1,0,-1,1,-1,0,0, 16,GREEN,-1,-2,-1,-1,-1,0,0,-1,17,YELLOW,0,-1,-1,0,0,0,1,0, 18,CYAN,-1,-1,0,-2,0,-1,0,0, 15;/* 当前活动形状的索引 */int CurrentShape; /* 下一个活动形状的索引,目的是预览下一个形状 */int NextShape; /* 当前形状的基准点(13) 在游戏区中的坐标 */ struct Point BaseLocation; /* 标示当前形状是否到达底部 */int Active

6、; /* 协助 LEVEL 工作 */int Counter; /* 记录当前游戏区的状态游戏数组* -1 表示边界 * 0 表示空闲* 1 表示占用*/int GameAreaAREAWIDTHAREALEN;void init(void);void game(void);void controlPanel(void);void lineScan(void);void deletLine(int);void genShape(void);void previewWindow(void);void drawShape(int,struct Point,int);void setBarByInd

7、ex(struct Point,int);int canMove(int,int);void setPoint(struct Point *,int,int);int getShapeMiniY(int);int getMiniy(void);void interrupt ( *oldhandler)(_CPPARGS);void interrupt newhandler(_CPPARGS);void setTimer(void interrupt (*IntProc)(_CPPARGS);void killTimer();void gameOver(void);void main(void)

8、 int i;init();game();gameOver();/* 初始化图形设备,游戏界面,游戏数组,时钟中断,当前和下一形状,初始基准点 */void init(void) int gdriver, gmode, errorCode;int i,j;time_t t;/* 初始化图像设备 */gdriver = DETECT;initgraph(errorCode = graphresult();if(errorCode != grOk) printf(“Graphe System error: %s“, grapherrormsg(errorCode);getch();exit(1);

9、/* 初始化游戏界面 */setbkcolor(BKCOLOR);setcolor(YELLOW);setlinestyle(SOLID_LINE, 0, NORM_WIDTH);rectangle(BLOCKWIDTH-1, BLOCKWIDTH-1, (AREAWIDTH+1)*BLOCKWIDTH+1, (AREALEN+1)*BLOCKWIDTH+1);setviewport(BLOCKWIDTH, BLOCKWIDTH, (AREAWIDTH+1)*BLOCKWIDTH, (AREALEN+1)*BLOCKWIDTH ,CLIP_ON);setviewport(0, 0, getma

10、xx(),getmaxy(),CLIP_ON);rectangle(20*BLOCKWIDTH-1, 4*BLOCKWIDTH-1, 24*BLOCKWIDTH+1, 8*BLOCKWIDTH+1);setviewport(20*BLOCKWIDTH, 4*BLOCKWIDTH, 24*BLOCKWIDTH, 8*BLOCKWIDTH,CLIP_ON);/* 初始化数组,两侧,底部及游戏区 */for(i=0; i 10/LEVEL) Counter = 0;if(canMove(DOWN,CurrentShape) drawShape(CurrentShape,BaseLocation,1)

11、;setPoint(drawShape(CurrentShape,BaseLocation,0);elseActive = 0; /* 根据键盘输入,进行相应动作 */if(bioskey(1) ch = bioskey(0);switch(ch8) case DOWN:if(canMove(DOWN,CurrentShape) drawShape(CurrentShape,BaseLocation,1);setPoint(drawShape(CurrentShape,BaseLocation,0);elseActive = 0; /* 不可下降,表明到达底部,退出游戏面板 */break;c

12、ase LEFT:if(canMove(LEFT,CurrentShape) drawShape(CurrentShape,BaseLocation,1);setPoint(drawShape(CurrentShape,BaseLocation,0);break;case RIGHT:if(canMove(RIGHT,CurrentShape) drawShape(CurrentShape,BaseLocation,1);setPoint(drawShape(CurrentShape,BaseLocation,0);break;case ROTATE:if(canMove(ROTATE,sha

13、pesCurrentShape.rotateTo) drawShape(CurrentShape,BaseLocation,1);CurrentShape = shapesCurrentShape.rotateTo;drawShape(CurrentShape,BaseLocation,0);break;case QUIT:gameOver();break;default:break;/* 扫描是否有可消去的行,这里只扫描当前形状的 BaseLocaion.y 及其上若干行 */void lineScan(void) int i,j;int miniy,flag=1;/* 得到当前形状的最小

14、y 的绝对值 ,即为扫描次数 */miniy = abs(getShapeMiniY(CurrentShape);for(i=0;i= 0)if(GameAreajBaseLocation.y-i=0)flag = 0;if(flag = 1/* 删除了移行,则应重新该行,并使扫描次数减少 */i-; miniy-;flag = 1;/* 删除一指定行包括两部分:游戏数组和游戏界面 */void deletLine(int row) int i,j,size;void * buf;int miniy;/* 调整数组部分,数组整体下移,并请空最高行 */miniy = getMiniy();fo

15、r(i=row;i=miniy;i-)for(j=1;j=0 /* 消除满行,如果有的话 */lineScan();/* 更新预览视窗,设置下一图形抛出点 */CurrentShape = NextShape; NextShape = rand()%18;setPoint(Active = 1;/* 绘制当前形状第三个参数表明是插除还是全新绘制 */void drawShape(int shapeIndex,struct Point basePoint,int isErase) int i;struct Point tmppoint;for(i=0; i= 0)setfillstyle(SOL

16、ID_FILL,color); /* 设置点亮色 */elsesetfillstyle(SOLID_FILL,BKCOLOR); /* 设置熄灭色 */bar(index.x*BLOCKWIDTH,index.y*BLOCKWIDTH,(index.x+1)*BLOCKWIDTH,(index.y+1)*BLOCKWIDTH);/* 用背景色画出方块的边界,即分割形状的每个方块 */rectangle(index.x*BLOCKWIDTH,index.y*BLOCKWIDTH,(index.x+1)*BLOCKWIDTH,(index.y+1)*BLOCKWIDTH);/* 当前形状是否可以进

17、行相应操作. */int canMove(int direction, int shape) int i,x,y;int flag = 1;struct Point tmppoint;switch(direction) case DOWN:setPoint(break;case LEFT:setPoint(break;case RIGHT:setPoint(break;case ROTATE:setPoint(default:break;for(i=0; i=0 break;return flag ;/* 预览下一形状 */void previewWindow(void) /* 设置 13为基

18、准点 */struct Point basePoint = 1,3;setviewport(20*BLOCKWIDTH, 4*BLOCKWIDTH, 24*BLOCKWIDTH, 8*BLOCKWIDTH,CLIP_ON);drawShape(CurrentShape,basePoint,1);drawShape(NextShape, basePoint,0);/* 设置点坐标 */void setPoint(struct Point * point,int x,int y) point-x = x;point-y = y;/* 新中断处理函数 */void interrupt newhand

19、ler(_CPPARGS) Counter+;oldhandler();/* 设置新中断处理函数 */void setTimer(void interrupt (*IntProc)(_CPPARGS) oldhandler=getvect(TIMER);disable();setvect(TIMER,IntProc);enable();/* 恢复中断处理函数 */void killTimer() disable();setvect(TIMER,oldhandler);enable();/* 得到指定形状中最小的 y */int getShapeMiniY(int index) int i,mini;mini = shapesindex.points0.y;for(i=1;i shapesindex.pointsi.y)mini = shapesindex.pointsi.y;return mini; /* 得到当前数组中,被占用列中最小的列号 */int getMiniy(void)int i,j;for(i=0;iAREALEN-1;i+)for(j=1;jAREAWIDTH-1;j+)if(GameAreaji= 1)return i;/* 游戏结束 */void gameOver(void) closegraph();killTimer();exit(0);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报