1. 程式人生 > >C#遊戲程式設計:《控制檯小遊戲系列》之《六、貪吃蛇例項》

C#遊戲程式設計:《控制檯小遊戲系列》之《六、貪吃蛇例項》

[csharp] view plaincopyprint?
  1. using System;  
  2. using CEngine;  
  3. using CGraphics;  
  4. namespace Snake  
  5. {  
  6.     /// <summary>
  7.     /// 貪吃蛇遊戲類
  8.     /// </summary>
  9.     publicsealedclass SnakeGame : CGame  
  10.     {  
  11.         /// <summary>
  12.         /// 遊戲狀態
  13.         /// </summary>
  14.         public
    enum GameState  
  15.         {  
  16.             /// <summary>
  17.             /// 初始化
  18.             /// </summary>
  19.             Init,  
  20.             /// <summary>
  21.             /// 開始遊戲
  22.             /// </summary>
  23.             Start,  
  24.             /// <summary>
  25.             /// 暫停遊戲
  26.             /// </summary>
  27.             Pause,  
  28.             /// <summary>
  29.             /// 結束遊戲
  30.             /// </summary>
  31.             End  
  32.         }  
  33.         /// <summary>
  34.         /// 貪吃蛇
  35.         /// </summary>
  36.         private Snake g_snake;  
  37.         /// <summary>
  38.         /// 食物
  39.         /// </summary>
  40.         private
     Food g_food;  
  41.         /// <summary>
  42.         /// 隨機數
  43.         /// </summary>
  44.         private Random g_random;  
  45.         /// <summary>
  46.         /// 分數
  47.         /// </summary>
  48.         private Int32 g_score;  
  49.         /// <summary>
  50.         /// 生命
  51.         /// </summary>
  52.         private Int32 g_lifes;  
  53.         /// <summary>
  54.         /// 狀態
  55.         /// </summary>
  56.         private GameState g_state;  
  57.         #region 遊戲執行函式
  58.         /// <summary>
  59.         /// 遊戲初始化
  60.         /// </summary>
  61.         protectedoverridevoid gameInit()  
  62.         {  
  63.             base.setTitle("控制檯遊戲之——簡易貪吃蛇v1.0");  
  64.             base.setCursorVisible(false);  
  65.             base.setUpdateRate(50);  
  66.             this.g_random = new Random();  
  67.             this.g_snake = new Snake(3, CDirection.Right);  
  68.             this.g_food = new Food();  
  69.             this.g_lifes = 3;  
  70.             this.g_state = GameState.Init;  
  71.             this.drawInitUI();  
  72.         }  
  73.         /// <summary>
  74.         /// 遊戲重繪時響應
  75.         /// </summary>
  76.         /// <param name="e"></param>
  77.         protectedoverridevoid onRedraw(CPaintEventArgs e)  
  78.         {  
  79.             base.onRedraw(e);  
  80.             CDraw draw = e.getDraw();  
  81.             //繪製食物
  82.             g_food.draw(draw);  
  83.             //繪製資料
  84.             draw.drawText("得分:" + g_score.ToString(), 63, 2, ConsoleColor.Green);  
  85.             draw.drawText("生命:" + g_lifes.ToString(), 63, 4, ConsoleColor.Red);  
  86.         }  
  87.         /// <summary>
  88.         /// 遊戲渲染
  89.         /// </summary>
  90.         /// <param name="draw"></param>
  91.         protectedoverridevoid gameDraw(CGraphics.CDraw draw)  
  92.         {  
  93.             if (g_state == GameState.Start)  
  94.             {  
  95.                 g_snake.draw(draw);  
  96.                 draw.drawText("FPS:" + getFPS(), 63, 6, ConsoleColor.Blue);  
  97.             }  
  98.         }  
  99.         /// <summary>
  100.         /// 遊戲邏輯
  101.         /// </summary>
  102.         protectedoverridevoid gameLoop()  
  103.         {  
  104.             //遊戲開始狀態
  105.             if (g_state == GameState.Start)  
  106.             {  
  107.                 //如果蛇能爬行或者沒有自殘則爬行
  108.                 if (g_snake.move() && !g_snake.isSeftCollision())  
  109.                 {  
  110.                     //吃到食物
  111.                     if