《愤怒的小鸟》——大一下C语言程序课设

目录

一、介绍

1、题目要求

2、资源

二、关键功能的实现

1、设计的结构体和链表:

2、弹弓拉绳的实现:

3、当绳子拉伸达到上限时,仍然使小鸟可以改变方向:

3、计算小鸟飞出后的任意时刻的位置:


一、介绍

这个寒假翻电脑的时候找到了上学期C语言课设的介绍视频。这是我自己做的目前来说最长的代码,实现的功能也是最复杂的,对我来说还是很有纪念意义的。我之后也把视频传到B站上了:《愤怒的小鸟》——C语言课设。感兴趣的同学可以去看看。

在这里我简单分享一下我的设计,也许可以帮到有需要的人。

1、题目要求

老师当时对于我们的要求是使用easyX实现图形界面,利用贴图和重画实现动画,必须使用链表。除此之外,只能使用C语言语法。

2、资源

所有的资源都在这里了,里面包含一个可执行文件和一个文件夹,文件夹里有全部的图片、音乐、源代码还有工程文件。
链接:https://pan.baidu.com/s/1vjQ48dcR7DNjKtKG6OQgHg?pwd=qc1v
提取码:qc1v

除此之外,在大一上学期的寒假,我是通过 @童晶 老师的课程视频学习使用easyX的,感觉很不错,有需要的同学可以了解一下。

二、某些功能的实现

1、设计的结构体和链表:

typedef struct users{
	char id[100];
	char password[100];
	int score[5]={0};
	int good[5] = { 0 };  //用来存购买的道具,0放鸟制传送门
	int money=0;
}users;

typedef struct bird_info {  //用结构体存储画面上某一点的图像,role为1(小红鸟),2(笑鸟)
	int x;
	int y;
	int role;
	int fire;   //是否发射
	struct bird_info* next;
}b_info;

typedef struct pig_info {  //用结构体存储画面上某一点的图像,role为1(小猪),2(笑猪)
	int x;
	int y;
	int role;
	int count;
	struct pig_info* next;
}p_info;

typedef struct stick_info {  //用结构体存储画面上某一点的图像,role为1(木棍障碍)
	int x;
	int y;
	int role;
	struct stick_info* next;
}s_info;


b_info* bH;  //将b_info变量串成链表,将头指针定义为全局变量,各函数均可访问
p_info* pH;  //将p_info变量串成链表,将头指针定义为全局变量,各函数均可访问
s_info* sH;  //将s_info变量串成链表,将头指针定义为全局变量,各函数均可访问
users user;

2、弹弓拉绳的实现

实际上是利用了easyX的画线函数,不过我把线的宽度调大了,也改了线的颜色。然后将线的一端设置为小鸟的坐标,一端为弹弓的坐标。

3、当绳子拉伸达到上限时,仍然使小鸟可以改变方向:

void bposition1(short x1,short y1) {     //当绳子过长时计算小鸟的位置  (传入鼠标位置)
	double sinx;    //储存正弦值
	double cosx;    //储存余弦值
	double heartx = 267;  //圆心x坐标
	double hearty = 515;  //圆心y坐标
	double l= distance(x1, y1, heartx, hearty);

	sinx = (hearty - y1) / l;
	cosx = (heartx - x1) / l;

	bH->x = heartx - cosx * 35-25;
	bH->y = hearty - sinx * 35-25;
	
}   

3、计算小鸟飞出后的任意时刻的位置

void bposition(int a,int b) {    //计算小鸟发出后的位置
	static int speed = 0;
	double vm=14; //绳的最大合速度
	double sin;
	double cos;  
	float heartx = 267;  //弹弓x坐标
	float hearty = 515;  //弹弓y坐标
	double l=distance(a,b, heartx, hearty);  //计算绳长

	sin = (hearty - b) / l;
	cos = (heartx - a) / l;

	vx = vm * cos*l/35;
	vy = vm * sin*l/35+10*times;   //屏幕上 以向下为y坐标增加,取+号
	if (speed == 10) {
		times=times+0.2;
		speed = 0;
	}
	else {
		speed++;
	}
}

这里的很多参数都是我自己反复尝试才确定的,虽然我也觉得这样直接用数字其实不利于程序的维护,但是就完成课设来说还是比较方便的。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值