首页 > 其他分享 >简单小游戏制作

简单小游戏制作

时间:2024-06-04 11:30:24浏览次数:22  
标签:case Console Write 小游戏 简单 playerX playerY 制作 SetCursorPosition

控制台基础设置

//隐藏光标
Console.CursorVisible = false;
//通过两个变量来存储舞台的大小
int w = 50;
int h = 30;
//设置舞台(控制台)的大小
Console.SetWindowSize(w, h);
Console.SetBufferSize(w, h);

多个场景

int nowSceneID = 1;
while (true)
{
	//不同的场景ID,进行不同的逻辑处理
	switch (nowSceneID)
	{
		//开始场景
		case 1:
			Console.Clear();
			Console.WriteLine("开始场景");
			break;
		//游戏场景
		case 2:
            Console.Clear();
            Console.WriteLine("游戏场景");
            break;
		//结束场景
		case 3:
            Console.Clear();
            Console.WriteLine("结束场景");
            break;
	}
}

开始场景逻辑实现

Console.SetCursorPosition(w / 2 - 7, 4);
Console.Write("勇者斗恶龙");

//当前选项的编号
int nowSelIndex = 0;
//因为要输入,完没可以构造一个开始界面自己的死循环
//专门用来处理开始场景相关逻辑
while (true)
{
	//用一个标识来处理想要在while循环内部的switch逻辑执行时希望退出外层循环时改变标识即可。
	bool isQuitWhite = false;
	//显示内容
	//先设置光标位置,再显示内容
	//根据当前选择的编号来决定是否变色。
	Console.SetCursorPosition(w / 2 - 6, 7);
	Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
	Console.Write("开始游戏");
    Console.SetCursorPosition(w / 2 - 6, 9);
    Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
    Console.Write("退出游戏");
    //检测输入
    //检测玩家输入的一个键内容,并且不会在控制台上显示输入的内容
    char input=Console.ReadKey(true).KeyChar;

	switch (input)
	{
		case 'w':
		case 'W':
			--nowSelIndex;
			if (nowSelIndex < 0)
				nowSelIndex = 0;
			break;
		case 's':
		case 'S':
			++nowSelIndex;
			if (nowSelIndex > 1)
				nowSelIndex = 1;
			break;
		case 'j':
		case 'J':
			if (nowSelIndex == 0)
			{
				//1.改变当前选择的场景ID
				nowSceneID = 2;
				//2.退出内层while循环
				isQuitWhite = true;
			}
			else
			{
				//关闭控制台
				Environment.Exit(0);
			}
			break;
	}
	if (isQuitWhite)
	{
		break;
	}
}

游戏场景

不变的红墙

//设置颜色为红色
Console.ForegroundColor = ConsoleColor.Red;
//画墙          
for (int i = 0; i <= w - 2; i++)
{
    //上方墙
    Console.SetCursorPosition(i, 0);
    Console.Write("■");

    //下方墙
    Console.SetCursorPosition(i, h - 1);
    Console.Write("■");

    //中间墙
    Console.SetCursorPosition(i, h - 6);
    Console.Write("■");
}

for (int i = 0; i < h; i++)
{
    //左边的墙
    Console.SetCursorPosition(0, i);
    Console.Write("■");

    //右边的墙
    Console.SetCursorPosition(w - 2, i);
    Console.Write("■");
}

boss相关

int bossX = 24;
int bossY = 15;
int bossAtkMin = 7;
int bossAtkMax = 13;
int bossHp = 100;
string bossIcon = "□";
//声明一个颜色变量
ConsoleColor bossColor = ConsoleColor.Green;

//boss活着时才绘制
if (bossHp > 0)
{
    Console.SetCursorPosition(bossX, bossY);
    Console.ForegroundColor = bossColor;
    Console.Write(bossIcon);
}

主角移动相关

int playerX = 4;
int playerY = 5;
int playerAtkMin = 8;
int playerAtkMax = 12;
int playerHp = 100;
string playerIcon = "●";
ConsoleColor playerColor = ConsoleColor.Yellow;
//玩家输入的内容,外面声明,节约性能
char playerInput;
//画出玩家
Console.SetCursorPosition(playerX, playerY);
Console.ForegroundColor = playerColor;
Console.Write(playerIcon);
//得到玩家的输入
playerInput = Console.ReadKey(true).KeyChar;
//擦除
Console.SetCursorPosition(playerX, playerY);
Console.Write(' ');
//改位置
switch (playerInput)
{
    case 'W':
    case 'w':
        --playerY;
        if (playerY < 1)
        {
            playerY = 1;
        }
        //位置如果和boss重合了,并且boss没有死
        else if (playerX == bossX && playerY == bossY && bossHp > 0)
        {
            //拉回去
            ++playerY;
        }
        break;
    case 'A':
    case 'a':
        playerX -= 2;
        if (playerX < 2)
        {
            playerX = 2;
        }
        //位置如果和boss重合了,并且boss没有死
        else if (playerX == bossX && playerY == bossY && bossHp > 0)
        {
            //拉回去
            playerX += 2;
        }
        break;
    case 'S':
    case 's':
        ++playerY;
        if (playerY > h - 7)
        {
            playerY = h - 7;
        }
        //位置如果和boss重合了,并且boss没有死
        else if (playerX == bossX && playerY == bossY && bossHp > 0)
        {
            //拉回去
            --playerY;
        }
        break;
    case 'D':
    case 'd':
        playerX += 2;
        if (playerX > w - 4)
        {
            playerX = w - 4;
        }
        else if (playerX == bossX && playerY == bossY && bossHp > 0)
        {
            //拉回去
            playerX -= 2;
        }
        break;
    case 'J':
    case 'j':
        //开始战斗
        if ((playerX == bossX && playerY == bossY - 1 || playerX == bossX && playerY == bossY + 1 || playerX == bossX - 2 && playerY == bossY || playerX == bossX + 2 && playerY == bossY) && bossHp > 0)
        {
            isFight = true;
            //可以开始战斗
            Console.SetCursorPosition(2, h - 5);
            Console.ForegroundColor = ConsoleColor.White;
            Console.Write("开始和boss战斗了,按J键继续....");
            Console.SetCursorPosition(2, h - 4);
            Console.Write("玩家当前的血量为{0}", playerHp);
            Console.SetCursorPosition(2, h - 3);
            Console.Write("boss当前的血量为{0}", bossHp);
        }
        break;

}

主角和boss战斗

bool isFight = false;
//只会处理J键
if (playerInput == 'j' || playerInput == 'J')
{
    //在这里判断玩家或者boss是否死亡,如果死亡了,继续之后的流程
    if (playerHp < 0)
    {
        //游戏结束
        //输掉了,应该直接显示游戏结束界面
        nowSceneID = 3;
        break;
    }
    else if (bossHp < 0)
    {
        //去营救公主
        //boss擦除
        Console.SetCursorPosition(bossX,bossY);
        Console.Write(' ');
        isFight = false;
    }
    else
    {
        //去处理按j键打架
        //玩家打boss
        Random random = new Random();
        //得到随机攻击力
        int atk = random.Next(playerAtkMin, playerAtkMax);
        //血量减对应的攻击力
        bossHp -= atk;
        //打印信息
        Console.ForegroundColor = ConsoleColor.Magenta;
        //先擦除这一行,上次显示的信息
        Console.SetCursorPosition(2, h - 4);
        Console.Write("                                                   ");
        //再来写新的信息
        Console.SetCursorPosition(2, h - 4);
        Console.Write("你对boss造成了{0}点伤害,boss剩余血量为{1}", atk, bossHp);
        //boss打玩家
        if (bossHp > 0)
        {
            //得到随机攻击力
            atk = random.Next(bossAtkMin, bossAtkMax);
            //血量减对应的攻击力
            playerHp -= atk;

            //打印信息
            Console.ForegroundColor = ConsoleColor.Yellow;
            //先擦除这一行,上次显示的信息
            Console.SetCursorPosition(2, h - 3);
            Console.Write("                                                ");
            //再来写新的信息
            Console.SetCursorPosition(2, h - 3);
            Console.Write("boss对你造成了{0}点伤害,你剩余血量为{1}", atk, playerHp);

        }
        else
        {
            //擦除之前的战斗信息
            Console.SetCursorPosition(2, h - 5);
            Console.Write("                                               ");
            Console.SetCursorPosition(2, h - 4);
            Console.Write("                                               ");
            Console.SetCursorPosition(2, h - 3);
            Console.Write("                                               ");
            //显示恭喜胜利的信息
            Console.SetCursorPosition(2, h - 5);
            Console.Write("你战胜了boss,快去营救公主吧");
            Console.SetCursorPosition(2, h - 4);
            Console.Write("前往公主身边按J键继续...");
        }
    }

}

公主相关

int princessX = 24;
int princessY = 5;
string princessIcon = "★";
ConsoleColor princessColor = ConsoleColor.Blue;
//作用是从while循环内部的switch改变标识,用来跳出外层的while循环
bool isOver = false;
Console.SetCursorPosition(princessX, princessY);
Console.ForegroundColor = princessColor;
Console.Write(princessIcon);
 //判断是否在公主身边按J键
 else if ((playerX == princessX && playerY == princessY - 1 || playerX == princessX && playerY == princessY + 1 || playerX == princessX - 2 && playerY == princessY || playerX == princessX + 2 && playerY == princessY) && bossHp <= 0)
 {
     nowSceneID = 3;
     isOver=true;
     break;
 }

结束场景逻辑实现

Console.Clear();
//标题的显示
Console.SetCursorPosition(w / 2 - 4, 5);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("GameOver");
//可变内容的显示,根据失败活着成功显示的内容不一样
Console.SetCursorPosition(w / 2 - 4, 7);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(gameOver);
int nowSelEndIndex = 0;
while (true)
{

    bool isQuitEndWhile = false;

    Console.SetCursorPosition(w / 2 - 6, 9);
    Console.ForegroundColor = nowSelEndIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
    Console.Write("回到开始界面");
    Console.SetCursorPosition(w / 2 - 4, 11);
    Console.ForegroundColor = nowSelEndIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
    Console.Write("退出游戏");

    char input = Console.ReadKey(true).KeyChar;

    switch (input)
    {
        case 'w':
        case 'W':
            --nowSelEndIndex;
            if (nowSelEndIndex < 0)
            {
                nowSelEndIndex = 0;
            }
            break;
        case 's':
        case 'S':
            ++nowSelEndIndex;
            if (nowSelEndIndex > 1)
            {
                nowSelEndIndex = 1;
            }
            break;
        case 'j':
        case 'J':
            if (nowSelEndIndex == 0)
            {
                nowSceneID = 1;
                isQuitEndWhile=true;
            }
            else
            {
                Environment.Exit(0);
            }
            break;
    }

    //为了从switch中跳出上一成的while循环加的标识
    if (isQuitEndWhile)
    {
        break;
    }
}

游戏截图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

标签:case,Console,Write,小游戏,简单,playerX,playerY,制作,SetCursorPosition
From: https://blog.csdn.net/Luo3255069063/article/details/139409562

相关文章

  • Loading.io 不仅仅只有加载动效!| 让创建动效更加简单!
    Loading.io|让创建动效更加简单在现代的web和移动应用开发中,用户体验(UX)至关重要。一个好的加载动画不仅可以让用户在等待时感到愉悦,还能提升整个应用的专业性和互动性。Loading.io正是这样一个帮助开发者轻松创建和集成加载动画及图标的强大平台。提供大量动效示例可视......
  • tg机器人怎么做简单:快速上手tg机器人制作的简易指南
    对于初学者来说,制作一个TG机器人可能会显得有些复杂。但是,只要掌握了一些基本的步骤和技巧,你就可以轻松地上手并制作出属于自己的TG机器人。本文将为你提供一个简易的指南。一、明确需求在开始制作机器人之前,你需要明确你的需求。专属定制前往TG&broang,&改成@即可打造你的完......
  • 制作一个简单HTML旅游网站(HTML+CSS+JS)甘肃旅游网页设计与实现5个页面
    一、......
  • 记一次“有手就行”的从SQL注入到文件上传Getshell的简单过程
    0x01前台SQL注入漏洞原理SQL注入漏洞的原理是应用程序没有对用户输入进行充分的验证和过滤,导致攻击者可以在输入框中插入恶意的SQL代码。当应用程序将用户输入的数据拼接到SQL查询语句中时,攻击者插入的恶意代码也会被执行,从而绕过身份验证和访问控制,直接访问或修改数据库......
  • OpenCv之简单的人脸识别项目(特征标注页面)
    人脸识别准备八、特征标注页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件3.定义两个全局变量4.定义选择图片的函数4.1函数定义和全局变量声明4.2打开文件对话框并获取文件路径4.3处理图片并创建标签4.4显示图......
  • 25.Docker 容器镜像制作/Docker 制作容器镜像/Docker 私有镜像仓库
    完成本地hub的搭建,并截图。不使用挂载的方式,而是通过Docker制作的方式实现对Nginx的默认页的修改,把制作的Dockerfile和首页html传到代码仓。推送自己定制好的Nginx镜像到本地镜像仓库hub中,查询本地镜像仓库中的镜像截图。从本地仓库拉取定制好的Nginx镜像,启......
  • 杨辉三角C语言的超简单解决办法
    #include<stdio.h>#include<stdlib.h>intmain(){intarr[10][10]={0};//十行的杨辉三角intsize=sizeof(arr)/sizeof(arr[0]);//求一共有几行for(inti=0;i<size;i++){for(intj=0;j<=i;j++)//对角线{if(i==j||j=......
  • Gradio.NET:一个快速制作演示demo网页的利器
    Gradio介绍Gradio是一个用于创建机器学习模型交互界面的Python库。它允许开发者快速为他们的模型创建一个简单的web界面,以便于非技术用户和其他开发者进行交互和测试。Gradio的主要优点是易用性和灵活性。你只需要几行代码就可以为你的模型创建一个交互界面。你可以选择各种输入......
  • [C++] 小游戏 斗破苍穹 2.2.1至2.11.5所有版本(下) zty出品
    2.10.6#include<stdio.h>#include<iostream>#include<ctime>#include<bits/stdc++.h>#include<time.h>#include<windows.h>//SLEEP函数usingnamespacestd;intboss1=0,boss2=0;structPlayer{//玩家结构体,并初始化playercharname[21......
  • synchronized、Lock本地锁和Redisson分布式锁的简单使用
    文章目录概念准备工作synchronized本地锁演示JUC包的Lock本地锁演示Redisson的RLock分布式锁演示源码地址参考来源概念redisson是一个简单易用的Redis客户端工具。不仅如此,它还具备分布式锁的功能准备工作快速整合SSMP请参考我这篇文章SpringBoot快速整合Spring......