C语言程序设计大作业--飞翔的小鸟(含注释)

一、效果展示

  

二、实验代码

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>

#define DIS 22
#define BLAN 9
struct link
{
    int data;
    struct link *next;
};
struct link *head=NULL;
typedef struct bird
{
    COORD pos;
    int score;
}BIRD;

struct link *appenddata(struct link*head,int data);
//创建链表记录每一次的成绩
void onplay(struct link *head);
//将链表的数据全部展示出来
int findmax(struct link *head);
//找到链表中的最大值
int findthelast(struct link *head);
// 找到最后一次游戏的成绩
void mydelete(struct link *head);
//游戏结束,释放链表所有数据
void checkwall(COORD wall[]);
//显示墙体
void prtbird(BIRD *bird);
 //显示小鸟
int checkwin(COORD *wall, BIRD *bird);
//检测小鸟是否碰墙或者超出边界
void begin(BIRD *bird);
//显示上下边界和分数
BOOL SetConsoleColor(unsigned int wAttributes);
//设置颜色
void gotoxy(int x,int y);
//定位光标
BOOL SetConsoleColor(unsigned int wAttributes);
// 设置颜色
void Hidecursor();
//隐藏光标,避免闪屏现象,提高游戏体验
int main()
{

    int i;
    char ch;
    char c;
    int high=0;
    int last=0;
    printf("游戏规则:\n"
           "你需要用空格操控小鸟飞跃一个又一个柱子\n"
           "无论是飞出边界还是撞上柱子都会失败\n"
           "你活得越久分数就越高\n"
           "开始我们的 游戏吧! \n"
           "                              \n"
           "                              \n"
           "                              \n"
           "do you want to play it?(enter y/n)\n"
           );
    scanf(" %c",&c);
    while(c=='y')
    {
    BIRD bird={{22,10},0};//小鸟的初始位置
    COORD wall[3]={{40,10},{60,6},{80,8}};//柱子的初始位置和高度
    while(checkwin(wall,&bird))
    {
        begin(&bird);//清除屏幕并显示上下边界和分数
        checkwall(wall);//显示柱子樯
        prtbird(&bird);//显示小鸟
        Sleep(200);
        if(kbhit())// 检测键盘输入
        {
            ch=getch();
            if(ch==' ')
            {
                bird.pos.Y=bird.pos.Y-1;
            }
        }
        else
        {
            bird.pos.Y+=1;
        }
        for(i=0;i<3;++i)
        {
            wall[i].X--;
        }
    }
    printf("不要灰心,更高的山峰在等待着攀登的那个人!\n");
    printf("\n");
    printf("do you want to play it again?(enter y/n)\n");
    scanf(" %c",&c);
    }
    onplay(head);
    high=findmax(head);
    last=findthelast(head);
    printf("the highest score is :%d\n",high);
    printf("\n");
    printf("you 差 the highest %d score\n",high-last);
    printf("\n");
    if(last>=high)
        printf("                           you overcome the highest!!!\n");
    free(head);
    return 0;
}
void checkwall(COORD wall[])
{
    int i;
    Hidecursor();
    srand(time(NULL));
    COORD temp={wall[2].X+DIS,rand()%13+5};//随机产生一个新的柱子
    if(wall[0].X<10)//超出预设边界
    {
        wall[0]=wall[1];
        wall[1]=wall[2];
        wall[2]=temp;
    }
    for(i=0;i<3;++i)// 每次显示3个柱子樯
    {
        //显示上半部分柱子樯
        temp.X=wall[i].X+1;//向右缩进一格显示图案
        SetConsoleColor(0x0c);//设置黑色背景,亮红色前景
        for(temp.Y=2;temp.Y<wall[i].Y;temp.Y++)
        {
            gotoxy(temp.X,temp.Y);
            printf("*******");
        }
        temp.X--;              //向左移动一格显示图案
        gotoxy(temp.X,temp.Y);
        printf("********");     //显示下半部分柱子樯
        temp.Y+=BLAN;
        gotoxy(temp.X,temp.Y);
        printf("********");
        temp.X++;               //向右缩进一格显示图案
        temp.Y++;               //在下一行显示下面的图案
        for(;(temp.Y)<26;temp.Y++)//一直显示到第25行
        {
             gotoxy(temp.X,temp.Y);
             printf("******");
        }
    }
}
void prtbird(BIRD *bird)
{
    SetConsoleColor(0x0E); //设置黑色背景,亮黄色前景
    gotoxy(bird->pos.X,bird->pos.Y);
    printf("0->");        //显示小鸟
}
int checkwin(COORD *wall,BIRD *bird)
{
    if(bird->pos.X>=wall->X) // 小鸟的横坐标进入了柱子坐标范围
    {
        if(bird->pos.Y<=wall->Y||bird->pos.Y>=wall->Y+BLAN)
        {
            head=appenddata(head,bird->score);
            system("cls");
            return 0;       //小鸟的纵坐标碰到上下柱子,返回0
        }
    }
    if(bird->pos.Y<1||bird->pos.Y>26)
    {
        head=appenddata(head,bird->score);
        system("cls");
        return 0;           //小鸟的位置超出上下边界
    }
    (bird->score)++;         //分数加一
    return 1;
}
void begin(BIRD *bird)
{
    system("cls");
    gotoxy(0,26);
    printf("=============================="
           "============================"
           "================================");
    gotoxy(0,1);
    printf("=============================="
           "============================"
           "================================");
    SetConsoleColor(0x0E);
    printf("\n% 4d",bird->score);
}
void gotoxy(int x,int y)
{
    COORD pos={x,y};
    HANDLE hOutput =GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput,pos);
}
//函数功能:设置颜色
//一共有16种文字颜色,16种背景颜色,组合有256种,传入的参数值应该小于256
//字节的低4位控制前景色,高四位的控制背景色,高亮+红+绿+蓝
BOOL SetConsoleColor(unsigned int wAttributes)
{
    HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    if(hOutput==INVALID_HANDLE_VALUE)
    {
        return FALSE;
    }
    return SetConsoleTextAttribute(hOutput,wAttributes);
}
//隐藏函数光标
void Hidecursor()
{
    HANDLE handle =GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO CURSORINFO;
    GetConsoleCursorInfo(handle,&CURSORINFO);
    CURSORINFO.bVisible=0;
    SetConsoleCursorInfo(handle,&CURSORINFO);
}
struct link *appenddata(struct link *head,int data)
{
    struct link*p=NULL;
    struct link *pr=head;
    p=(struct link*)malloc(sizeof(struct link));
    if(p==NULL)
        exit(0);
    else
    {
        if(head==NULL)
        {
            p->next=NULL;
            p->data=data;
            head=p;
            return head;
        }
        else
        {
            while(pr->next!=NULL)
            {
                pr=pr->next;
            }
            pr->next=p;
            p->data=data;
            p->next=NULL;
            return head;
        }
    }
    return head;
};
int findmax(struct link *head)
{
    struct link *p=head;
    int mymax=0;
    if(head==NULL)
    {
        printf("you have no score!\n");
        printf("\n");
        mymax=0;
    }
    else
    {
        while(p!=NULL)
        {
            if((p->data)>=mymax)
            {
                mymax=p->data;
            }
            p=p->next;
        }

    }
    return mymax;
}
int findthelast(struct link *head)
{
    int last;
    struct link *p=head;
    if(head==NULL)
    {
        printf("there is no last score!\n");
        printf("\n");
        last=0;
    }
    else
    {
        while(p!=NULL)
        {
            last=p->data;
            p=p->next;
        }
    }
    return last;
}
void onplay(struct link *head)
{
    struct link *p=head;
    int i=1;
    while(p!=NULL)
    {
        printf("your 第%d次 score is :%d\n",i,p->data);
        printf("\n");
        p=p->next;
        i++;
    }
}
void mydelete(struct link *head)
{
    struct link*p=head;
    struct link *pr=head;
    while(p!=NULL)
    {
        pr=p;
        p=p->next;
        free(pr);
        printf("your data has been freed!\n");
    }
}

  • 13
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言程序设计大作业文档示例根据具体的项目要求和设计思路可以有不同的结构和内容,以下是一个可能的示例: 一、项目简介: 本项目是一个基于C语言的任务管理系统。该系统可以帮助用户记录并管理任务,提供任务的添加、删除、查询等功能,并支持任务的优先级、截止日期等属性设置。 二、项目整体设计: 1. 系统的主要功能模块:包括任务管理模块、图形界面模块、数据存储模块等。 2. 系统设计的目标:实现简单易用、功能完善的任务管理系统,并具有较好的用户界面和数据存储效率。 三、详细设计: 1. 任务管理模块的设计:具体包括任务的添加、删除、查询等功能的实现,以及任务属性的设置等。 2. 图形界面模块的设计:采用GUI(Graphic User Interface)设计,提供直观友好的用户界面,通过按钮、菜单等组件实现与用户的交互。 3. 数据存储模块的设计:采用文件存储方式,将任务数据保存到磁盘文件中,实现数据的持久化存储。 四、算法设计: 1. 任务添加算法:用户通过输入任务的相关信息,将任务添加到任务列表中,并按照优先级和截止日期排序。 2. 任务删除算法:用户可以选择任务进行删除操作,同时更新任务列表。 3. 任务查询算法:用户可以按照关键词搜索任务,系统将返回相关的任务列表。 五、测试与验证: 设计完毕后,进行系统的测试与验证,包括功能测试、性能测试等,确保系统的正确性和可靠性。 六、结论: 本项目通过C语言实现了一个简单易用、功能完善的任务管理系统,满足了用户的需求。希望在今后的开发中能进一步改进和完善该系统,提升用户体验和功能扩展性。 ### 回答2: C语言程序设计大作业文档示例是一个用于指导学生完成C语言程序设计大作业的文档。它提供了作业的要求和要求,以及学生需要完成的任务和要求。 在C语言程序设计大作业文档示例中,通常会包以下内容: 1. 作业要求:这部分介绍了作业的目标和要求,包括需要完成的功能和功能的实现方式。例如,可以要求学生编写一个简单的学生信息管理系统,包括添加、删除、修改和显示学生信息等功能。 2. 程序结构和功能:这部分详细介绍了程序的结构和各个功能的实现细节。学生可以根据文档中提供的示例代码和说明来完成每个功能的编写。例如,可以要求学生使用结构体来存储学生的信息,并使用函数来实现各个功能。 3. 编码规范:这部分介绍了学生在编写代码时需要遵循的编码规范和最佳实践。例如,可以要求学生使用有意义的变量名、注释代码、避免使用全局变量等。 4. 测试和调试:这部分介绍了如何对完成的程序进行测试和调试。学生可以根据文档中提供的测试用例和调试方法来验证自己的程序是否正确,并对存在的问题进行修复。 5. 提交和评估:这部分说明了学生需要将完成的作业提交到何处以及评估标准和流程。学生需要按照要求将自己的代码提交到指定的平台或老师指定的地方,并按时完成评估。 通过C语言程序设计大作业文档示例,学生可以更加清晰地了解大作业的要求和目标,能够有针对性地完成每个任务,并在遵守编码规范和进行测试调试的基础上,完成作业并进行提交和评估。这样的文档示例能够帮助学生提高编程能力和解决问题的能力,同时也提供了一种规范的方式来进行大作业的管理和组织。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值