二维坦克大战游戏代码开发

2023-05-16

这是我实际面试中,遇到的一个题目,编写一个坦克大战游戏。一开始感觉懵,后来代码写写就好了。

#include<iostream>
#include<stdlib.h>
#include<graphics.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#pragma comment(lib,"winmm.lib") 
using namespace std;
int xx[50][50];
void refresh()
{
	int a,b;
	for(a=0;a<=49;a++)
		for(b=0;b<=49;b++)
			xx[a][b]=0;
}
void graph()
{
	int a,b;
	for(a=0;a<=49;a++)
		for(b=0;b<=49;b++)
		{
			if(xx[a][b]!=0)
			{
				setfillcolor(WHITE);
				setlinecolor(WHITE);
				fillrectangle(a*10,b*10,a*10+8,b*10+8);
			}
			if(xx[a][b]==0)
			{
				setfillcolor(BLACK);
				setlinecolor(BLACK);
				fillrectangle(a*10,b*10,a*10+8,b*10+8);
			}
		}
}
int kb(void)
{
	char a[2],shang[3],xia[3],zuo[3],you[3];
	while(1)
	{
		strcpy(shang,"郒");
		strcpy(xia,"郟");
		strcpy(zuo,"郖");
		strcpy(you,"郙");
		a[0]=getch();
		if(a[0]==shang[0]||a[0]==zuo[0]||a[0]==xia[0]||a[0]==you[0])
		{
			a[1]=getch();
			if(a[1]==shang[1])
				return 1;
			if(a[1]==zuo[1])
				return 3;
			if(a[1]==xia[1])
				return 2;
			if(a[1]==you[1])
				return 4;
		}
		if(a[0]==13)
			return 5;
	}
}
class tank;
class bullet;
class tank
{
private:
	int x,y,v,direction,t,body[4][9];
public:
	tank(int T);
	void move(bullet *&p,tank *b[],int tt);
	void fire(bullet *&p);
	void die(tank *&p);
	void tank1();
	void viewin();
	void viewcl();
	void me(int x,int y,tank *&p);
	void smart(tank *p,bullet *b,bullet *&p1,tank *p2[]);
	int gett();
	int getx();
	int gety();
};
class bullet
{
private:
	int x,y,v,direction,t;
public:
	bullet(int X,int Y,int T,int Direction,int V);
	void move(bullet *&p,tank *p1[]);
	void die(bullet *&p,tank *p1[]);
	void viewin();
	void viewcl();
	int getx();
	int gety();
};
int bullet::getx()
{
	return x;
}
int bullet::gety()
{
	return y;
}
void tank::fire(bullet *&p)
{
	if(p==NULL)
	{
		PlaySound ("子弹发射声.wav",NULL,SND_FILENAME | SND_ASYNC);
		p=new bullet(x,y,t+3,direction,1);
	}
}
int tank::gett()
{
	return t;
}
void bullet::viewin()
{
	if(xx[x][y]==0)
		xx[x][y]=t;
}
void bullet::viewcl()
{
	if(!(xx[x][y]!=0&&xx[x][y]!=t))
		xx[x][y]=0;
}
bullet::bullet(int X,int Y,int T,int Direction,int V)
{
	t=T;
	x=X;
	y=Y;
	direction=Direction;
	v=V;
	viewin();
}
void bullet::move(bullet *&p,tank *p1[])
{
	switch(direction)
	{
	case 1:viewcl();y-=v;break;
	case 2:viewcl();y+=v;break;
	case 3:viewcl();x-=v;break;
	case 4:viewcl();x+=v;break;
	}
	die(p,p1);
}
void bullet::die(bullet *&p,tank *p1[])
{
	int a;
	if(x<=0||y<=0||x>=49||y>=49)
	{
		bullet *q=p;
		p=NULL;
		viewcl();
		delete q;
		return ;
	}
	int key=0,tx,ty,tt;
	for(a=0;a<2;a++)
	{
		if(t==4)
			if(a==0)
				continue;
			if(t!=4)
				if(a!=0)
					continue;
				if(p1[a]!=NULL)
				{
					tx=p1[a]->getx();
					ty=p1[a]->gety();
					tt=p1[a]->gett();
					if(abs(tx-x)<=1&&abs(ty-y)<=1)
					{	
						key=1;
						break;
					}
				}
	}
	if(key==1)
	{
		p1[a]->die(p1[a]);
		bullet *q=p;
		p=NULL;
		delete q;
		return ;
	}
	viewin();
}
void tank::tank1()
{
	if(t==0)
		direction=2;
	if(t==1)
		direction=1;
	x=1;
	y=48;
	v=1;
}
int tank::getx()
{
	return this->x;
}
int tank::gety()
{
	return this->y;
}
void tank::me(int x,int y,tank *&p)
{
	if(x-(this->x)<=1&&x-(this->x)>=-1)
		if(y-(this->y)<=1&&y-(this->y)>=-1)
			die(p);
}
void tank::die(tank *&p)
{
	p->viewcl();
	tank *q=p;
	p=NULL;
	delete q;
}
tank::tank(int T)
{
	t=T;
	int a;
	if(t==0)
	{
		direction=2;
		x=5;
		y=1;
	}
	if(t==2)
	{
		t=0;
		direction=2;
		x=43;
		y=1;
	}
	if(t==1)
	{
		direction=1;
		x=1;
		y=48;
	}
	v=1;
	for(a=0;a<=8;a++)
	{
		body[0][a]=t+1;
		body[1][a]=t+1;
		body[2][a]=t+1;
		body[3][a]=t+1;
		if(a==0||a==2||a==7)
		{
			body[0][a]=0;
		}
		if(a==1||a==6||a==8)
		{
			body[1][a]=0;
		}
		if(a==0||a==5||a==6)
		{
			body[2][a]=0;
		}
		if(a==2||a==3||a==8)
		{
			body[3][a]=0;
		}
	}
	viewin();
}
void tank::smart(tank *p,bullet *b,bullet *&p1,tank *p2[])
{
	static int kk;
	int dx,dy,bx,by;
	if(p==NULL)
		return ;
	dx=p->getx()-x;
	dy=p->gety()-y;
	if(b==NULL)
	{
		bx=100;
		by=100;
	}
	if(b!=NULL)
	{
		bx=b->getx()-x;
		by=b->gety()-y;
	}
	if(abs(bx)>1&&abs(by)>1)
	{
		if(b==NULL)
		{
			if(dx<-1&&dy<-1&&abs(dy)<=abs(dx))
			{
				move(p1,p2,1);
				return ;
			}
			if(dx<-1&&dy<-1&&abs(dy)>abs(dx))
			{
				move(p1,p2,3);return ;
			}
			if(dx<-1&&dy>1&&abs(dy)<=abs(dx))
			{
				move(p1,p2,2);return ;
			}
			if(dx<-1&&dy>1&&abs(dy)>abs(dx))
			{
				move(p1,p2,3);return ;
			}
			if(dx>1&&dy<-1&&abs(dy)<=abs(dx))
			{
				move(p1,p2,1);return ;
			}
			if(dx>1&&dy<-1&&abs(dy)>abs(dx))
			{
				move(p1,p2,4);return ;
			}
			if(dx>1&&dy>1&&abs(dy)<=abs(dx))
			{
				move(p1,p2,2);return ;
			}
			if(dx>1&&dy>1&&abs(dy)>abs(dx))
			{
				move(p1,p2,4);return ;
			}
		}
		if(abs(dx)<=5&&abs(dy)<=5)
		{
			kk=1+rand()%4;
			move(p1,p2,kk);return ;
		}
		if(abs(dx)<=1)
		{
			if(dy>0)
			{
				if(direction==2)
				{
					move(p1,p2,5);return ;
				}
				else
				{
					move(p1,p2,2);return ;
				}
			}
			if(dy<0)
			{
				if(direction==1)
				{
					move(p1,p2,5);return ;
				}
				else
				{
					move(p1,p2,1);return ;
				}
			}
		}
		if(abs(dy)<=1)
		{
			if(dx<0)
			{
				if(direction==3)
				{
					move(p1,p2,5);return ;
				}
				else
				{
					move(p1,p2,3);return ;
				}
			}
			if(dx>0)
			{
				if(direction==4)
				{
					move(p1,p2,5);return ;
				}
				else
				{
					move(p1,p2,4);return ;
				}
			}
		}
	}
	else
	{
		if(abs(bx)<=1)
		{
			if(dx>0)
			{
				move(p1,p2,3);return ;
			}
			if(dx<0)
			{
				move(p1,p2,4);return ;
			}
			if(dx==0)
			{
				move(p1,p2,3);return ;
			}
		}
		if(abs(by)<=1)
		{
			if(dy>0)
			{
				move(p1,p2,1);return ;
			}
			if(dy<0)
			{
				move(p1,p2,2);return ;
			}
			if(dy==0)
			{
				move(p1,p2,1);return ;
			}
		}
	}
}
void tank::move(bullet *&p,tank *b[],int tt=0)
{
	int k,a,key=0;
	if(tt==0)
		if(kbhit())
		{
			k=kb();
			switch(k)
			{
			case 1:viewcl();y-=v;direction=k;break;
			case 2:viewcl();y+=v;direction=k;break;
			case 3:viewcl();x-=v;direction=k;break;
			case 4:viewcl();x+=v;direction=k;break;
			case 5:fire(p);break;
			}
			for(a=0;a<=1;a++)
			{
				if(abs(b[a]->getx()-x)<=2&&abs(abs(b[a]->gety()-y)<=2)&&abs(b[a]->getx()-x)!=0&&abs(abs(b[a]->gety()-y)!=0))
				{
					key=1;
				}
			}
			if(key||x<1||x>48||y<1||y>48)
				switch(k)
			{
			case 1:y+=v;direction=k;break;
			case 2:y-=v;direction=k;break;
			case 3:x+=v;direction=k;break;
			case 4:x-=v;direction=k;break;
			case 5:fire(p);break;
			}
			viewin();
		}
		if(tt!=0)
		{
			k=tt;
			switch(k)
			{
			case 1:viewcl();y-=v;direction=k;break;
			case 2:viewcl();y+=v;direction=k;break;
			case 3:viewcl();x-=v;direction=k;break;
			case 4:viewcl();x+=v;direction=k;break;
			case 5:fire(p);break;
			}
			for(a=0;a<=1;a++)
			{
				if(abs(b[a]->getx()-x)<=2&&abs(abs(b[a]->gety()-y)<=2)&&abs(b[a]->getx()-x)!=0&&abs(abs(b[a]->gety()-y)!=0))
				{
					key=1;
				}
			}
			if(key||x<1||x>48||y<1||y>48)
				switch(k)
			{
			case 1:y+=v;direction=k;break;
			case 2:y-=v;direction=k;break;
			case 3:x+=v;direction=k;break;
			case 4:x-=v;direction=k;break;
			case 5:fire(p);break;
			}
			viewin();
		}
}
void tank::viewin()
{
	int a,b,c=0;
	for(b=y-1;b<=y+1;b++)
	{
		for(a=x-1;a<=x+1;a++)
		{
			xx[a][b]=body[direction-1][c];
			c++;
		}
	}
}
void tank::viewcl()
{
	int a,b,c=0;
	for(a=x-1;a<=x+1;a++)
	{
		for(b=y-1;b<=y+1;b++)
		{
			xx[a][b]=0;
		}
	}
}
int main()
{
	int order;
	cout<<"让我去还是你自己去\n1:玩家\n2:电脑"<<endl;
	cin>>order;
	initgraph(500,500);
	refresh();
	tank *t[3];
	t[0]=new tank(1);
	t[1]=new tank(0);
	//t[2]=new tank(2);
	bullet *bu[3];
	int a;
	for(a=0;a<=2;a++)
		bu[a]=NULL;
	graph();
	while(1)
	{
		for(a=0;a<=2;a++)
		{
			if(bu[a]!=NULL)
			{
				bu[a]->move(bu[a],t);
			}
		}
		for(a=1;a<=1;a++)
		{
			if(t[a]!=NULL)
				t[a]->smart(t[0],bu[0],bu[a],t);
		}
		if(order==1)
		{
			if(t[0]!=NULL)
				t[0]->move(bu[0],t);
		}
		if(order!=1)
		{
			if(t[0]!=NULL)
				t[0]->smart(t[1],bu[1],bu[0],t);
		}
		if(t[0]==NULL)
		{
			closegraph();
			system("cls");
			cout<<"你输了,我不是说你渣,而是在座的各位都是渣渣"<<endl;
			Sleep(5000);
			break;
		}
		if(t[1]==NULL)
		{
			closegraph();
			system("cls");
			cout<<"你居然赢了"<<endl;
			Sleep(5000);
			break;
		}
		graph();
		/*for(int k=0;k<=49;k++)
		{
		for(int l=0;l<=49;l++)
		{
		cout<<xx[l][k];
		}
		cout<<endl;
	}*/
		Sleep(10);
		//system("cls");
	}
	return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维坦克大战游戏代码开发 的相关文章

  • 设计模式学习笔记

    变化是复用的天敌 xff01 面向对象设计最大的优势在于 xff1a 抵御变化 重新认识面向对象 xff1a 理解格力变化 xff1a 从宏观层面来看 xff0c 面向对象的构建方式更能适应软件的变化 xff0c 能将变化所带来的影响减为最
  • leetcode刷题5/29

    面试题24 反转链表 难度简单42 定义一个函数 xff0c 输入一个链表的头节点 xff0c 反转该链表并输出反转后链表的头节点 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL 输出 5 gt 4 gt 3 gt
  • 浅谈单例模式 又叫对象性能模式

    对象性能模式 面向对象很好地解决抽象的问题 xff0c 但是必不可免地要付出一些代价 xff0c 对于通常情况来讲 xff0c 面向对象的成本大都可以忽略不计 xff0c 但是某些情况 xff0c 面向对象所带来的的成本必须谨慎处理 经典模
  • 清华大学研究成果:如何用博弈论解决自动驾驶路口的会车决策问题?

    雷锋网新智驾按 xff1a 4月24日 xff0c 雷锋网新智驾联合MMC在2017年上海车展举办 构建智能驾驶的关键 主题沙龙 xff0c 本文来自清华大学自动化系统工程研究所教授姚丹亚的分享 本文讲述了V2X技术在自动驾驶中的一个重要应
  • Sonarqube集成到Jenkins实现代码自动检测

    如何使用Sonar把不同的代码检查工具结果直接显示在WEB页面上 xff1f xff1f 详细实操如下 xff1a 需要配置 Sonarqube服务端 xff1a 192 168 10 12Sonarqube客户端postgres 数据库
  • 车路协调系统图

  • c++ 两个vector之间相互赋值,或在一个后面追加另一个

    方法1 xff1a vector lt int gt v1 v2 声明 方法2 xff1a vector lt int gt v1 v1 swap v2 将两个容器内的元素交换 需要构建临时对象 xff0c 一个拷贝构造 xff0c 两次赋
  • 6月8 力扣 回文数和验证回文串

    9 回文数 难度简单1057收藏分享切换为英文关注反馈 判断一个整数是否是回文数 回文数是指正序 xff08 从左向右 xff09 和倒序 xff08 从右向左 xff09 读都是一样的整数 示例 1 输入 121 输出 true 示例 2
  • C++11 并发指南一(C++11 多线程初探)

    相信 Linux 程序员都用过 Pthread 但有了 C 43 43 11 的 std thread 以后 xff0c 你可以在语言层面编写多线程程序了 xff0c 直接的好处就是多线程程序的可移植性得到了很大的提高 xff0c 所以作为
  • 二分搜索binary search和贪婪算法

    二分搜索binary search 定义 xff1a 二分搜索也称折半搜索 xff0c 是一种在有序数组中查找某一特定元素的搜索算法 运用前提 xff1a 必须是排好序的 输入并不一定是数组 xff0c 也可能是给定一个区间和终止的位置 优
  • 面试题52. 两个链表的第一个公共节点

    面试题52 两个链表的第一个公共节点 难度简单51收藏分享切换为英文关注反馈 输入两个链表 xff0c 找出它们的第一个公共节点 如下面的两个链表 xff1a 在节点 c1 开始相交 示例 1 xff1a 输入 xff1a intersec
  • 求解两个字符串的最长公共子序列

    一 xff0c 问题描述 给定两个字符串 xff0c 求解这两个字符串的最长公共子序列 xff08 Longest Common Sequence xff09 比如字符串1 xff1a BDCABA xff1b 字符串2 xff1a ABC
  • leetcode刷题6.16 树的层序遍历,树的序列化

    给你一个二叉树 xff0c 请你返回其按 层序遍历 得到的节点值 xff08 即逐层地 xff0c 从左到右访问所有节点 xff09 示例 xff1a 二叉树 xff1a 3 9 20 null null 15 7 3 9 20 15 7
  • 深度优先及广度优先算法

    深度优先搜索算法DFS 广度优先搜索算法BFS 在猪呢个算法知识点中占比非常大 xff0c 应用最多的地方是对图进行遍历 xff08 树以为是图的一种 xff09 深度优先搜索算法DFS DFS解决的 是连通性的问题 xff0c 及给定两个
  • 厄拉多塞筛法 快速求质数 /回文子串

    西元前250年 xff0c 希腊数学家厄拉多塞 Eeatosthese 想到了一个非常美妙的质数筛法 xff0c 减少了逐一检查每个数的的步骤 xff0c 可以比较简单的从一大堆数字之中 xff0c 筛选出质数来 xff0c 这方法被称作厄
  • Docker部署Sonarqube

    1 下载镜像 docker pull registry span class token punctuation span cn span class token operator span shenzhen span class toke
  • leetcode刷题 旋转链表

    92 反转链表 II 难度中等393 反转从位置 m 到 n 的链表 请使用一趟扫描完成反转 说明 1 m n 链表长度 示例 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL m 61 2 n 61 4 输出 1 gt 4
  • 分布式实时处理系统——C++高性能编程 RAII resource acquisition is initialization

    分布式实时处理系统 C 43 43 高性能编程 前言 基于通信基础 xff0c 介绍Hurricane实时处理系统的工程实现 xff0c 主要使用C 43 43 语言 一 IPC socket 异步I O epoll 二 C 43 43 1
  • 6月21 刷题思考

    1 RALL相关知识点 2 std set的使用 xff1f xff1f 不熟练 3 一个无序整数数组中找到最长连续序列 4 Two Sum 问题 Data structure design 5 i 43 43 在两个线程里边分别执行100

随机推荐

  • V2X就是Vehicle To Everything 国标中有五种消息BSM、RSI、RSM、SPAT、MAP

    前面讲到V2X就是Vehicle To Everything xff0c 即车队外界所有信息的交换 xff0c 这里的X代表Everything xff0c 在V2X概念中 xff0c 我们将它看作四大部分 xff0c 车与车通信 xff0
  • 6月23 leetcode 二进制求和

    67 二进制求和 难度简单404收藏分享切换为英文关注反馈 给你两个二进制字符串 xff0c 返回它们的和 xff08 用二进制表示 xff09 输入为 非空 字符串且只包含数字 1 和 0 示例 1 输入 a 61 34 11 34 b
  • 利用栈实现树的中序遍历

    94 二叉树的中序遍历 难度中等537收藏分享切换为英文关注反馈 给定一个二叉树 xff0c 返回它的中序 遍历 示例 输入 1 null 2 3 1 2 3 输出 1 3 2 进阶 递归算法很简单 xff0c 你可以通过迭代算法完成吗 x
  • STL中的set详解

    1 关于set C 43 43 STL 之所以得到广泛的赞誉 xff0c 也被很多人使用 xff0c 不只是提供了像vector string list等方便的容器 xff0c 更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构
  • 你真的了解二分查找吗?

    传统的二分查找算法 提到二分查找 xff0c 相信很多人都不陌生 xff0c 大学学数据结构的时候老师都讲过 xff0c 它是一种效率较高的查找方法 xff0c 基于顺序存储结构的线性表 xff0c 且要求表中元素按关键字有序排列 假设元素
  • 二叉树DFS/BFS实现(C++)

    深度优先搜索算法 xff08 Depth First Search xff09 DFS是搜索算法的一种 它沿着树的深度遍历树的节点 xff0c 尽可能深的搜索树的分支 当节点v的所有边都己被探寻过 xff0c 搜索将回溯到发现节点v的那条边
  • 当TCP建立连接过程中出现问题了,如何检查?

    netstat命令 stat状态说明 TCP协议规定 xff0c 对于已经建立的连接 xff0c 网络双方要进行四次握手才能成功断开连接 xff0c 如果缺少了其中某个步骤 xff0c 将会使连接处于假死状态 xff0c 连接本身占用的资源
  • 本地服务器上传代码到gitee仓库

    把gitlab仓库里的node day01项目传到本地服务器 再把本地服务器里的node day01项目传到Gitee代码仓库 1 登录Gitlab xff0c 复制代码仓库地址 2 拷贝一刚复制的Git 仓库到本地 root 64 ubu
  • 牛客网刷刷刷刷

    作者 xff1a 故事的小黄瓜 链接 xff1a https www nowcoder com discuss 436386 来源 xff1a 牛客网 1 xff0e 线程池如何开启一个新线程 xff1f 2 xff0e 线程池初始化的步骤
  • c++ 后端linux开发常见问题

    计算机操作系统 xff08 Linux xff09 命令 xff1a netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 cpu 内存 硬盘 等等与系统性能调试相关的命令必须熟
  • STL c++ 使用小结

    各位看官 xff0c 欢迎来到趁热搬砖小码农的博客 在写C 43 43 程序的时候会发现STL是一个不错的东西 xff0c 减少了代码量 xff0c 使代码的复用率大大提高 xff0c 减轻了程序猿的负担 还有一个就是容器 xff0c 你会
  • Oracle面试题,带答案!

    1 你要对操纵Oracle数据库中的数据 下列哪个选项表示Oracle中select语句的功能 xff0c 并且不需要使用子查询 xff08 C xff09 A xff0e 可以用select语句改变Oracle中的数据 B xff0e 可
  • 什么是进程?什么是线程?总结

    1 什么是进程 xff1f 什么是线程 xff1f 进程是表示资源分配的基本单位 xff0c 又是调度运行的基本单位 例如 xff0c 用户运行自己的程序 xff0c 系统就创建一个进程 xff0c 并为它分配资源 xff0c 包括各种表格
  • C++知识点小结(趁热搬砖三年半的小码农) 2020年07月2日整理

    c 43 43 最好用易用的新特性 xff1a auto decltype https blog csdn net zyc2018 article details 93591189nullptr range forusing c 43 43
  • 如何定位内存泄漏问题

    如何定位内存泄漏问题 Things You 39 ll Need Proficiency in C 43 43 C 43 43 compilerDebugger and other investigative software tools
  • C++之future和promise

    C 43 43 之future和promise future和promise的作用是在不同线程之间传递数据 使用指针也可以完成数据的传递 xff0c 但是指针非常危险 xff0c 因为互斥量不能阻止指针的访问 xff1b 而且指针的方式传递
  • linux常用小知识点

    答案linux考试题 1 在登录Linux时 xff0c 一个具有唯一进程ID号的shell将被调用 xff0c 这个ID是什么 b A NID B PID C UID C CID 答 xff1a w命令查看用户tty终端信息 ps ef
  • 无锁编程基础

    背景 我们处在技术快速发展的时代 xff0c 竞争变得前所未有的激烈 xff0c 不仅要十八般武艺俱全 xff0c 还得选对正确的技术 xff0c 跟上发展的脚步 xff0c 并贴上精研某个专业方向的标签 我们不仅要面对多线程和并发 xff
  • Linux网络相关概念和修改IP地址的方法

    网卡的命名规则 ifconfig xff1a 用于显示或设置网络设备 ens32 span class token punctuation span flags span class token operator 61 span span
  • 二维坦克大战游戏代码开发

    这是我实际面试中 xff0c 遇到的一个题目 xff0c 编写一个坦克大战游戏 一开始感觉懵 xff0c 后来代码写写就好了 include lt iostream gt include lt stdlib h gt include lt