c中链表实现雷霆战机(简易版)

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

#pragma comment(lib,"winmm.lib")
#pragma warning (disable :4996)
//子弹 敌机
typedef struct Node
{
	int x;
	int y;

	struct Node* pnext;
}ZiDan,DiJi;

ZiDan* pZidan = NULL; //pZidan 链表
DiJi*  pDiJi = NULL;  //pDiJi  链表
int  xx = 100;
int  yy = 500;

//创建链表
void CreateList()
{
	//子弹
	pZidan = (ZiDan*)malloc(sizeof(ZiDan));
	pZidan->pnext = NULL;  //防止野指针

	//敌机
	pDiJi = (DiJi*)malloc(sizeof(DiJi));
	pDiJi->pnext = NULL;  //防止野指针
}


//增加节点
void AddNode(Node* P,int a)  //形参 接收实参  a 区分到底是子弹还是敌机
{
	//定义一个新的节点
	Node* pnew = NULL;

	//为新的节点开辟空间
	pnew = (Node*)malloc(sizeof(Node));

	if (a == 1)  //子弹
	{
		//填充节点的内容
		pnew->x = xx;
		pnew->y = yy;
	}
	else if (a == 2) //敌机 
	{
		pnew->x = rand() % 450;
		pnew->y = 0;
	}

	//把节点连接起来
	pnew->pnext =P->pnext;
	P->pnext = pnew;
}

//判断子弹打到敌机
void Shoot()
{
	DiJi* pdr = pDiJi->pnext;   //临时的敌人节点用来遍历
	DiJi* pdrpre = pDiJi;		//pdr前一个节点  删除掉pdr
	ZiDan* pzd = pZidan->pnext; //临时的子弹节点 用来遍历子弹链表
	ZiDan* pzdpre = pZidan;

	while (pdr != NULL)  //遍历所有的敌机
	{
		pzd = pZidan->pnext; 
		pzdpre = pZidan;

		while (pzd != NULL)
		{
			if (pzd->x >= pdr->x - 10 && pzd->x <= pdr->x + 50 &&
				pzd->y >= pdr->y - 20 && pzd->y <= pdr->y + 20)
			{
				pzdpre->pnext = pzd->pnext;  //前一个和后一个连起来
				free(pzd);
				pdrpre->pnext = pdr->pnext;
				free(pdr);

				pdr = pDiJi->pnext;
				pdrpre = pDiJi;
				break;
			}
			else
			{
				pzd = pzd->pnext;
				pzdpre = pzdpre->pnext;
			}
		}

		pdr = pdr->pnext;
		pdrpre = pdrpre->pnext;
	}
}

int main()
{
	initgraph(500, 600);

	char ch;

	PlaySound(L"./res/The Mass.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);

	
	srand((unsigned int)time(NULL));

	//增加子弹的个数
	//初始值位置   100 500

	//创建链表
	CreateList();

	while (1)
	{
//======================敌机================================================
		//添加节点
		AddNode(pDiJi, 2);


		//显示节点的内容(数据用到绘制矩形上面去)
		Node* ptemp1 = pDiJi->pnext;
		while (ptemp1 != NULL)
		{
			//使用节点中的数据去绘制矩形
			rectangle(ptemp1->x, ptemp1->y, ptemp1->x + 50, ptemp1->y + 20);

			//控制这个矩形的移动
			ptemp1->y += 20;

			//指向下一个节点
			ptemp1 = ptemp1->pnext;
		}
//=======================子弹================================================
		//添加节点
		AddNode(pZidan,1);

		Sleep(100);
		cleardevice();

		//显示节点的内容(数据用到绘制矩形上面去)
		Node* ptemp = pZidan->pnext;
		while (ptemp != NULL)
		{
			//使用节点中的数据去绘制矩形
			rectangle(ptemp->x, ptemp->y, ptemp->x + 10, ptemp->y + 20);

			//控制这个矩形的移动
			ptemp->y -= 20;

			//指向下一个节点
			ptemp = ptemp->pnext;
		}

		Shoot();

		if (kbhit())
		{
			ch = getch();

			switch (ch)
			{

			case 75:
				xx -= 10;
				break;

			case 77:
				xx += 10;
				break;

			}

		}

	}



	return 0;
}


猜你喜欢

转载自blog.csdn.net/zzb2019/article/details/81504994