c语言坦克大战源代码

合集下载

坦克大战c++程序

坦克大战c++程序
break;
}
else if(choice!='1'&&choice!='2'&&choice!='3')
$专业科 = returntablefield("edu_xi","系代码",$所属系,"系名称");;
if($专业科!="") {
$sql = "update edu_newstudent set 专业科='$专业科' where 录取专业='$录取专业'";
$db->Execute($sql);
#define up 72
#define down 80
#define left 75
#define right 77
#define esc 27
#define MAPW 15 //地图的宽度
#define MAPH 25 //地图的高度
{
char choice;
choice=_getch();
if(choice=='1')
{
textout(handle,22,6,wColors+2,1,"开始游戏,初级");
textout(handle,32,8,wColors+2,1," ");
handle=initiate();
WORD wColors[1]={FOREGROUND_BLUE| FOREGROUND_GREEN|FOREGROUND_INTENSITY };

坦克大战

坦克大战

Java编程坦克大战源程序如下:图片自己添加,音乐为wav格式的:import javax.swing.*;import java.util.EventListener;import java.awt.*;import java.awt.event.*;import java.util.Vector;public class Tank1 extends JFrame implements ActionListener{MyPanel mb;passPanel pass;JMenuItem item1,item2;JMenu menu;JMenuBar bar;public static void main(String[] args){Tank1 tank=new Tank1();}public Tank1(){bar=new JMenuBar();menu=new JMenu("游戏(G)");menu.setMnemonic('G');//按Alt+F可以实现鼠标点击文件一样的功能item1=new JMenuItem("开始(N)");item2=new JMenuItem("退出(T)");item1.setMnemonic('N');item2.setMnemonic('T');item1.addActionListener(this);item1.setActionCommand("NEW");item2.addActionListener(this);item2.setActionCommand("OVER");menu.add(item1);menu.add(item2);bar.add(menu);pass=new passPanel();this.add(pass);Thread pa=new Thread(pass);pa.start();//起动关卡面板字体闪烁this.setJMenuBar(bar);this.setTitle("坦克游戏");this.setIconImage((new ImageIcon("tank.jpg")).getImage());this.setSize(700,700);this.setLocation(320,10);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}public void actionPerformed(ActionEvent e) {if(e.getActionCommand().equals("NEW")){mb=new MyPanel();this.remove(pass);//删除旧面板,也就是关卡面板this.add(mb);this.addKeyListener(mb);//监听Thread t1=new Thread(mb);t1.start();//运行MyPanel类中的run方法this.setVisible(true);//显示游戏面板}if(e.getActionCommand().equals("OVER")){System.exit(0);}}}class passPanel extends JPanel implements Runnable{//关卡面板int time=0;//关卡面板闪烁时间public void paint(Graphics g){super.paint(g);g.fillRect(0,0,685,635);if(time%2==0){g.setColor(Color.green);Font myFont=new Font("华文行楷",Font.BOLD,60);g.setFont(myFont);g.drawString("坦克大战",220,300);}}public void run() {//闪烁功能while(true){try{Thread.sleep(500);}catch(Exception e){}time++;this.repaint();}}}class MyPanel extends JPanel implements KeyListener,Runnable{//自己定义的面板Vector<youTank> ytj=new Vector<youTank>();//定义敌方坦克,泛型,后面不用强制转换Vector<Burst> burst=new Vector<Burst>();//定义爆炸的集合Vector< MyTank> mytank=new Vector< MyTank>();MyTank mt=null;//定义一个我方坦克,Image tp1=null;//爆炸的图片Image tp2=null;Image tp3=null;Image tp4=null;Image tp5=null;Image tp6=null;int ytNum=3;//敌方坦克数量public MyPanel(){mt=new MyTank(310,500);//我方坦克出现位置mytank.add(mt);//添加集合mytank中for(int i=0;i<ytNum;i++){//敌方坦克youTank yt=new youTank((i)*300+10,50);yt.setDirect(1);yt.YT(ytj);//使得集合ytj一样Thread t3=new Thread(yt);t3.start();//启动敌方坦克线程Bullet yb=new Bullet(yt.x+27,yt.y+40,1);//定义敌方子弹yt.ybt.add(yb);Thread t4=new Thread(yb);t4.start();//子弹线程ytj.add(yt);//添加到敌方坦克集合中}//定义三张爆炸图片tp1=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz.jpg"));tp2=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz1.jpg"));tp3=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/bz2.jpg"));tp4=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss.jpg"));tp5=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss1.jpg"));tp6=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/boss2.jpg"));music sta=new music("./tank.wav");//音乐线程sta.start();}public void numbers(Graphics g){//显示敌我两方的坦克信息if(ytj.size()==0){//闯过关卡g.setColor(Color.green);Font myFont1=new Font("华文行楷",Font.BOLD,60);g.setFont(myFont1);g.drawString("闯关成功",220,300);}if(number.getMy()==-1||number.getBossCount()==-1){//我方被攻击完,或者boss灭亡g.setColor(Color.green);Font myFont1=new Font("华文行楷",Font.BOLD,100);g.setFont(myFont1);g.drawString("game over",180,300);}Font myFont=new Font("楷体",Font.BOLD,20);g.setFont(myFont);g.setColor(Color.red);//把血量设置为红色g.drawString("生命:",10,25);if(number.getMy()==-1){int J=number.getMy()+1;g.drawString(J+"",70, 25);}else{g.drawString(number.getMy()+"",70, 25);}g.fillRect(90,10,number.getMyCount()*60,15);g.drawRect(90,10,300,15);g.setColor(Color.green);g.drawString("得分: "+number.getScore(),10, 50); //击中敌方坦克数量g.setColor(Color.blue);g.drawString(":生命",630,25);g.drawString(number.getYou()+"",610,25);g.drawString(1+"",410,25);g.drawString(2+"",410,45);g.drawString(3+"",410,65);g.drawRect(430,30,170,15);g.drawRect(430,10,170,15);g.drawRect(430,50,170,15);try{g.fillRect(430,10,ytj.get(0).youCount*85,15);g.fillRect(430,30,ytj.get(1).youCount*85,15);g.fillRect(430,50,ytj.get(2).youCount*85,15);}catch(Exception e){}}public void paint(Graphics g){super.paint(g);g.fillRect(0,0,685,635);//对面板也就是画布进行填充黑色if(number.getBossCount()==3){g.drawImage(tp4,280,560,140,80,this);//添加boss}if(number.getBossCount()==2){g.drawImage(tp5,300,580,120,60,this);//添加boss}if(number.getBossCount()==1){g.drawImage(tp6,320,600,100,40,this);//添加boss}this.numbers(g);//启动numbers方法if(number.getMy()>=0){this.myDrawTank(mytank.get(0).getX(),mytank.get(0).getY(),g,mytank.get(0).direct,0);//对坦克进行制作}//g后面第一个代表方向,第二个代表我方和敌方坦克for(int i=0;i<ytj.size();i++){//敌方坦克youTank yt1=ytj.get(i);if(yt1.youCount!=0){//可以不带truethis.myDrawTank(yt1.getX(),yt1.getY(),g,yt1.direct,1);for(int j=0;j<yt1.ybt.size();j++){Bullet yb=yt1.ybt.get(j);//取集合类中的子弹if(yb!=null&&yb.limit==true){//使得子弹不能连接成一条线,limit控制子弹走到面板边界g.setColor(Color.blue);g.fillOval(yb.x,yb.y,10,10);}if(yb.limit==false){//如子弹到达边界时,则把这个子弹从集合类中删去yt1.ybt.remove(yb);}}}}for(int i=0;i<mytank.get(0).a.size();i++){Bullet bt1=mytank.get(0).a.get(i);//取集合类中的子弹if(bt1!=null&&bt1.limit==true){//使得子弹不能连接成一条线,limit控制子弹走到面板边界g.setColor(Color.red);g.fillOval(bt1.x,bt1.y,10,10);}if(bt1.limit==false){//如子弹到达边界时,则把这个子弹从集合类中删去mytank.get(0).a.remove(bt1);}}for(int i=0;i<burst.size();i++){//绘画出爆炸的效果Burst bt=burst.get(i);if(bt.time>6){g.drawImage(tp1,bt.x,bt.y,50,45,this);}else if(bt.time>3){g.drawImage(tp2,bt.x,bt.y,30,25,this);}else {g.drawImage(tp3,bt.x,bt.y,10,5,this);}bt.reduce();if(bt.time==0){burst.remove(bt);}}}public void hit(Bullet bt,Tank tk){//子弹击中坦克判断方法switch(tk.direct){//敌方坦克方向,如果子弹在坦克长宽大小范围内,则同时消失case 0:case 1:if(bt.x>tk.x&&bt.x<tk.x+65&&bt.y>tk.y&&bt.y<tk.y+50){tk.life=false;bt.limit=false;}break;case 2:case 3:if(bt.x>tk.x&&bt.x<tk.x+50&&bt.y>tk.y&&bt.y<tk.y+65){tk.life=false;bt.limit=false;}break;}}public void Life(int a){//坦克死亡和添加if(a==0){if(number.getYou()>0){ //如果敌方坦克还未出来的number.youNum();//坦克减少youTank yt=new youTank(number.getYou()*70,50);yt.setDirect(1);//设置坦克方向ytj.add(yt);yt.YT(ytj);//使得集合ytj一样Thread t6=new Thread(yt);t6.start();//启动敌方坦克线程}}if(a==1){if(number.getMyCount()==0){//如果被敌方击中5次Burst by1=new Burst(mytank.get(0).x,mytank.get(0).y);//添加爆炸burst.add(by1);if(number.getMy()>=0){number.myNum();//我方减少}if(number.getMy()>=0){mytank.remove(0);MyTank mt1=new MyTank(310,500);//我方坦克出现位置mytank.add(mt1);//添加集合mytank中number.setMyCount(5);}}}}public void myDrawTank(int x,int y,Graphics g,int direct,int form){//direct 意思是坦克的左右上下方向//form 意思是敌方和我方的坦克不一样,0代表我方,1代表敌方switch(form){case 0:g.setColor(Color.red);break;case 1:g.setColor(Color.blue);break;}switch(direct){case 0://代表坦克朝上g.fill3DRect(x,y,20,50,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+20,y+10,24,30,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+44,y,20,50,false);//矩形,前两个坐标,后长宽g.fill3DRect(x+27,y-20,10,30,false);g.fillOval(x+22,y+16,18,18);//画个圆break;case 1://代表朝下,改变直线位置g.fill3DRect(x,y,20,50,false);g.fill3DRect(x+20,y+10,24,30,false);g.fill3DRect(x+44,y,20,50,false);g.fill3DRect(x+27,y+40,10,30,false);g.fillOval(x+22,y+16,18,18);break;case 2://朝右g.fill3DRect(x,y,50,20,false);g.fill3DRect(x+10,y+20,30,24,false);g.fill3DRect(x,y+44,50,20,false);g.fill3DRect(x-20,y+27,30,10,false);g.fillOval(x+16,y+22,18,18);break;case 3://朝左g.fill3DRect(x,y,50,20,false);g.fill3DRect(x+10,y+20,30,24,false);g.fill3DRect(x,y+44,50,20,false);g.fill3DRect(x+40,y+27,30,10,false);g.fillOval(x+16,y+22,18,18);break;}}@Overridepublic void keyTyped(KeyEvent e) {}public void keyReleased(KeyEvent e) {}public void keyPressed(KeyEvent e) {if(e.getKeyCode()==KeyEvent.VK_W){this.mytank.get(0).setDirect(0);this.mytank.get(0).north();}else if(e.getKeyCode()==KeyEvent.VK_S){this.mytank.get(0).setDirect(1);this.mytank.get(0).south();}else if(e.getKeyCode()==KeyEvent.VK_A){this.mytank.get(0).setDirect(2);this.mytank.get(0).right();}else if(e.getKeyCode()==KeyEvent.VK_D){this.mytank.get(0).setDirect(3);this.mytank.get(0).left();}if(e.getKeyCode()==KeyEvent.VK_SPACE){//空格键控制子弹if(this.mytank.get(0).a.size()<10){//当子弹集合类中子弹数达到10个时,则不再发射子弹this.mytank.get(0).send();}}this.repaint();}@Overridepublic void run(){//让睡眠之后再重新绘制画面,就是为了让子弹自己运动while(true) {try{Thread.sleep(100);}catch(Exception e){}for(int i=0;i<ytj.size();i++){//boss被击中youTank yt2=ytj.get(i);for(int j=0;j<yt2.ybt.size();j++){Bullet by=yt2.ybt.get(j);if(number.getBossCount()==3){if(by.x>280&&by.x<420&&by.y>560){by.limit=false;number.BossCount();}}if(number.getBossCount()==2){if(by.x>300&&by.x<400&&by.y>580){by.limit=false;number.BossCount();}}if(number.getBossCount()==1){if(by.x>320&&by.x<400&&by.y>600){by.limit=false;number.BossCount();}}if(number.getBossCount()==0){number.BossCount();Burst by2=new Burst(340,600);//添加爆炸burst.add(by2);}}}for(int i=0;i<mytank.get(0).a.size();i++){//敌方,每个子弹都和每个敌方坦克比较Bullet bt2=mytank.get(0).a.get(i);//取出子弹if(bt2.limit){//如果子弹limit为truefor(int j=0;j<ytj.size();j++){youTank yt1=ytj.get(j);//取出敌方坦克if(yt1.life){this.hit(bt2,yt1);if(yt1.life==false){yt1.youCount--;yt1.life=true;if(yt1.youCount==0){ytj.remove(j);//如果死亡则删除number.scoreNum();//得分Burst by=new Burst(yt1.x,yt1.y);//添加爆炸burst.add(by);this.Life(0);}}}}}}for(int i=0;i<ytj.size();i++){//我方坦克是否被击中youTank yt2=ytj.get(i);for(int j=0;j<yt2.ybt.size();j++){Bullet by=yt2.ybt.get(j);this.hit(by,mytank.get(0));if(mytank.get(0).life==false){//我方坦克被击中number.myCountNum();//被击中mytank.get(0).life=true;//复活this.Life(1);}}}this.repaint();//在for外面,不然敌方坦克不能动}}}import java.io.File;import java.util.Vector;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;class Tank{int x=0,y=0;int direct=0;//坦克方向0代表向上,1代表向下,2代表向右,3代表向左int speed=10;//坦克速度boolean life=true;//定义坦克的生命死亡public int getDirect() {return direct;}public void setDirect(int direct) {this.direct = direct;}public int getSpeed() {return speed;}public void setSpeed(int speed) {this.speed = speed;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Tank(int x,int y){//构造函数this.x=x;this.y=y;}}class MyTank extends Tank{//我方坦克,继承坦克类,子弹跟着坦克走Vector<Bullet> a=new Vector<Bullet>();//把子弹放到一个集合类中Bullet bt=null;//定义子弹public MyTank(int x,int y){super(x,y);}public void send(){//发射子弹方法switch(this.direct){//我方子弹方向和坦克方向一样,this.direct为Tank中的case 0:bt=new Bullet(x+27,y,0);//最后的0为子弹方向a.add(bt);//添加子弹break;case 1:bt=new Bullet(x+27,y+40,1);a.add(bt);break;case 2:bt=new Bullet(x,y+27,2);a.add(bt);break;case 3:bt=new Bullet(x+44,y+27,3);a.add(bt);break;}Thread t2=new Thread(bt);t2.start();//子弹的run方法,Bullet类中的}public void north(){//向上运动if(y>50){y-=speed;}}public void south(){if(y<570){y+=speed;}}public void right(){if(x>0){x-=speed;}}public void left(){if(x<620){x+=speed;}}}class youTank extends Tank implements Runnable{//敌方坦克,继承坦克类int speed=2;//可以继承坦克类的速度,也可以自己再定义int time=0;//时间int youCount=2;//敌方被击中次数Vector<Bullet> ybt=new Vector<Bullet>();//定义敌方坦克子弹集合Vector<youTank> ytj=new Vector<youTank>();public youTank(int x,int y){super(x,y);}public void YT(Vector<youTank> ytjh){this.ytj=ytjh;}public boolean crash(){boolean b=false;switch(this.direct){case 0:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x && this.x<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}if(this.x+65>=yt.x && this.x+65<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x && this.x<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}if(this.x+65>=yt.x && this.x+65<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}}}}break;case 1:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x&&this.x<=yt.x+65&&this.y>=yt.y&&this.y<=yt.y+50){return true;}if(this.x>=yt.x&&this.x<=yt.x+65&&this.y+65>=yt.y&&this.y+65<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x&&this.x<=yt.x+50&&this.y>=yt.y&&this.y<=yt.y+65){return true;}if(this.x>=yt.x&&this.x<=yt.x+50&&this.y+65>=yt.y&&this.y+65<=yt.y+65){return true;}}}}break;case 2:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x>=yt.x&&this.x<=yt.x+65&&this.y+50>=yt.y&&this.y+50<=yt.y+50){return true;}if(this.x+65>=yt.x&&this.x+65<=yt.x+65&&this.y+50>=yt.y&&this.y+50<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x>=yt.x&&this.x<=yt.x+50&&this.y+50>=yt.y&&this.y+50<=yt.y+65){return true;}if(this.x+65>=yt.x&&this.x+65<=yt.x+50&&this.y+50>=yt.y&&this.y+50<=yt.y+65){return true;}}}}break;case 3:for(int i=0;i<ytj.size();i++){youTank yt=ytj.get(i);if(yt!=this){if(yt.direct==0||yt.direct==1){if(this.x+50>=yt.x && this.x+50<=yt.x+65 && this.y>=yt.y && this.y<=yt.y+50){return true;}if(this.x+50>=yt.x && this.x+50<=yt.x+65 && this.y+65>=yt.y && this.y+65<=yt.y+50){return true;}}if(yt.direct==3||yt.direct==2){if(this.x+50>=yt.x && this.x+50<=yt.x+50 && this.y>=yt.y && this.y<=yt.y+65){return true;}if(this.x+50>=yt.x && this.x+50<=yt.x+50 && this.y+65>=yt.y && this.y+65<=yt.y+65){return true;}}}}break;}return b;}public void run() {while(true){//坦克要一直活动,直到死亡switch(this.direct){case 0:for(int i=0;i<25;i++){if(y>50&&crash()==false){y-=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 1:for(int i=0;i<25;i++){if(y<570&&crash()==false){y+=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 2:for(int i=0;i<25;i++){if(x>0&&crash()==false){x-=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;case 3:for(int i=0;i<25;i++){if(x<620&&crash()==false){x+=speed;}try{Thread.sleep(50);}catch(Exception e){}}break;}this.direct=(int)(Math.random()*4);//0到3之间的数字if(this.youCount==0){//如果坦克死亡break;}this.time++;if(time%2==0){//可以加,也可以不加if(this.youCount!=0){//没有死亡if(ybt.size()<6){//敌方坦克可以发射的子弹数Bullet yb=null;switch(direct){//坦克方向case 0:yb=new Bullet(x+27,y,0);//最后的0为子弹方向ybt.add(yb);break;case 1:yb=new Bullet(x+27,y+40,1);ybt.add(yb);break;case 2:yb=new Bullet(x,y+27,2);ybt.add(yb);break;case 3:yb=new Bullet(x+44,y+27,3);ybt.add(yb);break;}Thread t5=new Thread(yb);//子弹线程t5.start();}}}}}}class Bullet implements Runnable{//创建子弹类,实现线程接口int x;int y;int direct;//子弹方向int speed=5;//子弹速度boolean limit=true;//控制子弹走到面板边界public Bullet(int x,int y,int direct){this.x=x;this.y=y;this.direct=direct;}public void run() {while(true){//凡是线程下死循环就要有个睡眠try{Thread.sleep(50);}catch(Exception e){}switch(this.direct){//this.direct为本类中的case 0:y-=speed;break;case 1:y+=speed;break;case 2:x-=speed;break;case 3:x+=speed;break;}if(x<0||x>680||y<0||y>630){//控制子弹走到面板边界this.limit=false;break;}}}}class Burst{//定义爆炸类int x,y;int time=9;//生存时间boolean life=true;public Burst(int x,int y){this.x=x;this.y=y;}public void reduce(){if(time>0){time--;}else{this.life=false;}}}class number{//记录敌我两方的坦克数量private static int my=2;//我方还剩余人数private static int you=7;//还剩余人数private static int score=0;//得分private static int myCount=5;//我方被击中次数private static int bossCount=3;//boss只能被攻击三次public static int getBossCount() {return bossCount;}public static void setBossCount(int bossCount) {number.bossCount = bossCount;}public static int getScore() {return score;}public static void setScore(int score) {number.score = score;}public static int getMyCount() {return myCount;}public static void setMyCount(int myCount) {number.myCount = myCount;}public static int getMy() {return my;}public static void setMy(int my) {number.my = my;}public static int getYou() {return you;}public static void setYou(int you) {number.you = you;}public static void youNum(){//敌方减少you--;}public static void myNum(){//我方减少my--;}public static void myCountNum(){//被击中myCount--;}public static void scoreNum(){//得分score++;}public static void BossCount(){bossCount--;}}class music extends Thread {//插入音乐private String mus;public music(String musi){mus=musi;}public void run() {File file = new File(mus);AudioInputStream input = null;try {input = AudioSystem.getAudioInputStream(file);} catch (Exception e){}AudioFormat format = input.getFormat();SourceDataLine data = null; info = new (SourceDataLine.class, format);try {data = (SourceDataLine) AudioSystem.getLine(info);data.open(format);} catch (Exception e){}data.start();int str = 0;byte[] byt = new byte[1024];try {while (str != -1) {str = input.read(byt, 0, byt.length);if (str >= 0)data.write(byt, 0, str );}} catch (Exception e){}finally {data.drain();//将残留部分处理干净data.close();}}}。

C语言完整游戏项目坦克大战详细代码

C语言完整游戏项目坦克大战详细代码

C语⾔完整游戏项⽬坦克⼤战详细代码话不多说我们今天就来创造出属于我们⾃⼰的《坦克⼤战》,GOGOGO直接开始吧这次的源码⽐较详细,我分了好⼏个cpp⽂件,思路更加的清晰,请耐⼼⽤⼼的观看⾸先就是我们载⼊图⽚的函数tupian.cpp# include "tanke.h"障碍物void LaoWang(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32 , 32 , &img, 32 * 5, 0 );}void tileHong(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 0, 0 );return;}void tileLv(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 2, 0 );return;}void tileBai(int * tilex, int * tiley){IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 1, 0 );return;}IMAGE img;loadimage(&img, _T("res\\tile.bmp"));putimage(*tilex, *tiley, 32, 32, &img, 32 * 3, 0 ); }//物品void FaZhang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\fazhang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShouQiang(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\shouqiang.jpg"));putimage(*wupinx, *wupiny, 24, 24, &img, 0, 0 ); }void ShangDian(int *wupinx, int *wupiny){IMAGE img;loadimage(&img,_T("res\\shangdian.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void YaoShui(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\yaoshui.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void DunPai(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\dunpai.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void XieZi(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\ iezi.jpg"));putimage(*wupinx, *wupiny, 28, 28, &img, 0, 0 ); }void Boss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\boss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }void BigBoss(int *wupinx, int *wupiny){IMAGE img;loadimage(&img, _T("res\\bigboss.jpg"));putimage(*wupinx, *wupiny, 32, 32, &img, 0, 0 ); }接下来是初始化的函数waiyuan.cpp# include "tanke.h"{setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾃⼰⽣命值:";outtextxy(0, 20, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *j) / 60.0);outtextxy(90, 20, c3);}void DShengMing(int * d,int *k){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "敌⼈⽣命值:";outtextxy(0, 0, c2);char c3[10] ;sprintf(c3, _T("%.1f"), 100* (60 - *d) / 60.0);outtextxy(90, 0, c3);char c4[40] = "恭喜~! 现在起⾦币到2200有惊喜!";//胜利 if ( *k >= 8000 ){setcolor(YELLOW);settextstyle(30, 0, ("宋体"));outtextxy(150, 0, c4);}}void Gold(int * gold){setcolor(GREEN);settextstyle(0, 0, ("宋体"));char c2[20] = "⾦币:";outtextxy(0, 40, c2);char c3[10] ;sprintf(c3, _T("%d"), *gold);outtextxy(40, 40, c3);}void start(void){initgraph(200, 130);TCHAR s1[10]="坦克⼤战";TCHAR s2[30]="按A 开始游戏按B 退出游戏";TCHAR s3[30]="按W S A D控制⽅向";TCHAR s4[20]="按J 发射⼦弹";TCHAR s5[20]="按C 看攻略";outtextxy(70, 0, s1);outtextxy(0, 110, s2);outtextxy(60, 90, s5);outtextxy(55, 30, s4);outtextxy(35, 60, s3);while (true){Sleep(500);if (GetAsyncKeyState('A')){BeginBatchDraw();closegraph();initgraph(640, 480);Sleep(200);Quit();return ;}if (GetAsyncKeyState('C'))GongLue();}}}void GongLue(void){initgraph(450, 300);TCHAR s1[20]="游戏攻略:";TCHAR s2[50]="再打坦克之前先吃法杖打掉⽩⾊砖块,";TCHAR s3[50]="这样敌坦克打⽩⾊就不能回⾎了,boss更应如此。

坦克大战,及源代码

坦克大战,及源代码

采用双向循环链表作太极形式旋转的图案,图案的变化采用刷新屏幕的方法做到。

首先,建立一个二维字符数组,保存图形数据,然后通过更改该二维字符数组和清屏,再显示,做到图像的变化。

用它提示坦克大战游戏的操作方法。

再显示问题解决后,通过无回显读取函数getch();和输入流检查函数kbhit();读取输入的方向键或回车键进入下一页面。

用同样的方法,读取方向键和回车键,更改内部图案方法,使用户选择关:第一关:仅有4个坦克同时作战,总数为30个!第二关:仅有5个坦克同时作战,总数为40个!第三关:有6个坦克同时作战,总数为50个!第四关:有7个坦克同时作战,总数为60个!第五关:有8个坦克同时作战,总数为70个!选择关卡后,进入下一页面:进行相关提示。

最后进入游戏界面。

也可以通过按左方向键返回上一级重新选择!!!第一关到第三关:都是宽80,高42的。

最后两关:都是宽160,高42的。

右击标题栏选择属性,进入设置。

接着就是进入最重要的坦克大战游戏了:这时采用的就不是刷新屏幕能解决的问题了。

由于界面太大,不能刷新屏幕,仅能用光标移动函数来更改图像。

光标移动函数为gotoxy(int ,int );读者自己查看定义。

采用同样输入流读取方法。

接着是游戏规则,操作者用W.w.A.a.S.s.D.d移动坦克,空格是停下。

用方向键改变炮筒的方向,回车键是开火。

但当自己的炮弹还在运行时,不得开火!!!用链表保存每一辆坦克(包括主坦克)的数据。

电脑控制的坦克,被控制者的坦克炮弹击中,就会发生爆炸,并死亡。

当界面上的所有坦克小于特定值时,如果内部还有未出现的坦克,就会在上方的随机位置,产生新坦克。

如果操作者的坦克被击中,它的HP(我称为生命值)就会减一点。

刚开始游戏时的HP=5;但升级进入下一关时保留上一局的最后分数和HP。

不会重置。

但游戏中有补血包,可以补充生命值(HP)补血包每90秒出现一次,出现的时间长为60秒。

如果在这期间操作者的坦克运动到它的位置,补血包将给操作者的坦克补血。

c语言坦克大战最新代码

c语言坦克大战最新代码
} key=bioskey(0);
judge_tank_my(map,key);/*判断己方坦克运动函数*/
} aaa: ; } void map_all(int map[15][15])/*初始化地图函数*/ { int i,j; for(i=0;i<15;i++)
for(j=0;j<15;j++) switch(map[j][i]) { case 0: break; case 5:map_wall(i,j);break;/*地形*/ case 6:map_steel(i,j);break; case 7:map_water(i,j);break; case 8:map_border(i,j);break; case 9:map_base(i,j);break; }
void uptank(int i,int j,int color);/*画坦克函数*/ void downtank(int i,int j,int color); void lefttank(int i,int j,int color); void righttank(int i,int j,int color);
/* Note:Your choice is C IDE */ #include "graphics.h" #include "stdlib.h" #include "stdio.h"
#define a_UP 0x4800/*定义A坦克按键*/ #define a_DOWN 0x5000 #define a_LEFT 0x4b00 #define a_RIGHT 0x4d00 #define a_shoot 0x1c0d
void judge_moveshootway(int map[15][15],int i);/*炮弹运动时判断炮弹方 向函数*/ void judge_shoot(int m,int map[15][15],int i);/*判断炮弹打中的物体函数 */ void judge_shootway(int map[15][15],int i);/*炮弹打中物体时判断方向函 数*/

c语言坦克大战源代码

c语言坦克大战源代码

c语言坦克大战源代码/*游戏的整体思路大概是这样的?首先是欢迎界面,然后进入游戏界面,最后是gameover的界面。

本来打算做单人游戏,后来发现让敌人自主移动比较困难,所以改成了双人游戏?layer1控制按键是up,down,left,right,enter,player2控制按键是a,s,d,w,space。

*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<graphics.h>/*定义鼠标键值常量*/#define ESC 0x011b/*玩家1坦克按键*/#define UP 0x4800#define DOWN 0x5000#define LEFT 0x4b00#define RIGHT 0x4d00#define ENTER 0x1c0d#define up 0x1177/*玩家2坦克按键*/#define down 0x1f73#define left 0x1e61#define right 0x2064#define fire 0x246a/*定义游戏常量*//*双人游戏*/#define NUM 2/*坦克宽度*/#define WIDTH 20/*坦克的数量,宽度*//*定义global变量*******************************************//*子弹的属性*/struct myboom{/*如果子弹life为0则代表子弹没有发射*/int life;int x,y;int direction;};/*子弹们的初始属性*/struct myboom iboom[NUM]={{0},{0}};/*坦克的属性*/struct mytank{int life;int x,y;int direction;};/*坦克们的初始属性*/struct mytank itank[NUM]={{3,10*WIDTH,22*WIDTH},{1,440,40}};pre[NUM][2]={{10*WIDTH,22*WIDTH},{440,40}};/*xy[0]代表自己的坦克; xy[1]及以后代表敌军; 坦克坐标*//*存被子弹覆盖的图像*/void *boom_save[NUM];/*malloc开辟图像空间的大小*/int size;/*动画显示*/void *save[NUM];/*后来加上的。

C语言坦克游戏

C语言坦克游戏
void moveup()
{ setcolor(BLACK);
outtextxy(a,d,"■");
outtextxy(b,e,"■■■");
outtextxy(c,f,"■ ■");//这三句用来消除行走后留下的痕迹
setcolor(RED);//设置自此句以后的字体为红色
setfont(16, 0, "黑体");//设置字体大小颜色 64为设置字体大小
//打下小酱油
#include<stdio.h>
#include <conio.h>
#include <time.h>
#include <graphics.h>
void tank();
void tank2();
void shoot();
void jiemian();
void moveup();
outtextxy(a,m,"■");
}
}
void shoot2()//down
{setcolor(RED);//设置自此句以后的字体为红色
setfont(16, 0, "黑体");//设置字体大小颜色 16为设置字体大小
for(m=f;m<480;m++)
}}
void jiemian()
{int c=255;
while(!kbhit())//感应是否有键盘输入
{
setcolor(YELLOW);//设置自此句以后的字体为黄色
setfont(64, 0, "黑体");//设置字体大小颜色 64为设置字体大小

c语言简单的坦克对战代码

c语言简单的坦克对战代码

c语言简单的坦克对战代码C语言简单的坦克对战代码介绍坦克对战游戏是一个经典的游戏,它可以锻炼玩家的反应能力和策略思维。

本文将介绍如何使用C语言编写一个简单的坦克对战游戏。

准备工作在开始编写代码之前,我们需要安装一些必要的工具。

首先,我们需要下载并安装一个C语言编译器。

常见的C语言编译器有GCC、Clang等。

其次,我们需要选择一个集成开发环境(IDE),例如Code::Blocks、Visual Studio等。

游戏规则在本文中,我们将实现一个基本的坦克对战游戏。

游戏规则如下:1. 游戏场景为一个20*20的方格。

2. 游戏中有两辆坦克,分别由玩家和电脑控制。

3. 玩家可以通过键盘控制自己的坦克移动和发射子弹。

4. 电脑会随机移动并发射子弹。

5. 当一辆坦克被击中时,游戏结束。

代码实现下面是实现上述规则所需的代码:头文件和宏定义```#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <windows.h>#define WIDTH 20#define HEIGHT 20```其中,`WIDTH`和`HEIGHT`表示游戏场景的宽度和高度。

游戏场景的绘制void drawScene(char scene[WIDTH][HEIGHT]){int i, j;system("cls");for (i = 0; i < HEIGHT; i++) {for (j = 0; j < WIDTH; j++) {printf("%c", scene[i][j]);}printf("\n");}}```该函数用于绘制游戏场景。

参数`scene`是一个二维字符数组,用于表示游戏场景中每个位置的状态。

函数首先清空屏幕,然后遍历二维数组并输出对应的字符。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3,24,9,1,6,10,1,7,10,2,8,10, 2,9,10,1,10,10,1,11,10,3,16,10, 3,17,10,3,20,10,3,21,10,3,22, 10,3,23,10,3,24,10,3,3,11,3,4,11, 3,5,11,3,6,11,3,7,11,2,8,11, 2,9,11,3,10,11,3,11,11,3,12,11, 3,13,11,3,14,11,3,15,11,3,16, 11,3,17,11,3,3,12,3,4,12,3,5,12, 3,6,12,3,7,12,2,8,12,2,9,12,3, 10,12,3,11,12,3,12,12,3,13,12, 3,14,12,3,15,12,3,16,12,3,17, 12,3,3,13,1,8,13,1,9,13,1,14,13, 1,15,13,1,21,13,1,22,13,3,25,13, 3,26,13,1,1,14,1,2,14,1,8,14, 1,9,14,1,14,14,1,15,14,1,21, 14,1,22,14,3,25,14,3,26,14,3,1,15, 3,2,15,3,3,15,3,4,15,3,6,15,3,7, 15,3,8,15,3,9,15,3,10,15, 3,11,15,1,14,15,1,15,15,2,19,15, 2,20,15,1,21,15,1,22,15,3,25,15, 3,26,15,3,1,16,3,2,16,3,3,16,3, 4,16,3,6,16,3,7,16,3,8,16,
0x21,0x08,0x02,0x00,0x7F,0xF8,0x02,0x08, 0x04,0x08,0x08,0x08,0x10,0x28,0x20,0x10, };
/*****地**********图*********一************号***********/ /*坐标含义:地图块类型,横坐标,纵坐标 地图一 地图块类型:3 海水,2 草地,1 栅栏 .该地图使用 vb 得到的*/ int map1[]={2,7,1,3,8,1,3,9,1,3, 19,1,3,20,1,2,7,2,3,8,2,3,9,2, 3,19,2,3,20,2,3,1,3,3,2,3,3,3, 3,3,4,3,2,7,3,3,8,3, 3,9,3,3,12,3,3,13,3,3,14,3,3, 15,3,3,16,3,3,17,3,3,18,3,
3,9,16,3,10,16,3,11,16,1,14,16, 1,15,16,2,19,16,2,20,16,3,21,16, 3,22,16,2,23,16,2,24,16,3,25,16, 3,26,16,1,4,17,1,5,17,1,6,17, 2,8,17,2,9,17,2,10,17,2,11,17,2, 12,17,2,13,17,1,14,17,1,15,17, 2,16,17,2,17,17,1,18,17,3,19,17, 3,20,17,3,21,17,3,22,17,2,23,17, 2,24,17,3,25,17,3,26,17,1,4,18, 1,5,18,1,6,18,2,8,18,2,9,18, 2,10,18,2,11,18,2,12,18,2,13,18, 1,18,18,3,19,18,3,20,18,3,21,18, 3,22,18,3,3,19,3,4,19,3,5,19,3,6, 19,3,7,19
/*一些图形,“杀”代表 player2,“我是李勇”代表 player1*/
char sha[]={ /* 以下是 &#39;杀&#39; 的 16 点阵宋体 字模,32 byte */ 0x00,0x20,0x18,0x20,0x06,0x40,0x01,0x80, 0x02,0x60,0x0C,0x30,0x31,0x10,0x01,0x00, 0x7F,0xFE,0x01,0x00,0x09,0x20,0x09,0x10, 0x11,0x08,0x21,0x08,0x05,0x00,0x02,0x00, }; char wo[]={ /* 以下是 &#39;我&#39; 的 16 点阵宋体 字模,32 byte */ 0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48, 0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48, 0x0E,0x28,0x38,0x30,0
/*定义 global 变量*******************************************/
/*子弹的属性*/ struct myboom{
/*如果子弹 life 为 0 则代表子弹没有发射*/ int life; int x,y; int direction; }; /*子弹们的初始属性*/ struct myboom iboom[NUM]= {{0},{0}};
#include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;stdlib.h&gt; #include&lt;graphics.h&gt; /*定义鼠标键值常量*/ #define ESC 0x011b/*玩家 1 坦克按键*/ #define UP 0x4800 #define DOWN 0x5000 #define LEFT 0x4b00 #define RIGHT 0x4d00 #define ENTER 0x1c0d #define up 0x1177/*玩家 2 坦克按键*/
c 语言坦克大战源代码
/*游戏的整体思路大概是这样的? 首先是欢迎界面,然后进入游戏界面,最后是 gameover 的界面。 本来打算做单人游戏,后来发现让敌人自主移动比较困难,所以改成了双人游戏?
layer1 控制按键是 up,down,left,right,enter,player2 控制按键是 a,s,d,w,space。 */
xC8,0x20,0x08,0x50, 0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02, }; char shi[]={ /* 以下是 &#39;是&#39; 的 16 点阵宋体 字模,32 byte */ 0x00,0x00,0x0F,0xF0,0x08,0x10,0x0F,0xF0, 0x08,0x10,0x0F,0xF0,0x00,0x00,0xFF,0xFE, 0x01,0x00,0x09,0x00,0x09,0xF8,0x09,0x00, 0x15,0x00,0x23,0x00,0x40,0xFE,0x00,0x00, }; char li[]={ /* 以下是 &#39;李&#39; 的 16 点阵宋体 字模,32 byte */ 0x01,0x00,0x01,0x00,0x7F,0xFC,0x03,0x80, 0x05,0x40,0x09,0x30,0x31,0x0E,0xDF,0xE4, 0x00,0x80,0x01,0x00,0x7F,0xFE,0x01,0x00, 0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00, }; char yong[]={ /* 以下是 &#39;勇&#39; 的 16 点阵宋体 字模,32 byte */ 0x3F,0xF0,0x02,0x60,0x01,0x80,0x3F,0xF8, 0x21,0x08,0x3F,0xF8,0x21,0x08,0x3F,0xF8,
#define down 0x1f73 #define left 0x1e61 #define right 0x2064 #define fire 0x246a
/*定义游戏常量*/ /*双人游戏*/ #define NUM 2 /*坦克宽度*/ #define WIDTH 20 /*坦克的数量,宽度*/
/*坦克的属性*/ struct mytank{ int life; int x,y; int direction; };
/*坦克们的初始属性*/ struct mytank itank[NUM]= {{3,10*WIDTH,22*WIDTH},{1,440,40}}; pre[NUM][2]={ {10*WIDTH,22*WIDTH},{440,40}};
/*xy[0]代表自己的坦克; xy[1]及以后代表敌军; 坦克坐标*/ /*存被子弹覆盖的图像*/ void *boom_save[NUM]; /*malloc 开辟图像空间的大小*/ int size; /*动画显示*/ void *save[NUM]; /*后来加上的。。用来让坦克一点一点的动*/ void *isave[NUM+1]; /*储存敌人移动方向*/ int direction=RIGHT; /*接受键盘输入*/ int input[NUM]={DOWN}; ;/*存子弹的图像*/ void *boomimg; void *iboomimg[NUM];/**/ void loading();
/*声明函数************************************/ void draw(int what); void move(int direction); int canmove(int direction,int which); void byebye(int mode); void init(); int welcome(); void write(char *mat,int matsize,int x,int y,int color); void tank(int x,int y,int which,int direction); void wall(int mode,int x,int y); int choose(); void boom(int direction,int prex,int prey,int width); int howmove(); void imove(int direction,int which,int can); void iboommove(int which); void shoot(int which,int direction); void getInitImg(); void drawboom(); void snake(); void isGameOver();
相关文档
最新文档