《C++面向对象课内程序设计基于C++的2048设计报告.doc》由会员分享,可在线阅读,更多相关《C++面向对象课内程序设计基于C++的2048设计报告.doc(11页珍藏版)》请在三一办公上搜索。
1、皖西学院信息工程学院School of Information and Engineering, West Anhui UniversityC+面向对象课内程序设计 实验报告 20142015学年第二学期 专 业计算机科学与技术专业班 级计科1301姓 名学 号任课教师 C+面向对象课内程序设计实 验 报 告 学号: 姓名:何晓雪 班级:计科1301 成绩:实验名称:2048小游戏实验地点:PC所使用的工具软件及环境:个人计算机,Windows7,VC+6.0一、 实验目的:延伸课外知识,实现简单小游戏实现,依靠函数和屏幕输出。二、实验任务: 设计一个程序,可以简单实现2048游戏的功能。用W
2、 A S D 键控制数字移动的方向,实现数字相加,并判断是否可以在本方向移动,判断无法叠加时游戏结束。三、实验说明: 2048是前段时间很火的一个小游戏,2048是比较流行的一款数字游戏。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli。它是基于1024和小3传奇的玩法开发而成的新型数字游戏。 本次实验是体现了,C+语言的应用,通过函数的调用实现功能。因知识不深,时间较短等原因仅仅实现其功能,并没有进行优化。四、 实验分析:(一)初始化地图窗口使用一个二维数组来初始化地图UI,数组中保存了0,2,4。初始化后进行2和4的随机赋值。方法如下:void out() /
3、在屏幕上输出 for(int i=0;i4;i+) for(int j=0;j4;j+) coutxijt; coutendl; 随机2,4在地图中 r1=rand()%num+1; r2=rand()%8; for(int i=0;i4;i+) for(int j=0;j4;j+) if(tij=r1) if(r2=0)xij=4;break; if(r2!=0)xij=2;break; (二)编写键盘WASD上下左右对应的方法void move(int way) 根据输入的way值判断是方向当way =1 的时候,即键盘输入D的时候当way =2的时候,即键盘输入S的时候当way =3 的
4、时候,即键盘输入A的时候当way =4的时候,即键盘输入W的时候遍历整个数组。找到地图中所有相同的数字并保存位置,再判断两个位置的X与Y轴是否有某一个值相等,相等后判断其X或Y轴之间是否有其他数字2或4,若无,则消除其其中一个数字,另一个与其进行相加。再重新刷新整个地图 for(int i=0;i4;i+) for(int m=0;m0;j-) if(xij=0) for(int k=j;k0;k-) xik=xik-1; xi0=0; for(int i=0;i0;j-) if(xij=xij-1) xij=xij+xij-1; score+=xij; for(int k=j-1;k0;k-
5、) xik=xik-1; xi0=0; (三)检查是否成功,游戏失败int check() 遍历整个地图,如果地图中某个位置的值为2048则游戏胜利,输出You Win! 如果地图中所有位置已经被填满切相邻之间没有相同数字,则输出Game Over!游戏成功或者失败,游戏都将被停止。int check() int f=1;/0通过 1结束 2胜利 for(int i=0;i16;i+) if(xi/4i%4=2048) coutYou Win!endl; f=2; break; if(f=1) for(int i=0;i9;i+) if(xi/3i%3=xi/3i%3+1 | xi/3i%3=
6、xi/3+1i%3 | xi/3i%3=0) f=0;break; if(x3i%3=x3i%3+1 | xi/33=xi/3+13 | x3i%3*xi/33*x33=0) f=0;break; if(f=1)coutGame Overendl; out(); coutscore:scoreendl; if(f=1 | f=2) system(pause); return 0; (四)其他方法1)比较相加,遍历地图比较发现相同的数字切其X或者Y轴之间无相隔其他数字,进行相加。int compare() int f=0; for(int i=0;i4;i+) for(int j=0;j4;j+
7、) if(xij!=x1ij) f=1; break; return f;2)地图中位置的转换。void in() for(int i=0;i4;i+) for(int j=0;j4;j+) x1ij=xij; 五、实验结果 int r1=0,r2=0; /全局变量int x44=0;int x144=0;int score=0;void out() /在屏幕上输出 for(int i=0;i4;i+) for(int j=0;j4;j+) coutxijt; coutendl; void start() int num=0; int t44=0; srand(time(NULL)%100);
8、/基本UI初始化 for(int i=0;i4;i+) for(int j=0;j4;j+) if(xij=0) num+; tij=num; /随机2和4 r1=rand()%num+1; r2=rand()%8; for(int i=0;i4;i+) for(int j=0;j4;j+) if(tij=r1) if(r2=0)xij=4;break; if(r2!=0)xij=2;break; /检查是否通过-结束-胜利int check() int f=1;/0通过 1结束 2胜利 for(int i=0;i16;i+) if(xi/4i%4=2048) coutYou Win!endl
9、; f=2; break; if(f=1) for(int i=0;i9;i+) if(xi/3i%3=xi/3i%3+1 | xi/3i%3=xi/3+1i%3 | xi/3i%3=0) f=0;break; if(x3i%3=x3i%3+1 | xi/33=xi/3+13 | x3i%3*xi/33*x33=0) f=0;break; if(f=1)coutGame Overendl; out(); coutscore:scoreendl; if(f=1 | f=2) system(pause); return 0; void in() for(int i=0;i4;i+) for(int
10、 j=0;j4;j+) x1ij=xij;/比较相加int compare() int f=0; for(int i=0;i4;i+) for(int j=0;j4;j+) if(xij!=x1ij) f=1; break; return f;/根据输入的W-A-S-D进行移动void move(int way) if(way=1)/向右 for(int i=0;i4;i+) for(int m=0;m0;j-) if(xij=0) for(int k=j;k0;k-) xik=xik-1; xi0=0; for(int i=0;i0;j-) if(xij=xij-1) xij=xij+xij
11、-1; score+=xij; for(int k=j-1;k0;k-) xik=xik-1; xi0=0; / if(way=2)/向下 for(int i=0;i4;i+) for(int m=0;m0;j-) if(xji=0) for(int k=j;k0;k-) xki=xk-1i; x0i=0; for(int i=0;i0;j-) if(xji=xj-1i) xji=xji+xj-1i; score+=xji; for(int k=j-1;k0;k-) xki=xk-1i; x0i=0; / if(way=3)/向左 for(int i=0;i4;i+) for(int m=0;
12、m3;m+) for(int j=0;j3;j+) if(xij=0) for(int k=j;k3;k+) xik=xik+1; xi3=0; for(int i=0;i4;i+) for(int j=0;j3;j+) if(xij=xij+1) xij=xij+xij+1; score+=xij; for(int k=j+1;k3;k+) xik=xik+1; xi3=0; / if(way=4)/向上 for(int i=0;i4;i+) for(int m=0;m3;m+) for(int j=0;j3;j+) if(xji=0) for(int k=j;k3;k+) xki=xk+1
13、i; x3i=0; for(int i=0;i4;i+) for(int j=0;j3;j+) if(xji=xj+1i) xji=xji+xj+1i; score+=xji; for(int k=j+1;kcon; con=getch(); system(cls); in(); if(con=w)move(4); if(con=a)move(3); if(con=s)move(2); if(con=d)move(1); out(); Sleep(500); system(cls); if(compare()=1) start(); check(); /*x00=0;x01=0;x02=0;x03=0; x10=2;x11=2;x12=0;x13=4; x20=2;x21=0;x22=3;x23=0; x30=2;x31=0;x32=2;x33=0; /move(2); start(); out(); coutendl;*/ system(pause); return 0; 六、实验结果 初始化界面与一系列操作后的界面每按一步分数都显示在下方结果 任课教师签名: