# 计科1602-赖伟 **Repository Path**: JiangXiNongYeDaXue/Project ## Basic Information - **Project Name**: 计科1602-赖伟 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2017-11-24 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 一、系统概述 1.涂格子拼图游戏: 2.消砖块 二、系统需求分析 涂格子拼图游戏: 1.将一张图片分割成和格子对应分 2.让切割后的小图片随机分布到画板 3.选择图片或者拖动图片,到对应的位置, 4.如果往已有图片的地方重新存放新图片,那么原来的 图片就会回到画板对应的位置 5.限定游戏时间,为10分钟或其他时间,超过时间判定输 消砖块 在现有功能代码上,对该项目进行优化 1.界面优化,砖块用颜色替换,颜色至少要有三种,各种颜色的 砖块随机分布 2.当圆球触碰到底部的时候,表示游戏结束 3.计算消除砖块的分数 三、系统总体设计,详细分析 1.玩家通过触摸下方碎片图来拖动至上方放置图片碎片的背景中。下方碎片栏默认为四张碎片,玩家每从下方移动一块碎片至背景中,后续的随便将自动补充入碎片栏中。将拼图的原图进行虚拟化,而后放入游戏界面充当背景,以便玩家判定。每一次开始游戏,下方的图片碎片栏内的碎片均为随机出现。实现判断,碎片与背景相符。若相符,则可放置,若不相符,则无法放置,自动回到下方碎片栏。若规定时间内完成拼图判断过关,可自动进入下一关,未完成判断失败,则可选择返回主菜单或者继续游戏。 2.游戏开始时,小球会停在挡板正中间,且此时挡板可左右自由移动,当遇见挡板时候小球会弹出,并在程序设定的区域内不停的碰撞反弹。当小球碰到墙壁、挡板和砖块时,均会以相反速度反弹,并且砖块在被碰撞后会自动消失。挡板可左右移动以接住小球,若小球没有被接住,超出指定区域下边缘,则游戏结束,程序终止。当所有砖块均消失时,游戏胜利。 四、代码实现,列出主要函数以及相应的用法 1. #include #include #include #include #include #include #include #include #define X 3 #define Y 4 //变量初始化 SYSTEMTIME start;//计时模块 int listx[X];//x方向上随机数 int listy[Y];//y方向上随机数 int rectWidth=640/Y;//每张图片的宽度 int rectHeight=480/X;//每张图片的高度 //初始化图片 IMAGE kobe;//拼图的图片 IMAGE picture[X][Y];//数组,用来存放分割后的图片 IMAGE prophoto[3][4]; IMAGE timephoto[10];//时间0-9数字十张图片 IMAGE showmenu;//游戏运行 IMAGE fail;//游戏失败 IMAGE dot; //点 void initdraw(); void time(); void randnum1(); void randnum2(); void cutline(); void getPicture(); void putPicture(); void movePicture(); void main() { initgraph(840,480); srand( (unsigned)time( NULL ) );//取随机数 GetLocalTime(&start);//获取当前时间 initdraw(); putimage(0, 0, &kobe);//加载拼图 putimage(640, 0, &showmenu);//加载右边的界面图片 cutline(); getPicture(); randnum1(); randnum2(); putPicture(); movePicture(); _getch(); closegraph(); } void initdraw() { //时间图片加载 loadimage(&timephoto[0],_T( "./images/t0.bmp")); loadimage(&timephoto[1],_T( "./images/t1.bmp")); loadimage(&timephoto[2],_T( "./images/t2.bmp")); loadimage(&timephoto[3],_T( "./images/t3.bmp")); loadimage(&timephoto[4],_T( "./images/t4.bmp")); loadimage(&timephoto[5],_T( "./images/t5.bmp")); loadimage(&timephoto[6],_T( "./images/t6.bmp")); loadimage(&timephoto[7],_T( "./images/t7.bmp")); loadimage(&timephoto[8],_T( "./images/t8.bmp")); loadimage(&timephoto[9],_T( "./images/t9.bmp")); loadimage(&showmenu,_T("./images/showmenu.bmp"));//运行界面 loadimage(&fail,_T( "./images/fail.bmp"));//失败界面 loadimage(&dot,_T( "./images/dot.bmp")); loadimage(&kobe,_T("./images/kobe.jpg"));//所要拼图的图片 return; } //设置分割线 void cutline() { //网格线 setlinecolor(BLACK); line(160,0,160,480); line(320,0,320,480); line(480,0,480,480); line(0,160,640,160); line(0,320,640,320); } //时间函数 void time() { int t1, t2; int i, j; int a, b; int sum; SYSTEMTIME ti; sum = 0; GetLocalTime(&ti); // 获取当前时间 sum += ti.wHour - start.wHour; sum *= 60; sum += ti.wMinute - start.wMinute; sum *= 60; sum += ti.wSecond - start.wSecond; i = 0; j = 0; t1 = sum; t2 = sum / 60; putimage(740, 419, &dot); putimage(740, 429, &dot); while (i != 2) { if (i == 0) { t1 = sum % 60; } a = t1 % 10; putimage(780 - 32 * i, 400, &timephoto[a]); t1 = t1 / 10; i++; } while (j != 2) { b = t2 % 10; putimage(700 - 32 * j, 400, &timephoto[b]); //当游戏运行超过2分钟时,游戏结束,弹出失败界面。 if(t2==2) { putimage(640,0,&fail); continue; } t2 = t2 / 10; j++; } } //随机数函数1 void randnum1() { int i,j,k; for(i = 0; i < 3; i ++) { while(1) { k = rand()%3; //获取一个0~3之间的随机数 for(j = 0; j < i; j ++) if(listx[j] == k) break;//检查重复 if(j == i)//没有重复值 { listx[i] = k; break; } } } } //随机函数数2 void randnum2() { int i,j,k; for(i = 0; i < 4; i ++) { while(1) { k = rand()%4; //获取一个0~4之间的随机数 for(j = 0; j < i; j ++) if(listy[j] == k) break;//检查重复 if(j == i)//没有重复值,保存到list中 { listy[i] = k; break; } } } } //实现图片获取 void getPicture() { for(int i=0;i #include #include #define width 840 #define width2 640 #define Height 480 //初始化变量 const int x=10,y=5; int i,j; int a[y][x]={0}; int bricks_length=width2/x; int bricks_width2=(Height-380)/y; int ball_x,ball_y; int ball_vx,ball_vy; int radius; int bar_x; int bar_left,bar_top,bar_right,bar_bottom; char c=NULL; int bricknum=0; IMAGE fail;//失败界面 IMAGE success;//成功界面 IMAGE score;//界面 IMAGE score1[10];//分数图片 //声明函数 void drawbricks(); void initData(); void clean(); void autoAnimate(); void brickhit(); void show(); void animateControl(); void drawinit(); void countscore(); void setup() { putimage(640, 0, &score); } void main() { initgraph(width,Height);//设置小球的x,y坐标 drawinit(); drawbricks(); setup(); initData(); BeginBatchDraw(); while(1) { clean(); autoAnimate(); brickhit(); setfillcolor(LIGHTBLUE); fillcircle(ball_x,ball_y,radius); Sleep(7); FlushBatchDraw(); show(); animateControl(); } EndBatchDraw(); _getch();//实现按任意键退出 closegraph(); } void initData() { ball_x=width2/2; ball_y=Height/2;//设置小球的速度 ball_vx=1; ball_vy=1;//设置小球的半径 radius=20;//添加挡板 bar_left=width2/2-100; bar_top=450; bar_right=width2/2+100; bar_bottom=480; bar_x=0;//允许批量绘制图形 } void drawbricks() { setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255)); setlinecolor(BLACK); for (int i = 0;i=width2-radius) { ball_vx=-ball_vx; } if(ball_y<=radius||ball_y>=Height-radius) { ball_vy=-ball_vy; } //判断小球撞木板后反弹 if((ball_x>=bar_left)&&(ball_x<=bar_right)&&(ball_y==bar_top-radius)) { ball_vy=-ball_vy; } if(ball_y==Height-radius) { ball_vx=0; ball_vy=0; //小球落地,展示失败图片 putimage(640, 0, &fail); Sleep(1000); return; } } //判断砖块 void brickhit() { for (int i = 0; i < y; i++) for (int j = 0; j < x; j++) if(a[i][j] == 0 && ball_x <= j * bricks_length + bricks_length + radius && ball_x >= j * bricks_length - radius && ball_y <= i * bricks_width2 + bricks_width2 + radius && ball_y >= i * bricks_width2 - radius) { if (ball_y <= i * bricks_width2 + bricks_width2 + radius && ball_y >= i * bricks_width2 - radius) { ball_vx = -ball_vx; bricknum++; //展示分数 countscore(); } else if (ball_x <= j * bricks_length + bricks_length + radius && ball_x >= j * bricks_length- radius) { ball_vy = -ball_vy; bricknum++; //展示分数 countscore(); } else continue; a[i][j] = 1; ball_vy = -1 * ball_vy; ball_vx = -1 * ball_vx; setfillcolor(BLACK); fillrectangle(j*bricks_length, i*bricks_width2, (j + 1)*bricks_length, (i + 1)*bricks_width2); if(bricknum==x*y) { //展示图片 putimage(640, 0, &success); } FlushBatchDraw(); break; } } void show() { setcolor(BLACK); setfillcolor(BLACK); fillrectangle(bar_left,bar_top,bar_right,bar_bottom); bar_left+=bar_x; bar_right+=bar_x; bar_x=0; //挡板 setcolor(WHITE); setfillcolor(RED); fillrectangle(bar_left,bar_top,bar_right,bar_bottom); } void animateControl() { setfillcolor(BLACK); solidrectangle(640,450,650,480); //判断键盘输入的是a代表左d代表右 //_kbhit()获取输入值 c=0; if(_kbhit()) { c=_getch(); switch(c) { case'a': bar_x-=10; break; case'd': bar_x+=10; break; } if(bar_left<0) { bar_left=0; bar_top=450; bar_right=width2/2-120; bar_bottom=480; } if(bar_right>width2) { bar_left=width2/2+120; bar_top=450; bar_right=width2; bar_bottom=480; } } } //加载图片 void drawinit(){ //分数图片加载 loadimage(&score1[0],_T( "./images/t0.bmp")); loadimage(&score1[1],_T( "./images/t1.bmp")); loadimage(&score1[2],_T( "./images/t2.bmp")); loadimage(&score1[3],_T( "./images/t3.bmp")); loadimage(&score1[4],_T( "./images/t4.bmp")); loadimage(&score1[5],_T( "./images/t5.bmp")); loadimage(&score1[6],_T( "./images/t6.bmp")); loadimage(&score1[7],_T( "./images/t7.bmp")); loadimage(&score1[8],_T("./images/t8.bmp")); loadimage(&score1[9],_T( "./images/t9.bmp")); //界面图片加载 loadimage(&score,_T("./images/score.bmp")); loadimage(&fail,_T( "./images/fail.bmp")); loadimage(&success,_T( "./images/success.bmp")); return; } 五、项目总结 运用EasyX库创建C语言项目,学习并接触了一些绘图函数,结合上课老师所讲和自己课后的专研,勉强完成了这两个项目。