效果展示
主函数
static void Main ( string [ ] args)
{
int w = 50 ;
int h = 30 ;
ConsoleInit ( w, h) ;
E_SceneType nowSceneType = E_SceneType. Begin;
while ( true )
{
switch ( nowSceneType)
{
case E_SceneType. Begin:
Console. Clear ( ) ;
GameEndOrBegin ( w, h, ref nowSceneType) ;
break ;
case E_SceneType. Game:
Console. Clear ( ) ;
GameScene ( w, h, ref nowSceneType) ;
break ;
case E_SceneType. End:
Console. Clear ( ) ;
GameEndOrBegin ( w, h, ref nowSceneType) ;
break ;
default :
break ;
}
}
}
场景类型枚举
enum E_SceneType
{
Begin,
Game,
End,
}
控制台基础设置
static void ConsoleInit ( int w, int h)
{
Console. CursorVisible = false ;
Console. SetWindowSize ( w, h) ;
Console. SetBufferSize ( w, h) ;
}
开始及结束场景逻辑
static void GameEndOrBegin ( int w, int h, ref E_SceneType nowSceneType)
{
Console. ForegroundColor = ConsoleColor. White;
Console. SetCursorPosition ( nowSceneType == E_SceneType. Begin ? w / 2 - 3 : w / 2 - 4 , 8 ) ;
Console. Write ( nowSceneType == E_SceneType. Begin ? "飞行棋" : "游戏结束" ) ;
int count = 0 ;
bool IsOver = false ;
while ( true )
{
Console. SetCursorPosition ( nowSceneType == E_SceneType. Begin? w/ 2 - 4 : w/ 2 - 5 , 11 ) ;
Console. ForegroundColor = count == 0 ? ConsoleColor. Red : ConsoleColor. White;
Console. Write ( nowSceneType == E_SceneType. Begin? "游戏开始" : "回到主菜单" ) ;
Console. SetCursorPosition ( w/ 2 - 4 , 13 ) ;
Console. ForegroundColor = count == 1 ? ConsoleColor. Red : ConsoleColor. White;
Console. Write ( "退出游戏" ) ;
switch ( Console. ReadKey ( true ) . Key)
{
case ConsoleKey. W:
-- count;
if ( count < 0 )
{
count = 0 ;
}
break ;
case ConsoleKey. S:
++ count;
if ( count > 1 )
{
count = 1 ;
}
break ;
case ConsoleKey. J:
if ( count == 0 )
{
nowSceneType = nowSceneType == E_SceneType. Begin? E_SceneType. Game: E_SceneType. Begin;
IsOver = true ;
}
else
{
Environment. Exit ( 0 ) ;
}
break ;
}
if ( IsOver)
break ;
}
}
游戏场景逻辑
static void GameScene ( int w, int h, ref E_SceneType nowSceneType)
{
DrawWall ( w, h) ;
Map map = new Map ( 14 , 3 , 80 ) ;
map. Draw ( ) ;
Player player = new Player ( 0 , E_Player_Type. Player) ;
Player computer = new Player ( 0 , E_Player_Type. Computer) ;
DrawPlayer ( map, player, computer) ;
while ( true )
{
if ( PlayerRandomMove ( w, h, ref player, ref computer, map, ref nowSceneType) )
{
break ;
}
if ( PlayerRandomMove ( w, h, ref computer, ref player, map, ref nowSceneType) )
{
break ;
}
}
}
static bool PlayerRandomMove ( int w, int h, ref Player p, ref Player otherP, Map map, ref E_SceneType nowSceneType)
{
Console. ReadKey ( true ) ;
bool isGameOver = RandomMove ( w, h, ref p, ref otherP, map) ;
map. Draw ( ) ;
DrawPlayer ( map, p, otherP) ;
if ( isGameOver)
{
Console. ReadKey ( true ) ;
nowSceneType = E_SceneType. End;
}
return isGameOver;
}
固定打印的信息
static void DrawWall ( int w, int h)
{
Console. ForegroundColor = ConsoleColor. Red;
for ( int i = 0 ; i < w; i+= 2 )
{
Console. SetCursorPosition ( i, 0 ) ;
Console. Write ( "■" ) ;
Console. SetCursorPosition ( i, h- 6 ) ;
Console. Write ( "■" ) ;
Console. SetCursorPosition ( i, h - 11 ) ;
Console. Write ( "■" ) ;
Console. SetCursorPosition ( i, h- 1 ) ;
Console. Write ( "■" ) ;
}
for ( int i = 0 ; i < h; i++ )
{
Console. SetCursorPosition ( 0 , i) ;
Console. Write ( "■" ) ;
Console. SetCursorPosition ( w- 2 , i) ;
Console. Write ( "■" ) ;
}
Console. SetCursorPosition ( 2 , h - 5 ) ;
Console. ForegroundColor = ConsoleColor. White;
Console. Write ( "按任意键开始扔色子" ) ;
Console. SetCursorPosition ( 2 , h - 10 ) ;
Console. Write ( "□:普通格子" ) ;
Console. SetCursorPosition ( 2 , h - 9 ) ;
Console. ForegroundColor = ConsoleColor. Blue;
Console. Write ( "■:暂停,一回合不动" ) ;
Console. SetCursorPosition ( 22 , h - 9 ) ;
Console. ForegroundColor = ConsoleColor. Red;
Console. Write ( "●:炸弹,倒退5格" ) ;
Console. SetCursorPosition ( 2 , h - 8 ) ;
Console. ForegroundColor = ConsoleColor. White;
Console. Write ( "×:时空隧道,随机倒退,暂停,交换位置" ) ;
Console. SetCursorPosition ( 2 , h - 7 ) ;
Console. ForegroundColor = ConsoleColor. Cyan;
Console. Write ( "★:玩家 " ) ;
Console. SetCursorPosition ( 11 , h - 7 ) ;
Console. ForegroundColor = ConsoleColor. Magenta;
Console. Write ( "▲:电脑 " ) ;
Console. SetCursorPosition ( 20 , h - 7 ) ;
Console. ForegroundColor = ConsoleColor. Blue;
Console. Write ( "◎:玩家电脑重合" ) ;
}
格子类型枚举和格子结构体
enum E_Grid_Type
{
Normal,
Boom,
Pause,
Tunnel,
}
struct Vector2
{
public int x;
public int y;
public Vector2 ( int x, int y)
{
this . x = x;
this . y = y;
}
}
struct Grid
{
public E_Grid_Type _type;
public Vector2 pos;
public Grid ( int x, int y, E_Grid_Type type)
{
pos. x = x;
pos. y = y;
_type = type;
}
public void Draw ( )
{
Console. SetCursorPosition ( pos. x, pos. y) ;
switch ( _type)
{
case E_Grid_Type. Normal:
Console. ForegroundColor = ConsoleColor. White;
Console. Write ( "□" ) ;
break ;
case E_Grid_Type. Boom:
Console. ForegroundColor = ConsoleColor. Red;
Console. Write ( "●" ) ;
break ;
case E_Grid_Type. Pause:
Console. ForegroundColor = ConsoleColor. Blue;
Console. Write ( "■" ) ;
break ;
case E_Grid_Type. Tunnel:
Console. ForegroundColor = ConsoleColor. White;
Console. Write ( "×" ) ;
break ;
}
}
}
地图结构体
struct Map
{
public Grid[ ] grids;
public Map ( int x, int y, int num)
{
grids = new Grid [ num] ;
int indexX = 0 ;
int indexY = 0 ;
int stepNum = 2 ;
Random r = new Random ( ) ;
int randomNum;
for ( int i = 0 ; i < num; i++ )
{
randomNum = r. Next ( 0 , 101 ) ;
if ( randomNum < 85 || i == 0 || i == num - 1 )
{
grids[ i] . _type = E_Grid_Type. Normal;
}
else if ( randomNum < 90 && randomNum >= 85 )
{
grids[ i] . _type = E_Grid_Type. Boom;
}
else if ( randomNum < 95 && randomNum >= 90 )
{
grids[ i] . _type = E_Grid_Type. Pause;
}
else
{
grids[ i] . _type = E_Grid_Type. Tunnel;
}
grids[ i] . pos = new Vector2 ( x, y) ;
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 < grids. Length; i++ )
{
grids[ i] . Draw ( ) ;
}
}
}
玩家和电脑结构体
enum E_Player_Type
{
Player,
Computer,
}
struct Player
{
public E_Player_Type type;
public int nowIndex;
public bool isPause;
public Player ( int index, E_Player_Type type)
{
nowIndex = index;
this . type = type;
isPause = false ;
}
public void Draw ( Map mapInfo)
{
Grid grid = mapInfo. grids[ nowIndex] ;
Console. SetCursorPosition ( grid. pos. x, grid. pos. y) ;
switch ( type)
{
case E_Player_Type. Player:
Console. ForegroundColor = ConsoleColor. Cyan;
Console. Write ( "★" ) ;
break ;
case E_Player_Type. Computer:
Console. ForegroundColor = ConsoleColor. Magenta;
Console. Write ( "▲" ) ;
break ;
}
}
}
绘制玩家
static void DrawPlayer ( Map map, Player player, Player computer)
{
if ( player. nowIndex == computer. nowIndex)
{
Grid grid = map. grids[ player. nowIndex] ;
Console. SetCursorPosition ( grid. pos. x, grid. pos. y) ;
Console. ForegroundColor = ConsoleColor. DarkGreen;
Console. Write ( "◎" ) ;
}
else
{
player. Draw ( map) ;
computer. Draw ( map) ;
}
}
扔骰子逻辑
static void ClearInfo ( int h)
{
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 - 2 ) ;
Console. Write ( " " ) ;
}
static bool RandomMove ( int w, int h, ref Player p, ref Player otherP, Map map)
{
ClearInfo ( h) ;
Console. ForegroundColor = p. type == E_Player_Type. Player ? ConsoleColor. Cyan : ConsoleColor. Magenta;
if ( p. isPause)
{
Console. SetCursorPosition ( 2 , h - 5 ) ;
Console. Write ( "处于暂停状态,{0}需要暂停一回合" , p. type == E_Player_Type. Player ? "你" : "电脑" ) ;
Console. SetCursorPosition ( 2 , h - 4 ) ;
Console. Write ( "请按任意键,让{0}开始扔色子" , p. type == E_Player_Type. Player ? "电脑" : "你" ) ;
p. isPause = false ;
return false ;
}
Random r = new Random ( ) ;
int randomNum = r. Next ( 1 , 7 ) ;
p. nowIndex += randomNum;
Console. SetCursorPosition ( 2 , h - 5 ) ;
Console. Write ( "{0}扔出的点数为:{1}" , p. type == E_Player_Type. Player ? "你" : "电脑" , randomNum) ;
if ( p. nowIndex >= map. grids. Length - 1 )
{
p. nowIndex = map. grids. Length - 1 ;
Console. SetCursorPosition ( 2 , h - 4 ) ;
if ( p. type == E_Player_Type. Player)
{
Console. Write ( "恭喜你,率先到达了终点" ) ;
}
else
{
Console. Write ( "很遗憾,电脑率先到达了终点" ) ;
}
Console. SetCursorPosition ( 2 , h - 3 ) ;
Console. Write ( "请按任意键结束" ) ;
return true ;
}
else
{
Grid grid = map. grids[ p. nowIndex] ;
switch ( grid. _type)
{
case E_Grid_Type. Normal:
Console. SetCursorPosition ( 2 , h - 4 ) ;
Console. Write ( "{0}到达了一个安全位置" , p. type == E_Player_Type. Player ? "你" : "电脑" ) ;
Console. SetCursorPosition ( 2 , h - 3 ) ;
Console. Write ( "请按任意键,让{0}开始扔色子" , p. type == E_Player_Type. Player ? "电脑" : "你" ) ;
break ;
case E_Grid_Type. Boom:
p. nowIndex -= 5 ;
if ( p. nowIndex < 0 )
{
p. nowIndex = 0 ;
}
Console. SetCursorPosition ( 2 , h - 4 ) ;
Console. Write ( "{0}踩到了炸弹,退后5格" , p. type == E_Player_Type. Player ? "你" : "电脑" ) ;
Console. SetCursorPosition ( 2 , h - 3 ) ;
Console. Write ( "请按任意键,让{0}开始扔色子" , p. type == E_Player_Type. Player ? "电脑" : "你" ) ;
break ;
case E_Grid_Type. Pause:
p. isPause = true ;
Console. SetCursorPosition ( 2 , h - 4 ) ;
Console. Write ( "{0}到达了暂停点,你需要暂停一回合" , p. type == E_Player_Type. Player ? "你" : "电脑" ) ;
Console. SetCursorPosition ( 2 , h - 3 ) ;
Console. Write ( "请按任意键,让{0}开始扔色子" , p. type == E_Player_Type. Player ? "电脑" : "你" ) ;
break ;
case E_Grid_Type. Tunnel:
Console. SetCursorPosition ( 2 , h - 4 ) ;
Console. Write ( "{0}踩到了时空隧道" , p. type == E_Player_Type. Player ? "你" : "电脑" ) ;
randomNum = r. Next ( 1 , 91 ) ;
if ( randomNum <= 30 )
{
p. nowIndex -= 5 ;
if ( p. nowIndex < 0 )
{
p. nowIndex = 0 ;
}
Console. SetCursorPosition ( 2 , h - 5 ) ;
Console. Write ( "触发倒退5格" ) ;
}
else if ( randomNum <= 60 )
{
p. isPause = true ;
Console. SetCursorPosition ( 2 , h - 3 ) ;
Console. Write ( "触发暂停一回合" ) ;
}
else
{
int tmp = p. nowIndex;
p. nowIndex = otherP. nowIndex;
otherP. nowIndex = tmp;
Console. SetCursorPosition ( 2 , h - 3 ) ;
Console. Write ( "惊喜,双方交换位置" ) ;
}
Console. SetCursorPosition ( 2 , h - 2 ) ;
Console. Write ( "请按任意键,让{0}开始扔色子" , p. type == E_Player_Type. Player ? "电脑" : "你" ) ;
break ;
}
}
return false ;
}