飞行棋
代码如下
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;
}
public static bool operator==(Vector2 v1, Vector2 v2)
{
return v1.x == v2.x && v1.y == v2.y;
}
public static bool operator!=(Vector2 v1, Vector2 v2)
{
return !(v1.x == v2.x && v1.y == v2.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 Vector2 pos;
public Player(int x, int y, E_PlayerType type)
{
pos = new Vector2(x, y);
this.type = type;
}
public void Draw()
{
Console.SetCursorPosition(pos.x, 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(12, 3, E_PlayerType.MianPlayer);
Player computer = new(12, 3, E_PlayerType.Computer);
Console.SetCursorPosition(12, 3);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("C ");
bool isEnd = false;
bool isPlayerPause = false;
bool isComputerPause = false;
while (true)
{
if(isPlayerPause)
{
isPlayerPause = 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.pos, ref computer.pos, map, ref isEnd, ref isPlayerPause);
map.Draw();
break;
}
if (player.pos != computer.pos)
{
player.Draw();
computer.Draw();
}
else
{
Console.SetCursorPosition(player.pos.x, player.pos.y);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("C ");
}
if (isEnd)
{
type = E_SceneType.End;
break;
}
}
if(isComputerPause)
{
isComputerPause = 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 computer.pos, ref player.pos, map, ref isEnd, ref isComputerPause);
map.Draw();
break;
}
if (player.pos != computer.pos)
{
player.Draw();
computer.Draw();
}
else
{
Console.SetCursorPosition(player.pos.x, player.pos.y);
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("C ");
}
if (isEnd)
{
type = E_SceneType.End;
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 ThrowShaiZi(ref Vector2 pos,ref Vector2 pos1, Map map,ref bool isEnd,ref bool isPause)
{
Random r = new();
int h = r.Next(1, 7);
for (int i = 0; i < map.gezis.Length; i++)
{
if(pos == map.gezis[i].pos)
{
if(i + h >= map.gezis.Length - 1)
{
pos = map.gezis[^1].pos;
isEnd = true;
break;
}
switch (map.gezis[i + h].type)
{
case E_Gezi.Boom:
pos = map.gezis[i + h - 5].pos;
break;
case E_Gezi.Pause:
pos = map.gezis[i + h].pos;
isPause = true;
break;
case E_Gezi.Simple:
pos = map.gezis[i + h].pos;
break;
case E_Gezi.TimeTravel:
if(r.Next(1, 4) == 1)
{
pos = map.gezis[i + h].pos;
}
else if(r.Next(1,4) == 2)
{
pos = map.gezis[i + h].pos;
isPause = true;
}
else if(r.Next(1,4) == 3)
{
Vector2 vector2;
vector2 = pos1;
pos1 = pos;
pos = vector2;
}
break;
}
break;
}
}
}
}
}