项目名称
木木夕营救公主
项目介绍
这是一个小游戏,你将扮演一个英雄(木木夕),去打败恶龙,拯救出公主,该项目采用回合制战斗模式,由于角色的血量和攻击为随机数,所以需要靠运气才能通关噢!
简单需求分析
开始界面:控制台输入输出,控制台颜色变化
游戏界面:控制台输入输出,控制台颜色变化,回合制战斗(随机数,循环,条件判断)
结束界面: 控制台输入输出,控制台颜色变化
界面间相互切换
项目代码(含详细说明)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CSharp入门_实践
{
class Program
{
static void Main(string[] args)
{
#region 控制台基础设置
int width = 50;
int height = 30;
//隐藏光标
Console.CursorVisible = false;
//设置控制台大小
Console.SetWindowSize(width, height);
//设置缓冲区大小
Console.SetBufferSize(width, height);
#endregion
#region 多场景
//约定 1是开始游戏界面,2是游戏界面,3是结束界面
int nowId = 1;
string gameOverInfo ="" ;
while (true)
{
//不同的场景id,进行不同的逻辑
switch (nowId)
{
#region 开始场景逻辑
//开始场景
case 1:
Console.Clear();//每次场景切换需要把上一次的场景清除
Console.SetCursorPosition(width / 2 - 7, 8);//设置下面文字的位置
Console.Write("木木夕营救公主");
int nowSelIndex = 0;//当前选项编号 0:开始游戏 1:结束游戏
//输入
while (true)
{
bool isQuit = false;//退出循环标志
Console.SetCursorPosition(width / 2 - 4, 12);
//改变开始游戏的颜色
Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("开始游戏");
Console.SetCursorPosition(width / 2 - 4, 14);
//改变结束游戏的颜色
Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("退出游戏");
//说明
Console.SetCursorPosition(width / 2 - 16, 16);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("说明:按W,S进行上下选择,J键确定");
Console.SetCursorPosition(width / 2 - 10, 18);
Console.Write("操作时按WASD进行移动");
Console.ForegroundColor = ConsoleColor.Green;
Console.SetCursorPosition(width / 2 - 10, 20);
Console.Write("★");
Console.ForegroundColor = ConsoleColor.White;
Console.Write("为boss");
Console.ForegroundColor = ConsoleColor.Yellow;
Console.SetCursorPosition(width / 2 - 10, 21);
Console.Write("●");
Console.ForegroundColor = ConsoleColor.White;
Console.Write("为玩家木木夕");
Console.ForegroundColor = ConsoleColor.Blue;
Console.SetCursorPosition(width / 2 - 10, 22);
Console.Write("▲");
Console.ForegroundColor = ConsoleColor.White;
Console.Write("为公主");
Console.SetCursorPosition(width / 2 - 18, 23);
Console.Write("找到boss,进行挑战,按J键进行一次攻击");
//检测玩家输入,根据输入内容进行跳转
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)
{
//进入游戏
//改变当前场景id
nowId = 2;
//退出内层while循环
isQuit = true;
}
else
{
//关闭控制台
Environment.Exit(0);
}
break;
}
if (isQuit == true)
{
break;//跳出该层循环
}
}
break;
#endregion
//游戏场景
case 2:
Console.Clear();
#region 红墙
Console.ForegroundColor = ConsoleColor.Red;//设置颜色
//画墙
for (int i = 0; i < width-2; i += 2)
{
//上方
Console.SetCursorPosition(i, 0);//设置位置
Console.Write("■");
//下方
Console.SetCursorPosition(i, height - 2);//设置位置
Console.Write("■");
//中间
Console.SetCursorPosition(i, height - 7);//设置位置
Console.Write("■");
}
for (int i = 0; i <height-1; i++)
{
//左边
Console.SetCursorPosition(0, i);//设置位置
Console.Write("■");
//右边
Console.SetCursorPosition(width-2, i);//设置位置
Console.Write("■");
}
#endregion
#region boss属性相关
//boss位置
int xBoss = 24;
int yBoss = 15;
//boss攻击范围
int bossAtkMin = 9;
int bossAtkMax = 16;
//boss血量
int bossHP = 100;
//boss图标
string bossIcon = "★";
//boss颜色
ConsoleColor bossColor = ConsoleColor.Green;
#endregion
#region 玩家属性相关
//Player位置
int xPlayer = 4;
int yPlayer = 5;
//Player攻击范围
int playerAtkMin = 8;
int playerAtkMax = 15;
//Player血量
int playerHP = 100;
//Player图标
string playerIcon = "●";
//Player颜色
ConsoleColor playerColor = ConsoleColor.Yellow;
//玩家输入的内容
char playerInput;
#endregion
#region 公主属性
int xprincess = 24;
int yprincess = 5;
string princessIcon = "▲";
ConsoleColor princessColor = ConsoleColor.Blue;
#endregion
#region 玩家战斗状态
bool isFight = false;
bool isOver = false;//跳出while
#endregion
//游戏场景死循环
while (true)
{
//boss活着
if (bossHP > 0)
{
//绘制boss
Console.SetCursorPosition(xBoss, yBoss);
Console.ForegroundColor = bossColor;
Console.Write(bossIcon);
}
#region 公主模块
else
{
Console.SetCursorPosition(xprincess, yprincess);
Console.ForegroundColor = princessColor;
Console.Write(princessIcon);
}
#endregion
#region 玩家移动
//绘制玩家
Console.SetCursorPosition(xPlayer, yPlayer);
Console.ForegroundColor = playerColor;
Console.Write(playerIcon);
//玩家移动
//得到玩家输入
playerInput = Console.ReadKey(true).KeyChar;
//判断是否为战斗状态
if (isFight)
{
//执行战斗状态逻辑
if (playerInput == 'j'|| playerInput == 'J'){
//判断boss和玩家是否死亡
if (playerHP <= 0)
{
//游戏结束
nowId = 3;//结束游戏
gameOverInfo = "游戏失败";
break;
}else if (bossHP <= 0)
{
//营救公主
//先把boss擦除
Console.SetCursorPosition(xBoss, yBoss);
Console.Write(" ");
isFight = false;
}
else
{
//玩家攻击boss
Random rd = new Random();
int atk = rd.Next(playerAtkMin, playerAtkMax);
bossHP -= atk;
//打印信息
Console.ForegroundColor = ConsoleColor.Green;
//擦除信息
Console.SetCursorPosition(2, height - 4);
Console.Write(" ");
//再写新的信息
Console.SetCursorPosition(2, height - 4);
Console.Write("你对boss造成了{0}伤害,boss剩余血量为{1}", atk, bossHP);
//boss攻击玩家
if (bossHP > 0)
{
atk = rd.Next(bossAtkMin, bossAtkMax);
playerHP -= atk;
//打印信息
Console.ForegroundColor = ConsoleColor.Yellow;
//擦除信息
Console.SetCursorPosition(2, height - 3);
Console.Write(" ");
//再写新的信息
//玩家死亡
if (playerHP < 0)
{
Console.SetCursorPosition(2, height - 3);
Console.Write("很遗憾,你未能通过boss的试炼,战败了(按J结束)");
}
else
{
Console.SetCursorPosition(2, height - 3);
Console.Write("boss对你造成了{0}伤害,你的剩余血量为{1}", atk, playerHP);
}
}
else
{
//擦除战斗信息
Console.SetCursorPosition(2, height - 5);
Console.Write(" ");
Console.SetCursorPosition(2, height - 4);
Console.Write(" ");
Console.SetCursorPosition(2, height - 3);
Console.Write(" ");
//显示胜利信息
Console.SetCursorPosition(2, height - 5);
Console.Write("你战胜了boss,快去营救公主(先按J键解除战斗)");
Console.SetCursorPosition(2, height - 4);
Console.Write("请前往公主身边,按J键进行营救");
}
}
}
}
else
{
//执行非战斗状态逻辑
//擦除
Console.SetCursorPosition(xPlayer, yPlayer);//设置光标位置
Console.Write(" ");//擦除
//改位置
switch (playerInput)
{
case 'w':
case 'W':
--yPlayer;
if (yPlayer < 1)
{
yPlayer = 1;
}//主角与boss重合,但是boss没有死
else if (xPlayer == xBoss && yPlayer == yBoss && bossHP > 0)
{
//拉回去
++yPlayer;
}else if (xPlayer == xprincess && yPlayer == yprincess && bossHP <= 0)
{
//拉回去
++yPlayer;
}
break;
case 'a':
case 'A':
xPlayer -= 2;
if (xPlayer < 2)
{
xPlayer = 2;
}//主角与boss重合,但是boss没有死
else if (xPlayer == xBoss && yPlayer == yBoss && bossHP > 0)
{
//拉回去
xPlayer += 2;
}
else if (xPlayer == xprincess && yPlayer == yprincess && bossHP <= 0)
{
//拉回去
xPlayer += 2;
}
break;
case 's':
case 'S':
++yPlayer;
if (yPlayer > height - 8)
{
yPlayer = height - 8;
}//主角与boss重合,但是boss没有死
else if (xPlayer == xBoss && yPlayer == yBoss && bossHP > 0)
{
//拉回去
--yPlayer;
}
else if (xPlayer == xprincess && yPlayer == yprincess && bossHP <= 0)
{
//拉回去
--yPlayer;
}
break;
case 'd':
case 'D':
xPlayer += 2;
if (xPlayer > width - 4)
{
xPlayer = width - 4;
}//主角与boss重合,但是boss没有死
else if (xPlayer == xBoss && yPlayer == yBoss && bossHP > 0)
{
//拉回去
xPlayer -= 2;
}
else if (xPlayer == xprincess && yPlayer == yprincess && bossHP <= 0)
{
//拉回去
xPlayer -= 2;
}
break;
case 'j':
case 'J':
//开始战斗,玩家不再移动,下方显示信息
if ((xPlayer == xBoss && yPlayer == yBoss - 1 ||
xPlayer == xBoss && yPlayer == yBoss + 1 ||
yPlayer == yBoss && xPlayer == xBoss - 2 ||
yPlayer == yBoss && xPlayer == xBoss + 2) && bossHP > 0
)
{
isFight = true;
//满足上述条件可以开始战斗
Console.SetCursorPosition(2, height - 5);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("开始和boss战斗了,按J键继续");
Console.SetCursorPosition(2, height - 4);
Console.Write("玩家当前血量为{0}", playerHP);
Console.SetCursorPosition(2, height - 3);
Console.Write("Boss当前血量为{0}", bossHP);
}
//判断是否在公主身边
else if ((xPlayer == xprincess && yPlayer == yprincess - 1 ||
xPlayer == xprincess && yPlayer == yprincess + 1 ||
yPlayer == yprincess && xPlayer == xprincess - 2 ||
yPlayer == yprincess && xPlayer == xprincess + 2) && bossHP<=0)
{
nowId = 3;
gameOverInfo ="游戏通关";
isOver = true;
break;
}
break;
}
}
#endregion
if (isOver)
{
break;
}
}
break;
//结束场景
case 3:
Console.Clear();
Console.SetCursorPosition(width / 2 - 5, 5);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("GAME OVER");
//失败和成功提示不一样
Console.SetCursorPosition(width / 2 - 4, 7);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write(gameOverInfo);
int nowSelEndId = 0;
while (true)
{
bool isQuitEnd = false;
Console.SetCursorPosition(width / 2 - 6, 9);
Console.ForegroundColor = nowSelEndId == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("回到开始界面");
Console.SetCursorPosition(width / 2 - 4, 11);
Console.ForegroundColor = nowSelEndId == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("退出游戏");
char input = Console.ReadKey(true).KeyChar;
switch (input)
{
case 'w':
case 'W':
--nowSelEndId;
if (nowSelEndId < 0)
{
nowSelEndId = 0;
}
break;
case 's':
case 'S':
++nowSelEndId;
if (nowSelEndId >1)
{
nowSelEndId = 1;
}
break;
case 'j':
case 'J':
if (nowSelEndId == 0)
{
nowId = 1;
isQuitEnd = true;
}
else
{
Environment.Exit(0);
}
break;
}
//为了从switch中跳出while
if (isQuitEnd)
{
break;
}
}
break;
}
}
#endregion
}
}
}
项目演示
木木夕营救公主