C#飞行棋优化版
作者:互联网
飞行棋
代码如下
using System;
namespace ConsoleApp1
{
enum E_Gezi
{
Simple,
Boom,
Pause,
TimeTravel,
}
enum E_PlayerType
{
MianPlayer,
Computer,
}
enum E_SceneType
{
Begin,
Game,
End,
}
struct Vector2
{
public int x;
public int y;
public Vector2(int x, int y)
{
this.x = x;
this.y = y;
}
}
struct Gezi
{
public E_Gezi type;
public Vector2 pos;
public Gezi(int x, int y, E_Gezi gezi)
{
pos = new Vector2(x, y);
type = gezi;
}
public void Draw()
{
Console.SetCursorPosition(pos.x, pos.y);
switch (type)
{
case E_Gezi.Simple:
Console.ForegroundColor = ConsoleColor.White;
Console.Write("□");
break;
case E_Gezi.Boom:
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("●");
break;
case E_Gezi.Pause:
Console.ForegroundColor = ConsoleColor.DarkBlue;
Console.Write("Ⅱ");
break;
case E_Gezi.TimeTravel:
Console.ForegroundColor = ConsoleColor.White;
Console.Write("D ");
break;
}
}
}
struct Map
{
public Gezi[] gezis;
public Map(int x, int y, int num)
{
this.gezis = new Gezi[num];
Random r = new();
int ra;
int stepNum = 2;
int indexX = 0;
int indexY = 0;
for (int i = 0; i < gezis.Length; i++)
{
//随机有物体生成
ra = r.Next(1, 101);
if (ra >= 1 && ra < 85 || i == 0 || i == gezis.Length - 1)
{
gezis[i].type = E_Gezi.Simple;
}
else if (ra >= 85 && ra < 90)
{
gezis[i].type = E_Gezi.Pause;
}
else if (ra >= 90 && ra < 95)
{
gezis[i].type = E_Gezi.Boom;
}
else
{
gezis[i].type = E_Gezi.TimeTravel;
}
gezis[i].pos = new Vector2(x, y);
//一行有十个 然后让y加2次
if (indexX == 10)
{
y += 1;
++indexY;
if (indexY == 2)
{
indexX = 0;
indexY = 0;
stepNum = -stepNum;
}
}
else
{
//奇数次步长反向
x += stepNum;
++indexX;
}
}
}
public void Draw()
{
for (int i = 0; i < gezis.Length; i++)
{
gezis[i].Draw();
}
}
}
struct Player
{
public E_PlayerType type;
public int indexStep;
//这里有一种优化方案 就是直接把坐标变成索引 并且内置一个bool变量判断玩家是否被暂停
//之后用索引配合map来绘制地图
public bool isPause;
public Player(int index, E_PlayerType type)
{
indexStep = index;
this.type = type;
isPause = false;
}
public void Draw(Map map)
{
Console.SetCursorPosition(map.gezis[indexStep].pos.x, map.gezis[indexStep].pos.y);
switch (type)
{
case E_PlayerType.MianPlayer:
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("★");
break;
case E_PlayerType.Computer:
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.Write("▲");
break;
}
}
}
class Program
{
static void Main()
{
//初始化设置
Console.SetWindowSize(50, 40);
Console.SetBufferSize(50, 40);
Console.CursorVisible = false;
E_SceneType type = E_SceneType.Begin;
while (true)
{
switch (type)
{
case E_SceneType.Begin:
Console.Clear();
GameScence(ref type);
break;
case E_SceneType.Game:
Console.Clear();
DrawWall();
Map map = new(12, 3, 80);
map.Draw();
//绘制玩家相关
Player player = new(0, E_PlayerType.MianPlayer);
Player computer = new(0, E_PlayerType.Computer);
DrawPlayer( player, computer, map);
while (true)
{
if(!InputSelection(ref player,ref computer,map,ref type))
{
break;
}
if(!InputSelection(ref computer, ref player, map, ref type))
{
break;
}
}
break;
case E_SceneType.End:
Console.Clear();
GameOverScence(ref type);
break;
}
}
}
static void GameScence(ref E_SceneType type)
{
//标题
string title = "飞行棋";
string startGame = "开始游戏";
string quitGame = "结束游戏";
//选择的索引
int selectIndex = 0;
//选择
Console.SetCursorPosition(25 - title.Length, 10);
Console.Write(title);
//跳出while
bool isquit = false;
while (true)
{
if (isquit)
{
break;
}
Console.SetCursorPosition(25 - startGame.Length, 13);
Console.ForegroundColor = selectIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write(startGame);
Console.SetCursorPosition(25 - quitGame.Length, 15);
Console.ForegroundColor = selectIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write(quitGame);
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.W:
selectIndex = 0;
break;
case ConsoleKey.S:
selectIndex = 1;
break;
case ConsoleKey.J:
if (selectIndex == 0)
{
type = E_SceneType.Game;
isquit = true;
}
else if (selectIndex == 1)
{
Environment.Exit(0);
}
break;
}
}
}
static void GameOverScence(ref E_SceneType type)
{
//标题
string Endtitle = "游戏结束";
string returnMain = "回到主菜单";
string quitGame1 = "结束游戏";
//选择的索引
int selectIndex = 0;
Console.SetCursorPosition(25 - Endtitle.Length, 10);
Console.Write(Endtitle);
//跳出while
bool isquit = false;
while (true)
{
if (isquit)
{
break;
}
Console.SetCursorPosition(25 - returnMain.Length, 13);
Console.ForegroundColor = selectIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write(returnMain);
Console.SetCursorPosition(25 - quitGame1.Length, 15);
Console.ForegroundColor = selectIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write(quitGame1);
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.W:
selectIndex = 0;
break;
case ConsoleKey.S:
selectIndex = 1;
break;
case ConsoleKey.J:
if (selectIndex == 0)
{
type = E_SceneType.Begin;
isquit = true;
}
else if (selectIndex == 1)
{
Environment.Exit(0);
}
break;
}
}
}
static void DrawWall()
{
Console.ForegroundColor = ConsoleColor.Red;
for (int i = 0; i < 50 - 2; i += 2)
{
Console.SetCursorPosition(i, 0);
Console.Write("■");
}
for (int i = 0; i < 50 - 2; i += 2)
{
Console.SetCursorPosition(i, 39);
Console.Write("■");
}
for (int i = 0; i < 50 - 2; i += 2)
{
Console.SetCursorPosition(i, 34);
Console.Write("■");
}
for (int i = 0; i < 50 - 2; i += 2)
{
Console.SetCursorPosition(i, 29);
Console.Write("■");
}
for (int i = 0; i < 40; i++)
{
Console.SetCursorPosition(0, i);
Console.Write("■");
}
for (int i = 0; i < 40; i++)
{
Console.SetCursorPosition(46, i);
Console.Write("■");
}
Console.SetCursorPosition(2, 30);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("□: 普通格子");
Console.SetCursorPosition(2, 31);
Console.ForegroundColor = ConsoleColor.DarkBlue;
Console.Write("Ⅱ: 暂停,一回合不动");
Console.SetCursorPosition(24, 31);
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("●: 炸弹,倒退5格");
Console.SetCursorPosition(2, 32);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("D : 时空隧道,随机倒退,暂停,换位置");
Console.SetCursorPosition(2, 33);
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("★:玩家");
Console.SetCursorPosition(10, 33);
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.Write("▲:电脑");
Console.SetCursorPosition(18, 33);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("C :电脑玩家重合");
Console.SetCursorPosition(2, 35);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("按任意键开始扔筛子");
}
//优化二 专门写一个函数 绘制玩家 //重合的时候 和 不重合的时候分别画
static void DrawPlayer(Player player, Player player1,Map map)
{
if(player.indexStep == player1.indexStep)
{
Console.SetCursorPosition(map.gezis[player.indexStep].pos.x, map.gezis[player.indexStep].pos.y);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("C ");
}
else
{
Console.SetCursorPosition(map.gezis[player.indexStep].pos.x, map.gezis[player.indexStep].pos.y);
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("★");
Console.SetCursorPosition(map.gezis[player1.indexStep].pos.x, map.gezis[player1.indexStep].pos.y);
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.Write("▲");
}
}
//优化3 扔色子函数判断是否游戏结束
//优化4 通过函数包裹来重用玩家输入和电脑输入
static bool InputSelection(ref Player player,ref Player player1, Map map,ref E_SceneType type)
{
if (player.isPause)
{
player.isPause = false;
}
else
{
switch (Console.ReadKey(true).Key)
{
case ConsoleKey.A:
case ConsoleKey.B:
case ConsoleKey.C:
case ConsoleKey.D:
case ConsoleKey.E:
case ConsoleKey.F:
case ConsoleKey.G:
case ConsoleKey.H:
case ConsoleKey.I:
case ConsoleKey.J:
case ConsoleKey.K:
case ConsoleKey.L:
case ConsoleKey.M:
case ConsoleKey.N:
case ConsoleKey.O:
case ConsoleKey.P:
case ConsoleKey.Q:
case ConsoleKey.R:
case ConsoleKey.S:
case ConsoleKey.T:
case ConsoleKey.U:
case ConsoleKey.V:
case ConsoleKey.W:
case ConsoleKey.X:
case ConsoleKey.Y:
case ConsoleKey.Z:
ThrowShaiZi(ref player, ref player1, map, ref type);
break;
}
}
if(type == E_SceneType.End)
{
return false;
}
return true;
}
static void ThrowShaiZi(ref Player player, ref Player computer, Map map,ref E_SceneType type)
{
Random r = new();
player.indexStep += r.Next(1, 7);
for (int i = 0; i < map.gezis.Length; i++)
{
if(player.indexStep >= map.gezis.Length - 1)
{
player.indexStep = map.gezis.Length - 1;
type = E_SceneType.End;
}
if (player.indexStep == i)
{
switch (map.gezis[i].type)
{
case E_Gezi.Simple:
break;
case E_Gezi.Boom:
player.indexStep -= 5;
break;
case E_Gezi.Pause:
player.isPause = true;
break;
case E_Gezi.TimeTravel:
if(r.Next(1,4) == 1)
{
player.indexStep -= 5;
}
else if(r.Next(1, 4) == 2)
{
player.isPause = true;
}
else if(r.Next(1, 4) == 3)
{
int temp = computer.indexStep;
computer.indexStep = player.indexStep;
player.indexStep = temp;
}
break;
}
break;
}
}
}
}
}
标签:case,Console,C#,type,飞行棋,Write,int,ConsoleKey,优化 来源: https://blog.csdn.net/qq_50981313/article/details/116521979