江南大学人文学院《程序设计基础C》课程设计报告
i=0 i<10
gotoxy(10,5+i); j=0; j<10
是 chMap[i][j]==0 否 printf(“#”);
是 chMap[i][j]==1 否 printf(“ ”);
是 chMap[i][j]==2 否 printf(“0”);
j++;
i++;
3.4在每次移动之后都要判断箱子是否都在目标坐标上,然后进行相应的操作。流
程图如下:
j=0; i=0; i<4
chMap[Box[i].y-5][Box[i].x-10]==2 是 否 j++; i++;
j==4
否 是 clrscr();
printf(“You Win!”); break;
3.5在每次移动之后刷出人和箱子在地图上的坐标。流程图如下:
5
江南大学人文学院《程序设计基础C》课程设计报告
i=0 i<4
gotoxy(Box[i].x,Box[i].y); printf(“\014”); i++;
gotoxy(x,y);
printf(“\002\b”); tx=x;ty=y;
3.6 读取按键信息,进行坐标移动的判断,如果改变的坐标和墙(0)重合则不改变:
iKey=fnGeKey();
iKey==LEFT&&chMap[y-5][x-1-10]!=0 是 否 x--;
iKey==RIGHT&&chMap[y-5][x+1-10]!=0 是 否 x++;
是 iKey==UPPER&&chMap[y-1-5][x-10] 否 y--; iKey==DOWN&&chMap[y+1-5][x-10] 是 否 y++;
iKey==ESC 否 是 clrscr();
printf(“You Lost”); break;
6
江南大学人文学院《程序设计基础C》课程设计报告
3.7判断人在移动后与箱子有没有重合,若有,则箱子向前移动一步,这样就起
到了推箱子的打操作了,其N-S流程图如下:
i=0; i<4
否 Box[i].x==x&&Box[i].y==y 是 Box[i].x+=(x-tx); Box[i].y+=(y-ty); chMap[Box[i].y-5][Box[i].x-10]==0
否 是
Box[i].x-=(x-tx); Box[i].y-=(y-ty); x=tx; y=ty; break;
4 源程序代码设计
#include
#include#define LEFT 75 #define RIGHT 77 #define UPPER 72 #define DOWN 80
#define ESC 27
struct Boxss /*定义箱子结构体,其中包含坐标属性*/ {
int x,y; };
union keyboard /*定义读取键盘码的共用体类型*/ {
unsigned int iKeyInfo; char chKeyBit[2];
7
江南大学人文学院《程序设计基础C》课程设计报告
};
int fnGetKey(void) /*定义读取键盘码的函数*/
{
union keyboard uniKey1; /*定义读取键盘码的共用体变量*/
while(bioskey(1)==0); /*检测用户是否按键*/
uniKey1.iKeyInfo=bioskey(0); /*读取按键信息*/
return(uniKey1.chKeyBit[0]==0?uniKey1.chKeyBit[1]:uniKey1.chKeyBit[0]); /*返回ASCII码或扩充码*/ }
void main()
{
int iKey,x=11,y=6,tx=11,ty=6; /*x,y为人物移动后坐标,tx,ty为人物移动前坐标*/ struct Boxss Box[4]; /*定义箱子数量*/
int chMap[10][10]={ /*用二维数组定义地图*/
{0,0,0,0,0,0,0,0,0,0}, /*0表示墙1表示路2表示目标*/ {0,1,0,0,0,0,1,1,1,0}, {0,1,0,2,0,0,1,0,1,0}, {0,1,0,1,0,0,1,0,1,0}, {0,1,1,1,0,0,1,0,1,0}, {0,1,0,0,0,0,1,0,1,0}, {0,1,1,1,1,1,1,0,1,0}, {0,1,0,1,0,0,0,0,2,0}, {0,2,0,1,1,1,1,2,0,0}, {0,0,0,0,0,0,0,0,0,0}, }; int i,j;
Box[0].x=13; /*定义箱子的坐标属性*/ Box[1].x=11; Box[2].x=14; Box[3].x=18; Box[0].y=8; Box[1].y=7; Box[2].y=13;
Box[3].y=7;
while(1) /*反复进行求移动的坐标运算*/ {
for(i=0;i<10;i++) /*输出新地图(刷新地图)*/ {
gotoxy(10,5+i); for(j=0;j<10;j++) {
if(chMap[i][j]==0) printf(
if(chMap[i][j]==1) printf(
if(chMap[i][j]==2)
8
江南大学人文学院《程序设计基础C》课程设计报告
printf( }
}
j=0; /*判断是否所有箱子都在目标坐标上*/ for(i=0;i<4;i++)
if(chMap[Box[i].y-5][Box[i].x-10]==2) j++;
if(j==4) /*如果所有箱子都就位输出退出*/ {
clrscr();
printf(ou Win! break;
}
for(i=0;i<4;i++) /*在起始(或移动后)的坐标输出箱子*/ {
gotoxy(Box[i].x,Box[i].y);
printf( }
gotoxy(x,y); /*在起始(或移动后)的坐标输出人*/ printf(
tx=x; /*记录本次移动前的坐标*/
ty=y;
iKey=fnGetKey();
if(iKey==LEFT&&chMap[y-5][x-1-10]!=0) /*按读取的按键信息改变坐标如果改变的坐标和墙(0)重合则不改变*/
x--;
if(iKey==RIGHT&&chMap[y-5][x+1-10]!=0) x++;
if(iKey==UPPER&&chMap[y-1-5][x-10]!=0) y--;
if(iKey==DOWN&&chMap[y+1-5][x-10]!=0)
y++; /*输入ESC退出并输出 if(iKey==ESC) {
clrscr();
printf(ou Lost break;
}
for(i=0;i<4;i++) /*如果移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格*/
if(Box[i].x==x&&Box[i].y==y) {
Box[i].x+=(x-tx);
Box[i].y+=(y-ty);
if(chMap[Box[i].y-5][Box[i].x-10]==0) /*如果移动后的箱子坐标会出现在墙上,则使箱子
9
江南大学人文学院《程序设计基础C》课程设计报告
坐标和人坐标都返回移动前的值*/ {
Box[i].x-=(x-tx); Box[i].y-=(y-ty); x=tx; y=ty; } break; } clrscr(); } getch(); }
5 总结
通过C课程设计实验课使我了解到了一个游戏程序开发的过程,虽然规模不大,但却为我以后的编程学习打下了基础。在编程的过程中,我体会到了学习编程的辛苦,为了一个算法的实现而思考,为了一个小小的编译错误而花时间去寻找,这需要很大的毅力和耐心,而且要有良好的思维,这才使得我完成这个任务,也使我感到一分喜悦,毕竟自己完成了一个有模有样的程序。于此,我也发现自己的一些不足,良好的编程习惯的养成,坚定的毅力和耐心仍是我要加强的,同别人的交流也是必须的,这样才能不断使我进步。这次设计,让我重新掌握了C语言,而且还得到了用C语言解决实际问题的宝贵经验!
? 在做课程设计的过程中,发现了平时很多没有注意到的细节问题,这样可以让
我对C语言这门课程的学习更加系统化,可以更好的学习C语言这门课程以及其它语言的基础。
? 我觉得这次C语言课程设计很成功,这程序还比较完善,虽然游戏相对来说比
较简单,因为我认为游戏的可拓展性强,可以根据实际的需要,对游戏的源程序进行稍加改动。在游戏中它能正常运行和结束。
? 更重要的是,这次课程设计虽然花了我不少时间,但正是这些时间,让我见识
到了C语言的重要性。这个推箱子游戏都是在自己知识范围内完成的,所以界面清晰简单,画面可能不是很好看,但绝对实用。
10