软工导论实验任务一

来源:互联网 发布:人工智能 dsp fpga 编辑:程序博客网 时间:2024/04/27 16:19

任务一:

1)软件项目:贪吃蛇小游戏

2)背景说明:这是一个关于蛇的传说

3)功能概述:一款休闲、益智、高端、老少皆宜的小游戏

4)实验要求:编写C语言程序实现贪吃蛇游戏。一条蛇在密闭的围墙内,在围墙内随机出现一个食物,通过按键盘上的四个光标键控制蛇向上下左右四个方向移动,蛇头撞到食物,则表示食物被蛇吃掉,时蛇的身体长一节,同时计10分,接着又出现食物,等待被蛇吃掉,如果蛇在移动过程中,撞到墙壁或身体交叉蛇头撞到自己的身体游戏结束

任务二:

应用流程建模


任务三:

应用场景建模



原本打算用C#做的,可是发现真的好难。只好跑去用C语言做了。可是发现网上找的C的代码,好多错误,我最终挑了一个错误相对少的,在百度的帮助下。做了这个贪吃蛇。

下面附上代码:

#include <windows.h>#include <stdlib.h>#include <time.h>#include <stdio.h>#include <string.h>#include <conio.h>#define N 21int apple[3];char score[3];char tail[3]; void gotoxy(int x, int y)    //输出坐标 {        COORD pos;        pos.X = x;         pos.Y = y;        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);}void color(int b)         //颜色函数 {    HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;     SetConsoleTextAttribute(hConsole,b) ;} int Block(char head[2])   //判断出界 {        if ((head[0] < 1) || (head[0] > N) || (head[1] < 1) || (head[1] > N))                return 1;        return 0;}int Eat(char snake[2])   //吃了苹果 {        if ((snake[0] == apple[0]) && (snake[1] == apple[1]))       {                apple[0] = apple[1] = apple[2] = 0;                gotoxy(N+44,10);                color(13);                printf("%d",score[0]*10);                color(11);                return 1;           }        return 0;}void Draw(char **snake, int len)    //蛇移动 {        if (apple[2]) {                gotoxy(apple[1] * 2, apple[0]);                color(12);                printf("●");                color(11);        }        gotoxy(tail[1] * 2, tail[0]);        if (tail[2])          {  color(14);                printf("□");                color(11);         }    else         printf("■");        gotoxy(snake[0][1] * 2, snake[0][0]);        color(14);        printf("□");        color(11);        putchar('\n');}char** Move(char **snake, char dirx, int *len)   //控制方向 {        int i, full = Eat(snake[0]);        memcpy(tail, snake[(*len)-1], 2);        for (i = (*len) - 1; i > 0; --i)                 memcpy(snake[i], snake[i-1], 2);        switch (dirx)           {            case 'w': case 'W': --snake[0][0]; break;              case 's': case 'S': ++snake[0][0]; break;           case 'a': case 'A': --snake[0][1]; break;           case 'd': case 'D': ++snake[0][1]; break;           default: ;         }          if (full)              {                 snake = (char **)realloc(snake, sizeof(char *) * ((*len) + 1));                snake[(*len)] = (char *)malloc(sizeof(char) * 2);                memcpy(snake[(*len)], tail, 2);                ++(*len);                ++score[0];                if(score[3] < 16)                 ++score[3];                tail[2] = 1;           }           else                 tail[2] = 0;                return snake;}void init(char plate[N+2][N+2], char ***snake_x, int *len)  //初始化 {        int i, j;        char **snake = NULL;        *len = 3;        score[0] = score[3] =3;        snake = (char **)realloc(snake, sizeof(char *) * (*len));        for (i = 0; i < *len; ++i)                snake[i] = (char *)malloc(sizeof(char) * 2);                        for (i = 0; i < 3; ++i)                 {                snake[i][0] = N/2 + 1;                snake[i][1] = N/2 + 1 + i;             }                      for (i = 1; i <= N; ++i)                 for (j = 1; j <= N; ++j)                         plate[i][j] = 1;                                 apple[0] = rand()%N + 1; apple[1] = rand()%N + 1;        apple[2] = 1;        for (i = 0; i < N + 2; ++i)                 {                gotoxy(0, i);                for (j = 0; j < N + 2; ++j)                         {                        switch (plate[i][j])                                 {                             case 0:                                  color(12);printf("□");color(11); continue;                        case 1: printf("■"); continue;                             default: ;                             }                    }                   putchar('\n');            }         for (i = 0; i < (*len); ++i)       {                gotoxy(snake[i][1] * 2, snake[i][0]);                printf("□");            }         putchar('\n');        *snake_x = snake;}void Manual(){        gotoxy(N+30,2);        color(10);        printf("按 W S A D 移动方向");        gotoxy(N+30,4);        printf("按 space 键暂停");         gotoxy(N+30,8);        color(11);        printf("历史最高分为: ");        color(12);        gotoxy(N+44,8);        printf("%d",score[1]*10);        color(11);        gotoxy(N+30,12);        printf("你现在得分为: 0");         }int File_in()     //取记录的分数 {   FILE *fp;   if((fp = fopen("C:\\tcs.txt","a+")) == NULL)   {            gotoxy(N+18, N+2);     printf("文件不能打开\n");         exit(0);   }   if((score[1] = fgetc(fp)) != EOF);   else   score[1] = 0;   return 0;}int File_out()    //存数据 {                FILE *fp;        if(score[1] > score[0])         {gotoxy(10,10);        color(12);        puts("闯关失败 加油耶");        gotoxy(0,N+2);         return 0;        }        if((fp = fopen("C:\\tcs.txt","w+")) == NULL)        {                printf("文件不能打开\n");                exit(0);        }    if(fputc(--score[0],fp)==EOF)           printf("输出失败\n");    gotoxy(10,10);        color(12);        puts("恭喜您打破记录");         gotoxy(0,N+2);        return 0;}void Free(char **snake, int len)    //释放空间 {        int i;        for (i = 0; i < len; ++i)                 free(snake[i]);        free(snake);}int main(void){        int len;        char ch = 'g';        char a[N+2][N+2] = {{0}};        char **snake;        srand((unsigned)time(NULL));        color(11);        File_in();        init(a, &snake, &len);        Manual();        while (ch != 0x1B)   // 按 ESC 结束          {                 Draw(snake, len);                if (!apple[2]) {                        apple[0] = rand()%N + 1;                        apple[1] = rand()%N + 1;                        apple[2] = 1;                }                Sleep(200-score[3]*10);                setbuf(stdin, NULL);                if (kbhit())                   {                        gotoxy(0, N+2);                        ch = getche();                    }                 snake = Move(snake, ch, &len);                  if (Block(snake[0])==1)                   {                        gotoxy(N+2, N+2);                        puts("你输了");                        File_out();                        Free(snake, len);                        getche();                        exit(0);                   }                                }        Free(snake, len);        exit(0);} 


感想:其实,这学期的软件工程导论我并没有多少的收获。每次上课懵懵懂懂的基本都听不懂,最终也只了解到了像UML、用例、数据库等几个少得可怜的专有名词。在做软件这块,由于对C#一窍不通,也只好通过C语言做了一个贪吃蛇小游戏。在找这段代码的过程中,我了解了EGE图形库,还有一些游戏设计的基本步骤,像初始化游戏、处理游戏逻辑、绘制游戏画面等等。希望下次能真正做一个C#程序。

原创粉丝点击