0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么使用C#做游戏?

汽车电子技术 来源:工控笔记 作者:sanzk 2023-02-07 11:01 次阅读

图片

飞行棋小游戏主要练习了方法的使用,还有重载、数组、全局变量、生成随机数、打印等的例子。
  • 生成的飞行棋小游戏下载地址
链接: https://pan.baidu.com/s/1b0n6UNKyIIWaXLJpoMs1-g?pwd=nq2c 提取码: nq2c 复制这段内容后打开百度网盘手机App,操作更方便哦
  • 学习视频地址
【【C#22天搞定C#丨全套学习课程丨基础视频教程https://www.bilibili.com/video/BV1jX4y1u7MG/?p=89&share_source=copy_web&vd_source=842382bf376aef11984b2f313902fc33
  • 完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


/*
1、画游戏头
2、初始化资源(将数组中数字转换成控制台显示的字符的过程)
3、画地图
4、玩游戏
  游戏规则:
  如果玩家A踩到了玩家B,则玩家B退6格
  踩到了地雷 退6格
  踩到了时空隧道 进10格
  踩到了幸运轮盘 1交换位置 2轰炸对方 使得对方退6格
  踩到了暂停 暂停一回合
  踩到了方块 神马都不干
*/


namespace _05飞行棋
{
    class Program
    {
        //在类中声明静态字段
        //用静态字段模拟全局变量,给多个方法使用。


        //public static    //public 可省略
        static int[] Maps = new int[100];


        //创建1个数组,含有100个int类型的整数
        //数组的下标从0~99
        /* 数组:一次性存储多个相同类型的变量
        数组类型[] 数组名=new 数组类型[数组长度]*/


        static string[] PlayerName = new string[2];//声明一个字符类型数组,存储两个玩家的姓名


        //声明一个全局的静态数组用来存储玩家的A\\B坐标
        static int[] PlayerPos = new int[2];


        //给踩到暂停时用的,声明BOOL量数组,作为两个玩家的标记
        static bool[] Flags = new bool[2];//Flag[0]默认false,/Flag[1]默认false


        static void Main(string[] args)//主程序、玩游戏
{
            GameShow(); //调用方法:画游戏头


            #region 输入玩家姓名
            Console.WriteLine("请输入玩家A的姓名");
            PlayerName[0] = Console.ReadLine();
            while (PlayerName[0] == "")
            {
                Console.WriteLine("玩家A姓名不能为空,请重新输入");
                PlayerName[0] = Console.ReadLine();
            }
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("请输入玩家B的姓名");
            PlayerName[1] = Console.ReadLine();
            while (PlayerName[1] == "" || PlayerName[1] == PlayerName[0])// ||或   &&且
            {
                if (PlayerName[1] == "")
                {
                    Console.WriteLine("玩家B的姓名不能为空,请重新输入");
                    PlayerName[1] = Console.ReadLine();
                }
                else
                {
                    Console.WriteLine("玩家B的姓名不与A相同,请重新输入");
                    PlayerName[1] = Console.ReadLine();
                }
            }
            #endregion

            //玩家姓名输入完成后,首先应该清屏
            Console.Clear();//清屏


            GameShow();
            Console.WriteLine("{0}的士兵用A表示", PlayerName[0]);
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("{0}的士兵用B表示", PlayerName[1]);
           // PlayerPos[0] = 90;//测试用
            //在画地图之前,先初始化地图
            InitailMap();//调用方法:初始化地图
            DrawMap();//调用方法:画地图


            //档玩家A跟B没有一个人在终点的时候,两个玩家不停的玩游戏。
   while (PlayerPos[0] < 99 && PlayerPos[1] < 99)//玩游戏
            {
                if (Flags[0] == false)
                {

                    PlayGame(0);
                }
                else
                {
                    Flags[0] = false;
                }
                if (PlayerPos[0] >= 99)
                {
                    while (true)
                    {
                        Console.WriteLine("{0}获得了胜利", PlayerName[0]);
                        Console.ReadKey(true);
                    }
                    break;
                }


                if (Flags[1] == false)
                {
                    PlayGame(1);
                }
                else
                {
                    Flags[1] = false;
                }
                if (PlayerPos[1] >= 99)
                {
                    while (true)
                    {
                        Console.WriteLine("{0}获得了胜利", PlayerName[1]);
                        Console.ReadKey(true);
                    }
                    break;
                }
            }//while



            Console.ReadKey();
        }//main


        //public static void win()
        //{
        //    Console.ForegroundColor = ConsoleColor.Red;
        //    while (true) {
        //    Console.WriteLine("胜利");
        //    }


        //}






        public static void GameShow()//方法:画游戏头
{
            Console.ForegroundColor = ConsoleColor.Yellow;//ForegroundColor是设置字体颜色
            Console.WriteLine("**************************");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine("**************************");
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("**************************");
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("***C#练习之飞行棋小游戏***");
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("**************************");
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("**************************");
        }


        public static void InitailMap()//方法:初始化地图
{
            //用0表示普通,显示□
            /*
            ---1---幸运轮盘◎
            ---2---地雷☆
            ---3---暂停▲
            ---4---时空隧道卐

            */


            int[] luckyturn = { 6, 23, 40, 55, 69, 83 };//幸运轮盘◎
                                                        //有100个位置,其中位置6、23、40...等 是幸运轮盘.
                                                        // luckyturn数组存的是Maps数组的下标,便于给Maps数组赋值




            for (int i=0;iint index = luckyturn[i];
                Maps[index]=1;


                /* 可以简写成 Maps[luckyturn[i]]=1;

            等同于Maps[6]=1;
            Maps[23]=1;
            Maps[40]=1;
            ......

            用for循环+值为数组2下标的一个数组1为数组2赋值的好处就是
            这样给数组2赋值更方便快捷
                */


            }
            /////////////
            int[] landMine = { 5, 13, 17, 33, 38, 50,64,80,94 };//地雷☆
            for (int i = 0; i < landMine.Length; i++)
            {
                Maps[landMine[i]] = 2;
            }
            //////////////
            int[] pause = { 9,27,60,93 };//暂停▲
            for (int i = 0; i < pause.Length; i++)
            {
                Maps[pause[i]] = 3;
            }
            ////////////////
            int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//时空隧道卐
            for (int i = 0; i < timeTunnel.Length; i++)
            {
                Maps[timeTunnel[i]] = 4;
            }
        }


        public static void DrawMap()//方法:画地图
{
            Console.ForegroundColor = ConsoleColor.Green;
            Console.WriteLine("图例:幸运轮盘◎ 地雷☆  暂停▲   时空隧道卐");


            /*
           ---1---幸运轮盘◎
           ---2---地雷☆
           ---3---暂停▲
           ---4---时空隧道卐
           */
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("如果玩家A踩到了玩家B,则玩家B退6格");
            Console.WriteLine("踩到了地雷 退6格");
            Console.WriteLine("踩到了时空隧道 进10格");
            Console.WriteLine("踩到了幸运轮盘 1交换位置 2轰炸对方 使得对方退6格");
            Console.WriteLine("踩到了暂停 暂停一回合");
            Console.WriteLine("踩到了方块 神马都不干");
            /*游戏规则:
            如果玩家A踩到了玩家B,则玩家B退6格
            踩到了地雷 退6格
            踩到了时空隧道 进10格
            踩到了幸运轮盘 1交换位置 2轰炸对方 使得对方退6格
            踩到了暂停 暂停一回合
            踩到了方块 神马都不干*/
            #region 画第一横行


            for (int i = 0; i < 30; i++)
            {


                Console.Write(DrawstringMap(i));


            }
        #endregion
            //画完第一横行后,应该换行
            Console.WriteLine();
        #region 画第一竖行
            //竖行前面+空格
            for (int i = 30; i < 35; i++)
            {
                for(int j = 0; j <= 28; j++)
                {
                    Console.Write("  ");
                }

                Console.Write(DrawstringMap(i));
                Console.WriteLine();
            }
            #endregion


        #region 画第二横行
            for (int i = 64; i >= 35; i--)
            {
                Console.Write(DrawstringMap(i));
            }
            #endregion
            Console.WriteLine();//换行
        #region 画第二竖行


            for (int i = 65; i <= 69; i++)
            {
                Console.WriteLine(DrawstringMap(i));//第二竖行紧贴左边可以直接换行
            }
            #endregion




        #region 画第三横行


            for (int i = 70; i <= 99; i++)
            {
                Console.Write(DrawstringMap(i));
            }
            #endregion


            //画完最后一行,应该换行
            Console.WriteLine();
        }//DrawMap方法的结尾
        public static string DrawstringMap(int i)//将画图的方法抽象出来,传入参数i,传出字符打印。
{
            string str = "";
            #region 画图
            //如果玩家AB坐标相同,并且都在地图上则画一个尖括号
            if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] == i)
            {
                str = "<>";
            }
            else if (PlayerPos[0] == i)
            {
                //shift+空格,切换全角,控制台输出时两个半角占一个全角的位置
                str = "A";
            }
            else if (PlayerPos[1] == i)
            {
                str = "B";//显示玩家B
            }
            else
            {//做多条件的定值判断。
                switch (Maps[i])
                {


                    /*
                    ---0---普通□
                    ---1---幸运轮盘◎
                    ---2---地雷☆
                    ---3---暂停▲
                    ---4---时空隧道卐


                    */
                    case 0:
                        Console.ForegroundColor = ConsoleColor.White;
                        str = "□";
                        break;
                    case 1:
                        Console.ForegroundColor = ConsoleColor.Blue;
                        str = "◎";
                        break;
                    case 2:
                        Console.ForegroundColor = ConsoleColor.Cyan;
                        str = "☆";
                        break;
                    case 3:
                        Console.ForegroundColor = ConsoleColor.Green;
                        str = "▲";
                        break;
                    case 4:
                        Console.ForegroundColor = ConsoleColor.Red;
                        str = "卐";
                        break;
                }//switch
            }//else
            return str;
            #endregion


        }


        public static  void PlayGame(int PlayNumber)//int PlayNumber传一个参数进来,0代表A在玩,1代表B在玩
{
            Random r = new Random();//生成随机数
            int rNumber = r.Next(1, 7);//1~7产生1-6的随机数


            Console.WriteLine("{0}按任意键开始掷骰子", PlayerName[PlayNumber]);
            Console.ReadKey(true);//这里有个重载的例子,()输入true则按下的任意键内容不显示
            Console.WriteLine("{0}骰出了{1}", PlayerName[PlayNumber],rNumber);
            PlayerPos[PlayNumber] += rNumber;
            ChangePos();//调用方法,让玩家位置始终在地图上
            Console.ReadKey(true);
            Console.WriteLine("{0}按任意键开始行动", PlayerName[PlayNumber]);
            Console.ReadKey(true);
            Console.WriteLine("{0}行动完了", PlayerName[PlayNumber]);
            Console.ReadKey(true);


            //玩家A可能踩到了玩家B,方块 幸运轮盘 地雷 暂停 时空隧道
            if (PlayerPos[PlayNumber] == PlayerPos[1- PlayNumber])//1-1=0,传0就是 0,1;传1就是1,0.很巧妙
            {
                Console.WriteLine("玩家{0}踩到了玩家{1},玩家{2}退6格", PlayerName[PlayNumber], PlayerName[1- PlayNumber], PlayerName[1-PlayNumber]);
                PlayerPos[1- PlayNumber] -= 6;
                ChangePos();
            }
            else//踩到了关卡
            {
                //玩家的坐标
                switch (Maps[PlayerPos[PlayNumber]])//0 1 2 3 4   做多条件判断
                {
                    case 0:
                        Console.WriteLine("玩家{0}踩到了方块,安全", PlayerName[PlayNumber]);
                        Console.ReadKey(true);
                        break;
                    case 1:
                        Console.WriteLine("玩家{0}踩到了幸运轮盘,请选择 1--交换位置 2--轰炸对方", PlayerName[PlayNumber]);
                        string input = Console.ReadLine();
                        while (true)
                        {
                            if (input == "1")
                            {
                                Console.WriteLine("玩家{0}选择跟玩家{1}交换位置", PlayerName[PlayNumber], PlayerName[1- PlayNumber]);
                                Console.ReadKey(true);
                                int temp = PlayerPos[PlayNumber];
                                PlayerPos[PlayNumber] = PlayerPos[1-PlayNumber];
                                PlayerPos[1 - PlayNumber] = temp;
                                Console.WriteLine("交换完成!go on!");
                                Console.ReadKey(true);
                                break;//输入完1或2后跳出while循环
                            }
                            else if (input == "2")
                            {
                                Console.WriteLine("玩家{0}选择轰炸玩家{1},玩家{2}退6格", PlayerName[PlayNumber], PlayerName[1- PlayNumber], PlayerName[1- PlayNumber]);
                                Console.ReadKey(true);
                                PlayerPos[1- PlayNumber] -= 6;
                                ChangePos();
                                Console.WriteLine("玩家{0}退了6格", PlayerName[1- PlayNumber]);
                                Console.ReadKey(true);
                                break;//输入完1或2后跳出while循环
                            }
                            else
                            {
                                Console.WriteLine("只能输入1或2, 1--交换位置 2--轰炸对方");
                                input = Console.ReadLine();
                            }
                        }
                        break;
                    case 2:
                        Console.WriteLine("玩家{0}踩到了地雷,退6格", PlayerName[PlayNumber]);
                        Console.ReadKey(true);
                        PlayerPos[PlayNumber] -= 6;
                        ChangePos();
                        break;
                    case 3:
                        Console.WriteLine("玩家{0}踩到了暂停,暂停一回合", PlayerName[PlayNumber]);
                        Flags[PlayNumber] = true;
                        Console.ReadKey();
                        break;
                    case 4:
                        Console.WriteLine("玩家{0}踩到了时空隧道,前进10格", PlayerName[PlayNumber]);
                        PlayerPos[PlayNumber] += 10;
                        ChangePos();
                        Console.ReadKey();
                        break;
                }//switch
            }//else
            //ChangePos();//清屏前调用一次,就不需要前面写那么多了
            Console.Clear();
            DrawMap();
        }
        public static void ChangePos()
{
            if (PlayerPos[0]<0)
            {
                PlayerPos[0] = 0;
            }
            if (PlayerPos[0] >= 99)
            {
                PlayerPos[0] = 99;
            }


            if (PlayerPos[1] < 0)
            {
                PlayerPos[1] = 0;
            }
            if (PlayerPos[1] >= 99)
            {
                PlayerPos[1] = 99;
            }
        }//ChangePos方法


    }//class类
}//namespace
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 游戏
    +关注

    关注

    2

    文章

    696

    浏览量

    26040
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25595
  • 重载
    +关注

    关注

    0

    文章

    7

    浏览量

    2741
收藏 人收藏

    评论

    相关推荐

    C#(csharp)这门语言的优势在哪

    C#入门
    电路设计
    发布于 :2022年12月28日 13:19:49

    C#语言基础教程

    C#语言基础教程主要内容:C#语言概述C#语言程序设计基础面得对像的C#深入了解C#
    发表于 05-21 21:43

    C#控件详解

    很全的C#控件使用说明!
    发表于 07-18 10:27

    arm也学,c# 软件也 c#网站也玩

    arm也学,c# 软件也 c#网站也玩 是不是太杂了 感觉每一个都会点 但是都不敢说精!
    发表于 02-17 20:53

    C#的入手,请指导

    大家对于C#利用控件编写上位机的程序,就是为了做个数据采集然后绘制成曲线的界面,方便用户及时了解信息。我已经加载了NI的图形控件。但是由于第一次接触C#,所以对于怎么入手有些茫然,希望大家多多帮助!!!谢谢
    发表于 01-25 20:43

    《Visual C# 2008程序设计经典案例设计与实现》---Visual C# 2008与图形图像

    `《Visual C# 2008程序设计经典案例设计与实现》---Visual C# 2008与图形图像.zip[hide][/hide]`
    发表于 07-08 14:01

    Python与C#对比

    Python可以实现类型之间的快速切换,而C#却需要通过相应的类型转换才能实现;5. Python无法静态类型检查,而C#却会进行静态类型检查;6. Python没有访问修饰符,而C#
    发表于 05-14 17:14

    《Visual C# 2005开发技术》C#程序设计基础.pdf

    《Visual C# 2005开发技术》C#程序设计基础.pdf[hide][/hide]
    发表于 06-24 19:49

    《Visual C# 2005开发技术》C#与.NET Framework简介.pdf

    《Visual C# 2005开发技术》C#与.NET Framework简介.pdf[hide][/hide]
    发表于 06-24 19:50

    c#菜单类型转换失败System.InvalidCastException?

    我用c#的是检查用户权限设置菜单是否可用,但是转换菜单目录类型出错
    发表于 10-27 19:44

    c#/winform c#/wpf c++/QT上位机

    c#/winform c#/wpf c++/QT上位机,本人从事上位机开发5年,熟悉各大底层硬件交互,tcp/ip udp 串口通讯 CAN通讯 有意+ 2038 3478 72
    发表于 09-21 21:20

    C#结合SMTP实现邮件报警通知分享

    写在前面C#是微软推出的一门面向对象的通用型编程语言,它除了可以开发PC软件、网站(借助http://ASP.NET)和APP(基于 Windows Phone),还能作为游戏脚本,编写游戏逻辑
    发表于 07-02 06:57

    对对碰 vs2005 c#源码

    附件为:对对碰 vs2005 c#源码 对对碰C#源码,游戏名称:C#版对对碰,编程工具:vs2005(C#
    发表于 10-17 09:55 29次下载
    对对碰 vs2005 <b class='flag-5'>c#</b>源码

    c#五子棋游戏设计实验报告

    基于c#语言设计的一款游戏,内容有源码及其介绍、功能实现等。
    发表于 11-25 14:27 18次下载

    基于c#游戏设计_俄罗斯方块论文终结版

    基于c#游戏设计——俄罗斯方块,内容包括源代码的详细介绍,源代码,功能以及怎么实现等。
    发表于 11-25 14:34 0次下载