相对路径和绝对路径(C#飞机打字游戏)

本文详细介绍了一款飞机打字游戏的开发过程,包括界面UI设计、战机控制、游戏逻辑控制等关键环节。通过C#语言和Windows Forms框架,实现了背景图片加载、随机字母生成、字体下落及碰撞检测等功能,提供了丰富的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、@是转义字符
2、路径问题:(BackgroundImage要注意相对路径和绝对路径)
《1.》绝对路径
不用考虑其位置所在文件夹,只需要根据这个路径就能够直接找到目标
《2.》相对路径
以当前运行的文件为起始点,根据相对的路径去寻找目标,跳出使用“…/”,进入使用“文件夹名/”

eg:飞机打字游戏
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 飞机大战
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //飞机大战项目整体划分
        /*1、界面UI(背景图、战机信息、游戏信息)
         * 2、战机控制
         * 3、战机生成器
         * 4、游戏逻辑控制
         * 5、首先打字游戏
         * (1)设置背景
         * (2)字母生成
         * <1>每秒生成1.5个
         */
        Panel YX = new Panel();//控件盒子的集合,游戏主页面
                           
    //随机字母,可以用数字转换成字母形式
    Random sj = new Random();

    //pictureBox装图片的盒子(装F飞机图片的盒子)
    PictureBox tupianplsyer = new PictureBox();
    private void Form1_Load(object sender, EventArgs e)
    {
        this.Size = new Size(1920, 1000);
        this.BackColor = Color.Green;
        //this.FormBorderStyle = FormBorderStyle.None;//去掉框架
        //this.BackgroundImage = Image.FromFile(@"../../img/bg.jpg");
        //FromFile()从指定的文件创建
        //@转义字符
        //路径问题:(BackgroundImage要注意相对路径和绝对路径)
        //1.绝对路径
        //不用考虑其位置所在文件夹,只需要根据这个路径就能够直接找到目标
        //2.相对路径
        //以当前运行的文件为起始点,根据相对的路径去寻找目标,跳出使用“../”,进入使用“文件夹名/”

        //把页面放在最中间
        this.Left = Screen.PrimaryScreen.Bounds.Width / 2 - this.Width / 2;
        this.Top = Screen.PrimaryScreen.Bounds.Height / 2 - this.Height / 2;

        //创建游戏区
        //Panel YX = new Panel();
        YX.Width = 1200;
        YX.Height = 600;
        //YX.BackgroundImage = Image.FromFile(@"../../img/bg.jpg");
        YX.BackColor = Color.White;
        YX.BackgroundImageLayout = ImageLayout.Stretch;//沿工作区拉伸
        this.Controls.Add(YX);//表示获取包含在this当前所指的控件里,将add里的控件全部添加到this中的所有控件
        //图片放进去后,让图片放在框架中间
        YX.Location = new Point(40, 30);//表示图片显示的位置

        //字母生成器(zimuTime名字),给这个字母生成器添加一个计时器事件
        Timer zimuTime = new Timer();
        zimuTime.Interval = 700;//调用的事件时间
        zimuTime.Tick += ZimuTime_Tick;
        zimuTime.Start();


        //字体下落的计时器
        Timer flyziti = new Timer();
        flyziti.Interval = 10;
        flyziti.Tick += Flyziti_Tick;
        flyziti.Start();

        //飞机图片
        //飞机图片大小
        tupianplsyer.Size= new Size(100, 100);
        //飞机位置
        tupianplsyer.Top = YX.Height - tupianplsyer.Height;//飞机图片的位置
        tupianplsyer.Left = YX.Width / 2 - tupianplsyer.Width / 2;
        tupianplsyer.Image = Image.FromFile(@"../../img/RP03.png");
        tupianplsyer.SizeMode = PictureBoxSizeMode.StretchImage;//自适应图片大小
        tupianplsyer.Tag = "feiji";
        YX.Controls.Add(tupianplsyer);


        //添加键盘事件
        //Keydown和KeyPress区别
        //Keydown一直按着会一直触发
        //KeyPress点击一下出现一下
        this.KeyPress += Form1_KeyPress;
    }

   



   


    //用计时器每700调用一次文字
    private void ZimuTime_Tick(object sender, EventArgs e)
    {
        //生成字母,使用生成label字母
        Label lazm = new Label();
        lazm.Tag = "zm";
        lazm.Text = ((char)sj.Next(97, 123)).ToString();//先强转为字符(字母),然后转成字符串,因为左右数据类型要一致,右面服从左面
        lazm.Font = new Font("", sj.Next(20,39), FontStyle.Bold);
        lazm.ForeColor = Color.FromArgb(sj.Next(226), sj.Next(226), sj.Next(226));
        lazm.Top = 0;
        lazm.Left = sj.Next(0, YX.Width - lazm.Width);//表示随机的位置,所以要把游戏主页面提到全局变量
        lazm.AutoSize = true;///字体大小自适应
        //有背景图片时,可以添加一个tarnsparent表示字体背景颜色透明/字体颜色透明色
        lazm.BackColor = Color.Transparent;

        YX.Controls.Add(lazm);//把所以显示字体添加/装在YX中,然后就显示

    }
    
    //字体下落
    private void Flyziti_Tick(object sender, EventArgs e)
    {
        foreach (Control item in YX.Controls)
        {
            //飞机不下落的二种方法


            /* //法一:
             //用GetType获取当前实例类型,获取item这个里面,名字为Lable
             //GetType每个属性都有
             if (item.GetType().Name== "Label")//获取当前进入的类型
             {
                 item.Top += 3;
             }*/


            //法二:
            if (item.Tag.ToString()=="zm"||item.Tag.ToString()== "zmbiaoji")
            {
                //item里面的属性都因该有tag来判断,如果有一个没赋tag,会显示空指针错了,表示未将对象引用设置到对象的实例,eg:两个事物比较,先要他们比较类型一样,否则还没比较就报错,一个人和猴子比尾巴,还么开始比就错误了(不能保证每一个元素有Tag,才不会报错,先保证循环元素存在)

                item.Top += 3;
                if (item.Top>=YX.Height)//大于边界后就释放
                {
                    item.Dispose();
                    //Dispose释放多余
                }
            }

            //item.Top += 3;

            //item的tag是zd则,这个item为子弹
            if (item.Tag.ToString()=="zd")
            {
                item.Top -= 3;
                if (item.Top<-item.Height)
                {
                    item.Dispose();//大于边界后就释放
                }
                foreach (Control yigezd in YX.Controls)//循环便利每一个子弹,比较距离清除子弹和字母
                {
                    if (yigezd.Tag.ToString()== "zmbiaoji")
                    {
                        if (item.Top<=yigezd.Top+yigezd.Height&&item.Left+item.Width/2==yigezd.Left+yigezd.Width/2)//表示字母和子弹在同一位置
                        {
                            item.Dispose();
                            yigezd.Dispose();
                        }
                    }
                }
                
            }
        }
    }

    //按下对应的字母
    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        //sender事件发起者
        //e参数,代表指定的键/代表事件对象/代表第三方/事件触发对象(谁触发代表谁)
        // e.KeyChar//设置或获取与按下键对应的字符

        //因为是多个键,所以循环便利
        foreach (Control item in YX.Controls)
        {
            if (item.Text==e.KeyChar.ToString()&&item.Tag.ToString()=="zm")//item.Tag.ToString()=="zm"字母时对应产生一个子弹,不会同时产生多个
            {
                item.Tag = "zmbiaoji";//该标记,就不会产生多余子弹
                tupianplsyer.Left = item.Left + item.Width / 2 - tupianplsyer.Width / 2;
                //同样的中轴线,字母的距离left的距离加上,字母宽的一半,减上飞机图片的一半就是,飞机left的距离

                //创建子弹
                PictureBox zidan = new PictureBox();
                zidan.Tag = "zd";
                zidan.Size = new Size(8, 18);
                zidan.SizeMode = PictureBoxSizeMode.StretchImage;
                zidan.Image = Image.FromFile(@"../../img/Ammo1.png");
                zidan.Left = tupianplsyer.Left + tupianplsyer.Width / 2 - zidan.Width / 2;

                zidan.Top = tupianplsyer.Top -zidan.Height;
                YX.Controls.Add(zidan);
                //跳出当前事件
                return;//跳出整个事件,如果给return下面写则全部跳出//判断只出现一个

            }
        } 

    }
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值