坦克大战游戏步骤 思路 与代码(一)

坦克大战步骤

1.首先创建一个父类,设置好高度、宽度、左、中间的属性 创建一个构造方法、将这些参数传递,将这些值赋予到父类中
并且在父类中构建一个重画的虚拟类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace WindowsFormsApplication1
{
public abstract class GameObject //在父类中定义抽象类,在父类中规定,在子类中实现
{

public int Width { get; set; }
public int Heigth { get; set; }
public int Left { get; set; }
public int Top { get; set; }
public GameObject(int width,int height,int left,int top)

{

this.Width = width;
this.Heigth = height;
this.Left = left;
this.Top = top;

}

public abstract void Draw(Graphics g);//从窗体中传一个对象才能开始画

}
}


2.然后再建立一个会动的类 并且创建速度和方向 从父类继承高宽等属性,并且定义自己的属性。再定义一个方向的方法
public abstract class ActivityGameObject:GameObject //活动类也是抽象的,并不知道如何绘图
{

public int Spend { get; set; }//速度
public Dirction Dir { get; set; }//方向
public ActivityGameObject (int width,int height,int left,int top,int spend,Dirction Dir):base(width,height,left,top)
{

this.Spend = spend; //通过父类的引用将这些数据传给子类,子类再定义自己的属性
this.Dir = Dir;

}
public virtual void Move()
{

switch (this.Dir)
{


case Dirction.Up: this.Top -= Spend; break; //判断方向
case Dirction.Down: this.Top += Spend; break;
case Dirction.Left: this.Left -= Spend; break;
case Dirction.Rigth: this.Left += Spend; break;


}


}
}

public enum Dirction
{

Up,
Left,
Down,
Rigth


}
}

3.再创建一个坦克类 继承活动类 定义生命 和四个方向的图片 将父类继承的东西全部继承 在坦克类重写方向
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace WindowsFormsApplication1
{
public class Tank:ActivityGameObject //坦克类继承活动的类
{

public int Life { get; set; } //生命
private Image[] images; //坦克的四个方向的图片
public Tank(Image[] images, int left, int top, int spend, int life, Dirction dir)
: base(images[0].Width, images[0].Height, left, top, spend, dir)
{
//构造坦克的图片数据,并在父类中继承

this.Left = left;
this.images = images;



}
public override void Draw(Graphics g)
{


switch (this.Dir)
{


case Dirction.Up: g.DrawImage(images[0], this.Left, this.Top); break; //位置是第一0个,则是当前的位置
case Dirction.Down: g.DrawImage(images[1], this.Left, this.Top); break;
case Dirction.Left: g.DrawImage(images[2], this.Left, this.Top); break;
case Dirction.Rigth: g.DrawImage(images[3], this.Left, this.Top); break;

}

}

}
}
4.创建一个玩家坦克继承坦克类
创建对象之前静态初始化坦克的图片,并且将值传给坦克类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
using WindowsFormsApplication1.Properties;

namespace WindowsFormsApplication1
{

public class playerTank : Tank //玩家坦克
{

private static Image[] images = new Image[] //创建对象之前的静态初始化

{

Resources.p1tankU,
Resources.p1tankD,
Resources.p1tankL, //玩家坦克向父类传递一组图片
Resources.p1tankR






};
public playerTank(int left, int top, int spend, int life, Dirction dir)
: base(images, left, top, spend, life, dir) //传递
{

 

}
}
}

5.创建一个所有对象管理员的类
首先创建一个单例让管理员成为唯一,创建一个玩家属性,添加游戏对象并且验证将它转成玩家,方向的也传递的同事,并且调用玩家坦克的方向方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;

namespace WindowsFormsApplication1
{
public class GameObjectManager
{
private GameObjectManager() { }
private static GameObjectManager gom=null;
public static GameObjectManager GetInstance()
{

if (gom == null)
{

gom = new GameObjectManager();
}
return gom;

}
private playerTank pltank;

public playerTank Pltank
{
get { return pltank; }
set { pltank = value; }
}
//添加游戏对象
public void Add(GameObject go) //如果扔给一个玩家坦克,转成玩家坦克,并且赋予管理者
{

if (go is playerTank)
{
Pltank= go as playerTank;

}

 

}
public void Draw(Graphics g)

{

pltank.Draw(g);

}

5.窗体在构建的时候将坦克的图片构造方法传递

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.InitGame();
}

public void InitGame()
{

playerTank pltank = new playerTank(200,200,10,10,Dirction.Up); //将参数传递
GameObjectManager.GetInstance().Add(pltank);


}

private void Form1_Paint(object sender, PaintEventArgs e)
{

GameObjectManager.GetInstance().Draw(e.Graphics);
}

private void timer1_Tick(object sender, EventArgs e)
{

this.Invalidate();
}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
playerTank tank= GameObjectManager.GetInstance().Pltank;
switch (e.KeyCode)
{

case Keys.W: tank.Dir = Dirction.Up; tank.Move(); break;
case Keys.S: tank.Dir = Dirction.Down; tank.Move(); break;
case Keys.A: tank.Dir = Dirction.Left; tank.Move(); break;
case Keys.D: tank.Dir = Dirction.Rigth; tank.Move(); break;

}
}

}
}

转载于:https://www.cnblogs.com/liyiyong/p/5124947.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
游戏分里外两个部分组成,里部分(用户不可见) 通过里部分执行判断,地图数组更改,和各种值的改变。更改完里部分再根据相应变化更改表部分。(用户可视部分)表部分的打印通过gotoxy去到相应坐标再printf打印出字符,通过文本函数改变文字字体颜色与文字背景颜色与字符组合实现图形界面。 程序通过 计数器+循环判断 的思想,类似单核cpu的多线程实现(单线程在不同程序/函数间来回执行)省去了多线程。(具体过程在功能设计与描述有详细描述) 另AI实现与加强依赖于rand随机函数的运用,进一步强化AI,增加游戏乐趣 功能方面,游戏参考于80年代任天堂红白机(FC/FamilyComputer)上的游戏坦克大战(Battle City),包括地图,游戏模式等等(当时的游戏直接烧在电路板上)。所以游戏平衡方面已经有了很好的参考,无需再花大量时间测试平衡性。 但诸如地图中的树林元素,随机道具等没有实现。但较之原版,该游戏由C/C++编写PC运行,由字符界面实现游戏画面。原版一辆坦克的子弹未消失之前不能发射第二颗。导致子弹打击远处CD长,近处CD短。该游戏每个子弹都有相同CD,子弹未消失只要CD达到即可发射第二颗,第三颗…增加了真实性,相较于原版是个改进。且考虑到PC性能不一内置了游戏速度调整。玩家可根据PC性能调整至合适的速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值