即使走的再遠(yuǎn),也勿忘啟程時(shí)的初心
C/C++ 游戲開發(fā)
Hello,米娜桑們,這里是君兮_,最近開始正式的步入學(xué)習(xí)游戲開發(fā)的正軌,想要通過寫博客的方式來分享自己學(xué)到的知識和經(jīng)驗(yàn),這就是開設(shè)本專欄的目的。希望這些獨(dú)立的C#小項(xiàng)目能對做游戲的你有所幫助,畢竟學(xué)會游戲開發(fā)的最好的上手方式就是自己做一款游戲!!
前言
- 今天我們接著來講勇士斗惡龍的第三部分,也是最后一部分,打敗惡龍營救公主的邏輯以及結(jié)束界面的相關(guān)邏輯
- 還是先把咱們游戲的整體流程圖放在這里
戰(zhàn)勝惡龍以后
- 有關(guān)玩家未能通過惡龍的試煉進(jìn)入退出游戲界面和營救公主成功后進(jìn)入退出游戲界面我們之后放到一塊說,首先我們先來講講如何來營救公主
營救公主
- 如果勇士足夠勇敢又有足夠的運(yùn)氣戰(zhàn)勝了惡龍,下面我們就可以去營救公主了,首先,我們這里有這樣一個(gè)條件,當(dāng)BOSS的hp還沒減為0,公主是不能出現(xiàn)在游戲畫面中的,只有BOSS的hp減為0,我們才能在游戲畫面上標(biāo)注公主的位置,同時(shí),由于我們擊敗了惡龍,應(yīng)該不再讓表示BOSS的圖標(biāo)繼續(xù)出現(xiàn)在畫面中,這些,我們在上回的游戲邏輯中都已經(jīng)用到了,但由于上回的重點(diǎn)在于玩家移動和戰(zhàn)斗邏輯,我們并沒有展開細(xì)講,下面我們通過這部分代碼來回顧一下
//hp>0時(shí),boss活著才繪制
if (bossHp > 0)
{
Console.SetCursorPosition(bossX, bossY);
Console.ForegroundColor = bossColor;
Console.Write(bossIcon);
}
#region 6 公主顯示
//公主顯示
else
{
Console.SetCursorPosition(princessX,princessY);
Console.ForegroundColor = princessColor;
Console.Write(princessIcon);
}
#endregion
//擦除BOSS
else if(bossHp<=0)
{
//去營救公主
//boss擦除
Console.SetCursorPosition(bossX, bossY);
Console.Write(" ");
isFight = false;
continue;
}
- 有關(guān)公主的初始化,只需要設(shè)置一下公主所在的位置,公主的圖標(biāo)以及圖標(biāo)的顏色就行,這里不再贅述。另外,這里是為了講解拆分出來的,實(shí)際不是一段連貫的代碼,最后我會把完整的源碼放出,大家理解這部分講的內(nèi)容即可。
如何營救公主
- 我們是一款控制臺小游戲,同時(shí)我這里只是為大家講一個(gè)大的游戲框架,因此一切從簡,這里我們來到公主身邊并按J鍵就能營救公主了(當(dāng)然,這里營救公主也可以設(shè)計(jì)的比較復(fù)雜,比如公主的位置可以是一個(gè)隨機(jī)數(shù),你每營救一次她就會移動到別的地方,營救三次才算成功等等,總之,這些地方都可以按照你自己的想法來自定義,沒有具體的要求)
case 'j':
case 'J':
//判斷是否在公主身邊
else if (((playerX == princessX && playerY == princessY - 1) || (playerX == princessX && playerY == princessY + 1) ||
(playerX == princessX - 2 && princessY == playerY) || (playerX == princessX + 2 && playerY == princessY)) && bossHp <= 0)
{
nowSceneID = 3;//修改場景選擇ID進(jìn)入退出界面
nowEndIndex = "恭喜你救出公主";//這個(gè)提示語在之后結(jié)束界面會用到
//跳出while循環(huán),回到主循環(huán)
isOver = true;
}
break;
}
if (isOver)
{
//此時(shí)的break與while配對
break;
}
- 由于這里是在while循環(huán)中,我們需要重新進(jìn)入場景選擇的switch語句中,因此定義了一個(gè)isOver來輔助我們退出循環(huán)重新選擇場景
游戲結(jié)束界面
- 進(jìn)入游戲結(jié)束界面有兩種情況,第一種情況就是營救出了公主,如上所說,第二種情況就是我們的勇士未能擊敗惡龍,此時(shí)也應(yīng)該進(jìn)入游戲結(jié)束界面
//在這判斷玩家或者怪物是否死亡,如果死了,繼續(xù)后面的流程
if(playerHp<=0)
{
//游戲結(jié)束
//游戲結(jié)束畫面
isOver = true;
nowSceneID = 3;
nowEndIndex = "很遺憾你被惡龍擊敗了";
endSay = 1;
break;
}
- 解釋一下,這里的nowEndIndex和endSay,在上面的營救公主成功后也有一個(gè)nowEndIndex,當(dāng)時(shí)定義的是“恭喜你救出公主”,我們在進(jìn)入結(jié)束界面時(shí),需要給玩家一個(gè)提示,到底是失敗了,還是成功救出公主,這個(gè)就是在結(jié)束界面打印的不同的語句用來提示玩家游戲結(jié)果的,同時(shí),這兩段提示的字?jǐn)?shù)不同,我們?yōu)榱吮WC這兩段話都能居中顯示,因此定義了一個(gè)endSay,通過它的值來判斷我們這段文字需要打印的位置。
- 而有關(guān)其他的,結(jié)束界面和開始界面是非常類似的,我們直接來看看相關(guān)的代碼
case 3:
Console.Clear();
int nowEndSelIndex = 0;
while (true)
{
bool EndQuitWhile = false;
Console.SetCursorPosition(w / 2 - 4, 5);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("GameOver");
if(endSay==1)
Console.SetCursorPosition(w / 2 - 8,7);
else
Console.SetCursorPosition(w / 2 - 6,7);
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.Write(nowEndIndex);
Console.ForegroundColor=nowEndSelIndex==0?ConsoleColor.Red:ConsoleColor.White;
Console.SetCursorPosition(w / 2 - 4, 10);
Console.Write("繼續(xù)游戲");
Console.ForegroundColor = nowEndSelIndex == 0 ? ConsoleColor.White : ConsoleColor.Red;
Console.SetCursorPosition(w / 2 - 4, 12);
Console.Write("退出游戲");
char endInput=Console.ReadKey(true).KeyChar;
switch (endInput)
{
case 'w':
case 'W':
Console.Clear();
nowEndSelIndex = 0;
break;
case 's':
case 'S':
Console.Clear();
nowEndSelIndex = 1;
break;
case 'j':
case 'J':
if (nowEndSelIndex == 1)
Environment.Exit(0);
else
{
nowSceneID = 1;
EndQuitWhile = true;
}
break;
}
if(EndQuitWhile)
{
break;
}
}
break;
}
- 當(dāng)玩家在退出游戲高亮?xí)r按下“J”鍵,直接就退出游戲了,當(dāng)玩家想要繼續(xù)游戲,我們就要把游戲場景切換到開始游戲界面,因此這里的EndQuitWhile也是用來輔助我們重新進(jìn)入游戲場景切換循環(huán)的,至于其他的,與開始界面是一模一樣的,就不多贅述了。
整體游戲的源碼
- 好了,到這里這個(gè)控制臺小游戲就講的差不多了,下面為大家提供該游戲的源碼以及游戲截圖,方便大家查閱和試玩
using System;
using System.Diagnostics;
using System.Runtime.Intrinsics.X86;
namespace 王子救公主
{
class Program
{
static void Main(string[] args)
{
//隱藏光標(biāo)
Console.CursorVisible = false;
//設(shè)置舞臺的大小
int w = 60;
int h = 40;
Console.SetWindowSize(w,h);
Console.SetBufferSize(w,h);
//當(dāng)前場景的編號
int nowSceneID = 1;
string nowEndIndex ="";
int endSay = 0;
while (true)
{
//不同的場景進(jìn)行不同的邏輯處理
switch (nowSceneID)
{
case 1:
Console.Clear();
#region 1 開始界面
Console.SetCursorPosition(w/2-5,10);
Console.WriteLine("勇士斗惡龍");
//當(dāng)前選項(xiàng)的編號
int nowSelIndex = 0;
//因?yàn)橐斎?我們可以構(gòu)造一個(gè)開始界面的死循環(huán)
//專門用來處理 開始場景相關(guān)的邏輯
while (true)
{
//用一個(gè)標(biāo)識用來退出此循環(huán)
bool isQuitWhile=false;
//顯示內(nèi)容檢測輸入
//設(shè)置光標(biāo)位置,再顯示內(nèi)容
Console.SetCursorPosition(w/2-4,12);
//根據(jù)當(dāng)前選擇的編號來決定是否變色
Console.ForegroundColor = nowSelIndex == 0 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("開始游戲");
Console.SetCursorPosition(w / 2 - 4, 14);
Console.ForegroundColor = nowSelIndex == 1 ? ConsoleColor.Red : ConsoleColor.White;
Console.Write("退出游戲");
//檢查玩家輸入的鍵并且不會在控制臺上顯示輸入內(nèi)容
char input = Console.ReadKey(true).KeyChar;
switch (input)
{
case 'W':
case 'w':
nowSelIndex = 0;
break;
case 'S':
case 's':
nowSelIndex = 1;
break;
case 'j':
case 'J':
if(nowSelIndex == 0)
{
//1.改變場景ID
nowSceneID = 2;
//2.要退出內(nèi)層循環(huán)while
isQuitWhile = true;
}
else
{
//關(guān)閉控制臺
Environment.Exit(0);
}
break;
}
if (isQuitWhile == true)
break;
}
#endregion
break;
case 2:
Console.Clear();
#region 2 紅墻
Console.ForegroundColor = ConsoleColor.Red;
//畫墻
//設(shè)為紅色
int i = 0;
//橫墻
for(i = 0; i < w;i+=2)
{
Console.SetCursorPosition(i, 0);
Console.Write('■');
Console.SetCursorPosition(i, h-1);
Console.Write('■');
Console.SetCursorPosition(i, h-9);
Console.Write('■');
}
//豎墻
int j = 0;
for (j = 0; j <h; j++)
{
Console.SetCursorPosition(0, j);
Console.Write('■');
Console.SetCursorPosition(w-2,j);
Console.Write('■');
}
#endregion
#region
#region 3 Boss屬性相關(guān)
int bossX = 24;
int bossY = 15;
int bossAtkMin = 7;
int bossAtkMax = 13;
int bossHp = 100;
string bossIcon = "●";
//申明一個(gè)顏色變量
ConsoleColor bossColor = ConsoleColor.Red;
#endregion
#region 4 玩家屬性相關(guān)
int playerX = 4;
int playerY = 5;
int playerAtkMin = 7;
int playerAtkMax = 13;
int playerHp = 100;
string playerIcon = "●";
ConsoleColor playerColor = ConsoleColor.Green;
//公主相關(guān)
int princessX = 24;
int princessY = 5;
string princessIcon = "▲";
ConsoleColor princessColor = ConsoleColor.Blue;
char playerInput;
#endregion
#region 5 玩家戰(zhàn)斗相關(guān)
bool isFight = false;
//游戲結(jié)束
bool isOver=false;
#endregion
//游戲場景的死循環(huán) 專門用來 檢測玩家的輸入相關(guān)的循環(huán)
while (true)
{
//畫出玩家
Console.SetCursorPosition(playerX, playerY);
Console.ForegroundColor= playerColor;
Console.Write(playerIcon);
//不停的輸入wasd鍵 都可以控制它移動
//hp>0時(shí),boss活著才繪制
if (bossHp > 0)
{
Console.SetCursorPosition(bossX, bossY);
Console.ForegroundColor = bossColor;
Console.Write(bossIcon);
}
#region 6 公主顯示
//公主顯示
else
{
Console.SetCursorPosition(princessX, princessY);
Console.ForegroundColor = princessColor;
Console.Write(princessIcon);
}
#endregion
Console.SetCursorPosition(playerX, playerY);
Console.ForegroundColor= playerColor;
Console.Write(playerIcon);
//玩家輸入
playerInput = Console.ReadKey(true).KeyChar;
if(isFight)
{
//如果是戰(zhàn)斗狀態(tài)
//只會處理j鍵
if(playerInput=='j'||playerInput=='J')
{
//在這判斷玩家或者怪物是否死亡,如果死了,繼續(xù)后面的流程
if(playerHp<=0)
{
//游戲結(jié)束
//游戲結(jié)束畫面
isOver = true;
nowSceneID = 3;
nowEndIndex = "很遺憾你被惡龍擊敗了";
endSay = 1;
break;
}
else if(bossHp<=0)
{
//去營救公主
//boss擦除
Console.SetCursorPosition(bossX, bossY);
Console.Write(" ");
isFight = false;
continue;
}
//玩家打怪物
Random r= new Random();
int atk = r.Next(playerAtkMin,playerAtkMax);
bossHp -= atk;
Console.ForegroundColor=ConsoleColor.Green;
Console.SetCursorPosition(2, h - 7);
Console.Write(" ");
if (bossHp <= 0)
{
//擦除
Console.SetCursorPosition(2, h - 6);
Console.Write(" ");
Console.SetCursorPosition(2, h - 7);
Console.Write(" ");
Console.SetCursorPosition(2, h - 8);
Console.Write(" ");
Console.SetCursorPosition(2, h - 8);
Console.Write("你發(fā)動了致命一擊造成了{(lán)0},恭喜你擊敗了惡龍", atk);
Console.ForegroundColor = ConsoleColor.Red;
Console.SetCursorPosition(2, h - 7);
Console.Write("快去營救公主!!!,按J鍵繼續(xù)");
}
else
{
Console.SetCursorPosition(2, h - 7);
Console.Write("勇士對惡龍?jiān)斐闪藍(lán)0}點(diǎn)傷害,此時(shí)惡龍還有{1}血", atk, bossHp);
//怪獸打玩家
atk = r.Next(bossAtkMin, bossAtkMax);
playerHp -= atk;
Console.ForegroundColor = ConsoleColor.Red;
Console.SetCursorPosition(2, h - 6);
Console.Write(" ");
//Boss打死玩家
if(playerHp<=0)
{
Console.SetCursorPosition(2, h - 6);
Console.Write("很遺憾,你未能戰(zhàn)勝惡龍");
}
else
{
Console.SetCursorPosition(2, h - 6);
Console.Write("惡龍對勇士造成了{(lán)0}點(diǎn)傷害,此時(shí)你還有{1}血", atk, playerHp);
}
}
}
}
else
{
#region 6 玩家移動相關(guān)
//擦除
Console.SetCursorPosition(playerX, playerY);
Console.Write(" ");
switch (playerInput)
{
//貫穿
case 'a':
case 'A':
playerX -= 2;
if (playerX < 2)
playerX = 2;
else if (playerX == bossX && playerY == bossY && bossHp > 0)
playerX += 2;
else if (playerX == princessX && playerY == princessY && bossHp <= 0)
playerX += 2;
break;
case 'w':
case 'W':
playerY--;
if (playerY < 1)
playerY++;
else if (playerX == bossX && playerY == bossY && bossHp > 0)
playerY++;
else if (playerX == princessX && princessY == playerY && bossHp <= 0)
playerY++;
break;
case 's':
case 'S':
playerY++;
if (playerY > h - 10)
playerY--;
else if (playerX == bossX && playerY == bossY && bossHp > 0)
playerY--;
else if (playerX == princessX && playerY == princessY && bossHp <= 0)
playerY--;
break;
case 'd':
case 'D':
playerX += 2;
if (playerX > w - 4)
playerX -= 2;
else if (playerX == bossX && playerY == bossY && bossHp > 0)
playerX -= 2;
else if (playerX == princessX && playerY == princessY && bossHp <= 0)
playerX -= 2;
break;
case 'j':
case 'J':
//開始戰(zhàn)斗
if (((playerX == bossX && playerY == bossY - 1) || (playerX == bossX && playerY == bossY + 1) ||
(playerX == bossX - 2 && playerY == bossY) || (playerX == bossX + 2 && playerY == bossY)) && bossHp > 0)
{
isFight = true;
//可以開始戰(zhàn)斗了
Console.SetCursorPosition(2, h - 8);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("你開始和惡龍戰(zhàn)斗了,按J鍵繼續(xù)");
}
//判斷是否在公主身邊
else if (((playerX == princessX && playerY == princessY - 1) || (playerX == princessX && playerY == princessY + 1) ||
(playerX == princessX - 2 && princessY == playerY) || (playerX == princessX + 2 && playerY == princessY)) && bossHp <= 0)
{
nowSceneID = 3;
nowEndIndex = "恭喜你救出公主";
//跳出while循環(huán),回到主循環(huán)
isOver = true;
}
break;
}
}
if (isOver)
{
//此時(shí)的break與while配對
break;
}
}
break;
case 3:
Console.Clear();
int nowEndSelIndex = 0;
while (true)
{
bool EndQuitWhile = false;
Console.SetCursorPosition(w / 2 - 4, 5);
Console.ForegroundColor = ConsoleColor.White;
Console.Write("GameOver");
if(endSay==1)
Console.SetCursorPosition(w / 2 - 8,7);
else
Console.SetCursorPosition(w / 2 - 6,7);
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.Write(nowEndIndex);
Console.ForegroundColor=nowEndSelIndex==0?ConsoleColor.Red:ConsoleColor.White;
Console.SetCursorPosition(w / 2 - 4, 10);
Console.Write("繼續(xù)游戲");
Console.ForegroundColor = nowEndSelIndex == 0 ? ConsoleColor.White : ConsoleColor.Red;
Console.SetCursorPosition(w / 2 - 4, 12);
Console.Write("退出游戲");
char endInput=Console.ReadKey(true).KeyChar;
switch (endInput)
{
case 'w':
case 'W':
Console.Clear();
nowEndSelIndex = 0;
break;
case 's':
case 'S':
Console.Clear();
nowEndSelIndex = 1;
break;
case 'j':
case 'J':
if (nowEndSelIndex == 1)
Environment.Exit(0);
else
{
nowSceneID = 1;
EndQuitWhile = true;
}
break;
}
if(EndQuitWhile)
{
break;
}
}
break;
}
}
}
}
#endregion
}
#endregion
總結(jié)
- 好啦,到這里我們第一個(gè)C#實(shí)戰(zhàn)游戲就結(jié)束了,之后還會繼續(xù)更新別的游戲的教學(xué)的,敬請期待??!
- 為了防止大家找不到之前的內(nèi)容,在這里附一下之前教學(xué)的鏈接
【C#項(xiàng)目實(shí)戰(zhàn)】控制臺游戲 勇士斗惡龍(2)——游戲場景的設(shè)置以及玩家戰(zhàn)斗邏輯
【C#項(xiàng)目實(shí)戰(zhàn)】控制臺游戲勇士斗惡龍(1)——游戲初始設(shè)置以及開始界面
新人博主創(chuàng)作不易,如果感覺文章內(nèi)容對你有所幫助的話不妨三連一下再走唄。你們的支持就是我更新的動力?。?!
**(可莉請求你們?nèi)B支持一下博主!?。↑c(diǎn)擊下方評論點(diǎn)贊收藏幫幫可莉吧)** 文章來源:http://www.zghlxwxcb.cn/news/detail-708445.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-708445.html
到了這里,關(guān)于【C#實(shí)戰(zhàn)】控制臺游戲 勇士斗惡龍(3)——營救公主以及結(jié)束界面的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!