c++飞机大战(一~二)(c++结构体,类)

1.结构体方式

#include <graphics.h>
#include <bits/stdc++.h>
#include <conio.h> 
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int t_t, i_s = 0, t_tm_200, bre = 0;
struct item {
	int t_s, x, y, k;
	void se(int t, int xq, int yq) { t_s = t, x = xq, y = yq; k = 1; }
	void sy() { y = 500 - (t_t - t_s) * 0.2; }
	void draw() { if (k)fillcircle(x, y, 4); }
}a[1005];
struct e {
	int t_s, x, y, k;
	void se(int t, int xq, int yq) { t_s = t, x = xq, y = yq; k = 1; }
	void neww() { x = rand() % 640; y = 0; t_s = t_t; }
	void die() { if (!k)return; if (y >= 600)bre = 1; for (int i = 0; i <= 500; i++)if ((x - a[i].x) * (x - a[i].x) + (y - a[i].y) * (y - a[i].y) <= 400)neww(); }
	void sy() { y = (t_t - t_s) * 0.05; }
	void draw() { if (k)circle(x, y, 15); }
}b[1005];
int main()
{
	srand(NULL);
	double x = 320;
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
	DWORD mode;
	GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;
	SetConsoleMode(hStdin, mode);
	int t_start = clock();
	initgraph(640, 640);
	Sleep(10);
	t_t = clock() - t_start;
	for (int i = 0; i < 20; i++)b[i_s++].se(t_t + i * 100, rand() % 640, 0);
	while (1) {
		t_t = clock() - t_start;
		BeginBatchDraw();
		cleardevice();
		for (int i = 0; i <= 500; i++)a[i].sy(), a[i].draw();
		for (int i = 0; i <= 20; i++)b[i].die(), b[i].sy(), b[i].draw();
		circle(x, 500, 20);
		if (KEY_DOWN(VK_RIGHT)) {
			if (x < 640)x += 0.5;
		}
		if (KEY_DOWN(VK_LEFT)) {
			if (x > 0)x -= 0.5;
		}
		if (t_t > t_tm_200) {
			t_tm_200 += 175;
			a[i_s++].se(t_t, x, 500);
			i_s %= 500;
		}
		EndBatchDraw();
		if (bre)break;
	}
	outtextxy(300, 320, _T("YOU DIE"));
	Sleep(1234567890);
	return 0;
}

1.头文件和一些定义:

#include <graphics.h>
#include <bits/stdc++.h>
#include <conio.h> 
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

2.数据声明

int t_t, i_s = 0, t_tm_200, bre = 0;//游戏时长,已发射子弹数量%500,时长/200
struct item {//子弹
	int t_s, x, y, k;//发射时间,x坐标,y坐标,是否显示
	void se(int t, int xq, int yq) { t_s = t, x = xq, y = yq; k = 1; }//设置函数
	void sy() { y = 500 - (t_t - t_s) * 0.2; }//位移
	void draw() { if (k)fillcircle(x, y, 4); }//画
}a[1005];
struct e {//敌人
	int t_s, x, y, k;//同上
	void se(int t, int xq, int yq) { t_s = t, x = xq, y = yq; k = 1; }//同上
	void neww() { x = rand() % 640; y = 0; t_s = t_t; }//新敌人
	void die() { if (!k)return; if (y >= 600)bre = 1; for (int i = 0; i <= 500; i++)if ((x - a[i].x) * (x - a[i].x) + (y - a[i].y) * (y - a[i].y) <= 400)neww(); }//死亡判断
	void sy() { y = (t_t - t_s) * 0.05; }//同上
	void draw() { if (k)circle(x, y, 15); }//同上
}b[1005];

3.main函数

int main()
{
	srand(NULL);//随机数
	double x = 320;//角色x坐标
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
	DWORD mode;
	GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;
	SetConsoleMode(hStdin, mode);
	int t_start = clock();
	initgraph(640, 640);
	Sleep(10);
	t_t = clock() - t_start;
	for (int i = 0; i < 20; i++)b[i_s++].se(t_t + i * 100, rand() % 640, 0);//生成初始敌人
	while (1) {
		t_t = clock() - t_start;
		BeginBatchDraw();
		cleardevice();
		for (int i = 0; i <= 500; i++)a[i].sy(), a[i].draw();
		for (int i = 0; i <= 20; i++)b[i].die(), b[i].sy(), b[i].draw();
		circle(x, 500, 20);
		if (KEY_DOWN(VK_RIGHT)) {//向右
			if (x < 640)x += 0.5;
		}
		if (KEY_DOWN(VK_LEFT)) {//向左
			if (x > 0)x -= 0.5;
		}
		if (t_t > t_tm_200) {//发射子弹
			t_tm_200 += 175;
			a[i_s++].se(t_t, x, 500);
			i_s %= 500;
		}
		EndBatchDraw();
		if (bre)break;//失败
	}
	outtextxy(300, 320, _T("YOU DIE"));
	Sleep(1234567890);
	return 0;
}

4.下载方式:

下载

2.类方式:

介绍

        众所周知,C++是一种面向对象的编程语言, 用 "" 来描述 "对象", 所谓的"对象"是指现实世界中的一切事物。那么类就可以看做是对相似事物的抽象, 找到这些不同事物间的共同点, 如自行车和摩托车, 首先他们都属于"对象", 并且具有一定得相同点, 和一些不同点, 相同点如他们都有质量、都有两个轮子, 都是属于交通工具等。"都有质量"、"两个轮子"属于这个对象的属性, 而"都能够当做交通工具"属于该对象具有的行为, 也称方法。

        类是属于用户自定义的数据类型, 并且该类型的数据具有一定的行为能力, 也就是类中说描述的方法。通常来说, 一个类的定义包含两部分的内容, 一是该类的属性, 另一部分是它所拥有的方法。以 "人类" 这个类来说, 每个人都有自己的姓名、年龄、出生日期、体重等, 为 人类 的属性部分, 此外, 人能够吃饭、睡觉、行走、说话等属于人类所具有的行为。

        上面举例中所描述的 "人" 类仅仅是具有人这种对象的最基础的一些属性和行为, 可以称之为人的"基类"。 再说说一些具有一些职业的人, 例如学生, 一个学生还具有"基类"中所没有的属性, 如学校、班级、学号; 也可以具有基类所不具有的行为, 如每天需要去上课, 需要考试等。

        学生类可以看做是基类的一个扩展, 因为他具有基类的所有属性和行为, 并且在此基础上增加了一些基类所没有的属性和行为, 像"学生"这样的类称为"人类"这个基类的"派生类"或者"子类"。在学生的基础上海可以进一步的扩展出其他更高级的类, 如"研究生"类。

定义:

    C++中使用关键字 class 来定义类, 其基本形式如下:

class 类名
{
    public:
    公共的行为或属性
 
    private:
    公共的行为或属性
};

说明:

        类名 需要遵循一般变量的命名规则。

        public 与 private 为属性/方法限制的关键字, private 表示该部分内容是私密的, 不能被外部所访问或调用, 只能被本类内部访问; 而 public 表示公开的属性和方法, 外界可以直接访问或者调用。

        一般来说类的属性成员都应设置为private, public只留给那些被外界用来调用的函数接口, 但这并非是强制规定, 可以根据需要进行调整;

        就像struct那样,结束部分的分号不能省略。

实现与使用:

在类中定义成员函数:

之前的item结构体按类的形式写如下:

class item {
    public:
	int t_s, x, y, k;
	void se(int t, int xq, int yq) { t_s = t, x = xq, y = yq; k = 1; }
	void sy() { y = 500 - (t_t - t_s) * 0.2; }
	void draw() { if (k)fillcircle(x, y, 4); }
};

再比如,最基础的Point按类的形式写如下:

#include<bits/stdc++.h>
class Point
{
    private:
    int px;
    int py;
    public:
    Point(int x, int y)
    {
        px = x;
        py = y;
    }
    void pPoint()
    {
        printf("(%d,%d)",px,py); 
    }
};
int main()
{
    Point M(10, 20);
    M.pPoint();
    return 0;
}

在类外定义成员函数:

回到一开始的问题,在类外定义成员函数。在类外定义成员函数通过在类内进行声明, 然后在类外通过作用域操作符 :: 进行实现, 形式如下:

class 类名
{
    ... ...
};

返回类型 类名::成员函数名(参数){
    ... ...
}


​

Point按类的形式写如下:

#include<bits/stdc++.h>
class Point
{
    private:
    int px;
    int py;
    public:
	Point(int x, int y)
	{
	    px = x;
	    py = y;
	}
    void pPoint();
};
void Point::pPoint()
{
    printf("(%d,%d)",px,py); 
}
int main()
{
    Point M(10, 20);
    M.pPoint();
    return 0;
}

注意事项:

构造函数中,变量初始化的顺序,是以变量定义的顺序来定的,而不是简单的以构造函数中变量出现的顺序来定的。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值