C#—飛行棋超全總結(jié)(全注釋版)
目錄
1.首先了解C#飛行棋的基本功能 飛行棋是一款非常簡單的雙人游戲,有點類似大富翁的玩法,別問我為什么像大富翁,問就是類似的我只玩過大富翁,玩家A、B通過擲骰子來在地圖上行走,如果走到關(guān)卡位置需要執(zhí)行相應(yīng)操作,比如交換位置、或者前進十步等,當某個玩家走到終點后,游戲結(jié)束,先到達終點的玩家獲得勝利。 2.實現(xiàn)飛行棋需要哪些準備 根據(jù)上述對飛行棋基本功能的描述,我們可以擇出幾個關(guān)鍵詞:雙人、擲骰子、地圖、位置、關(guān)卡、操作。如何用最簡單的代碼來實現(xiàn)這些看起來非常復(fù)雜的功能呢,最最重要的就是方法的使用。我們可以把每一個功能定義成為一個方法,在主函數(shù)中來調(diào)用,可以大大減少代碼量。所以我們在飛行棋的設(shè)計中定義了如下幾個方法,每個方法的作用和參數(shù)如下表所示:
方法名
參數(shù)
返回值類型
作用
()
無
無
顯示游戲頭
()
pos
畫標識和玩家
()
msg,min,max
int
讀取用戶輸入的值
()
無
擲骰子
()
無
無
初始化地圖
ight()
left,
無
畫地圖橫行
()
無
無
畫地圖
win()
無
無
提示用戶勝利
3.顯示游戲頭的()方法 該方法主要用來在程序加載時顯示出游戲頭,主要用到了.()方法。具體代碼和注釋如下:
public static void ShowUI()//顯示游戲頭
{
Console.WriteLine("***********************************************");
Console.WriteLine("* *");
Console.WriteLine("* 終極騎士飛行棋 *");
Console.WriteLine("* *");
Console.WriteLine("***********************************************");
}
4.畫標識和玩家的()方法 該方法主要用在畫完地圖后對地圖上玩家和標識顏色進行補充,具體代碼和注釋如下:
public static string DrawStringMap(int pos)//定義一個畫地圖的方法
{
string temp = "";//定義一個字符串變量作為返回值
if (PlayerPos[0] == PlayerPos[1] && PlayerPos[0] == pos)//如果玩家A和玩家B在一起并且在地圖上就畫<>
{
Console.ForegroundColor = ConsoleColor.Yellow;//圖標顏色為黃色
temp="<>";
}
else if (PlayerPos[0] == pos )//如果玩家A在地圖上就畫A
{
temp="A";
}
else if (PlayerPos[1] == pos )//如果玩家B在地圖上就畫B
{
temp="B";
}
else
{
switch (Map[pos])//如果玩家A和玩家B不在一起也不在這個坐標上就畫該顯示的地圖圖標,根據(jù)索引值判斷該畫哪個圖案
{
case 0:Console.ForegroundColor = ConsoleColor.Gray;//如果索引值為0,那么就畫灰色的□
temp ="□";
break;//跳出switch case
case 1:Console.ForegroundColor = ConsoleColor.Red;//如果索引值為1,那么就畫紅色的⊙
temp ="⊙";
break;//跳出switch case
case 2:Console.ForegroundColor = ConsoleColor.Blue;//如果索引值為2,那么就畫藍色的☆
temp ="☆";
break;//跳出switch case
case 3:Console.ForegroundColor = ConsoleColor.Green;//如果索引值為3,那么就畫綠色的▲
temp ="▲";
break;//跳出switch case
case 4:Console.ForegroundColor = ConsoleColor.Magenta;//如果索引值為4,那么就畫紫紅色的卐
temp ="卐";
break;//跳出switch case
}// end switch
}// end if
return temp;//返回temp的值
}
5.讀取用戶輸入值的()方法 該方法用來讀取用戶在位于幸運輪盤關(guān)卡時選擇的值,具體代碼和注釋如下:
public static int ReadInt(string msg,int min,int max)//定義一個方法,讀取用戶輸入的值
{
while (true)
{
try//進入try catch語句
{
Console.WriteLine(msg);//在屏幕上輸出調(diào)用該方法的語句要輸出的內(nèi)容
int number = Convert.ToInt32(Console.ReadLine());//讀取用戶輸入的內(nèi)容,并強制轉(zhuǎn)換為整型,定義一個整型變量number來接受轉(zhuǎn)換后的值
if (number >=min && number <=max)//如果number的值處于min和max之間,那么返回number
{
return number;
}
else//證明number的值沒有在min和max之間
{
Console.WriteLine("你的輸入不合法,只能輸入{0}到{1}之間的數(shù)字!", min, max);//輸出提示
continue;
}
}
catch//如果強制轉(zhuǎn)換發(fā)生異常,進入catch語句
{
Console.WriteLine("輸入有誤,請重新輸入!");//提示輸入有誤,請重新輸入
}
}
}
6.擲骰子的()方法 該方法主要用來生成一個隨機數(shù),玩家根據(jù)擲出的數(shù)字移動,并產(chǎn)生相應(yīng)移動位置上的操作。具體代碼和注釋如下:
public static void RowTouZi(int playerPos)//定義一個擲骰子的方法,有一個整型參數(shù)playPos,無返回值
{
Random r = new Random();//實例化r為一個隨機數(shù)對象
int num = r.Next(1, 7);//返回上下界之間的隨機數(shù),并且隨機數(shù)可取下界值,但不能取上界值,同時定義一個整型變量num來接受隨機數(shù)
string msg = "";//定義一個字符串變量msg,并賦初值為空格
Console.WriteLine("{0}按任意鍵開始擲骰子", PlayerNames[playerPos]);//輸出某玩家的姓名按任意鍵開始擲骰子
Console.ReadKey(true);//當玩家按下任意鍵后繼續(xù)
Console.WriteLine("{0}擲出了{1}", PlayerNames[playerPos],num);//輸出提示玩家誰誰誰擲出了某個數(shù)字
Console.WriteLine("{0}按任意鍵開始行動......", PlayerNames[playerPos ]);//輸出提示誰誰誰可以按任意鍵開始行動
Console.ReadKey(true);//當玩家按下任意鍵后繼續(xù)
PlayerPos[playerPos] += num;//上述玩家的新位置值等于原位置加上num的值,即擲出來的值
CheckPos();//調(diào)用CheckPos()方法,確保玩家位置還在地圖上
if (PlayerPos[playerPos]==PlayerPos[1-playerPos ])//判斷玩家移動后的位置是否與另一位玩家位置相同,若相同,則繼續(xù)
{
msg = string.Format("玩家{0}踩到了玩家{1},玩家{2}退6格", PlayerNames[playerPos], PlayerNames[1 - playerPos], PlayerNames[1 - playerPos]);//走到這里,證明兩個玩家位置相同,即符合踩一腳規(guī)則,將字符串"玩家某踩到了玩家某,玩家某退6格"這個字符串賦給msg
PlayerPos[1 - playerPos] -= 6;//被踩玩家的位置值-6
CheckPos();//調(diào)用CheckPos()方法,確保被踩玩家位置還在地圖上
}
else//玩家移動后位置與另一位玩家位置不同,游戲繼續(xù)
{
switch (Map[PlayerPos[playerPos]])//判斷玩家此時的位置是否處在關(guān)卡位置
{
case 0: //索引值為0,代表玩家沒有位于關(guān)卡位置
msg = "行動完了"; //msg的值為行動完了,即在屏幕輸出行動完了
break;//跳出switch
case 1://索引值為1,代表玩家位于幸運輪盤位置
msg = string.Format("{0}走到了幸運輪盤,請選擇1——交換位置,2——轟炸對方", PlayerNames[playerPos]);//輸出提示
int number = ReadInt(msg, 1, 2);//調(diào)用ReadInt方法,讀取用戶輸入的值,并定義一個整型變量number來接受該方法的返回值
if (number == 1)//如果返回值為1
{
//下面四行代碼的功能就是來交換兩位玩家的位置,原理就是定義一個第三方變量
int temp = 0;//定義一個整型變量temp,并賦初值為0
temp = PlayerPos[playerPos];//將當前玩家的位置賦給temp
PlayerPos[playerPos] = PlayerPos[1 - playerPos];//將另一位玩家的位置賦給當前玩家
PlayerPos[1 - playerPos] = temp;//將temp的值賦給另一位玩家
msg = string.Format("玩家{0}選擇了與玩家{1}交換位置", PlayerNames[playerPos], PlayerNames[1 - playerPos]);//輸出提示
}
else//返回值不為1,即代表當前玩家選擇了轟炸對方
{
PlayerPos[1 - playerPos] = 0;//另一位玩家的位置為0
msg = string.Format("玩家{0}選擇轟炸玩家{1}", PlayerNames[playerPos], PlayerNames[1 - playerPos]);//輸出提示
}
break;//跳出switch
case 2://索引值為2,代表玩家處于地雷位置
msg = "恭喜你,能踩到地雷,百年不遇,退6格";//輸出提示
PlayerPos[playerPos] -= 6;//當前玩家位置-6
CheckPos();//調(diào)用CheckPos()方法,確保被踩玩家位置還在地圖上
break;//跳出switch
case 3://索引值為3,代表玩家處于暫停位置
msg = "踩到暫停了";//輸出提示
flag[playerPos] = true;//該玩家暫停狀態(tài)的值變?yōu)閠rue,代表處于暫停狀態(tài)
break;//跳出switch
case 4://索引值為4,代表玩家處于時空隧道位置
msg="恭喜你,這個猥瑣家伙居然穿越了10步";//輸出提示
PlayerPos[playerPos] += 10;//當前玩家位置+10
CheckPos();// 調(diào)用CheckPos()方法,確保被踩玩家位置還在地圖上
break;//跳出switch
}
}
Console.Clear();//清除屏幕
DrawMap();//調(diào)用畫地圖方法
Console.WriteLine(msg);//輸出提示
}
7.初始化地圖的()方法 該方法主要用在界面加載顯示游戲頭后,在玩家輸入姓名之前初始化地圖,主要代碼和注釋如下:
public static void InitMap()//定義一個方法初始化地圖
{
int[] luckturn = { 6, 23, 40, 55, 69, 83 };//定義幸運輪盤數(shù)組并賦初值,代表地圖上幸運輪盤所處的位置
int[] landMine = { 5, 13, 17, 33, 38, 50, 64, 80, 94 };//定義地雷數(shù)組并賦初值,代表地圖上地雷所處的位置
int[] pause = { 9, 27, 60, 93 };//定義暫停數(shù)組并賦初值,代表地圖上暫停所處的位置
int[] timeTunnel = { 20, 25, 45, 63, 72, 88, 90 };//定義時空隧道數(shù)組并賦初值,代表地圖上時空隧道所處的位置
for (int i = 0; i < luckturn.Length; i++)
{
Map[luckturn[i]] = 1;//改變Map數(shù)組里對應(yīng)幸運輪盤位置的索引對應(yīng)的值為1
}
for (int i = 0; i < landMine.Length; i++)
{
Map[landMine [i]] = 2;//改變Map數(shù)組里對應(yīng)地雷位置的索引對應(yīng)的值為2
}
for (int i = 0; i < pause.Length; i++)
{
Map[pause [i]] = 3;//改變Map數(shù)組里對應(yīng)暫停位置的索引對應(yīng)的值為3
}
for (int i = 0; i < timeTunnel.Length; i++)
{
Map[timeTunnel[i]] = 4;//改變Map數(shù)組里對應(yīng)時空隧道位置的索引對應(yīng)的值為4
}
}
8.畫地圖上橫行的方法ight() 該方法主要用來畫地圖上的第一橫行和第三橫行,具體代碼和注釋如下:
public static void DrawStringMapLeftToRight(int left, int right)//定義一個畫橫行的方法,有兩個整型參數(shù),left和right
{
for (int i = left; i <= right; i++)//在left和right之間開始畫地圖
{
Console.Write(DrawStringMap(i));//調(diào)用畫地圖的方法,并在屏幕上輸出,且該畫地圖無需換行
}
}
9.畫地圖的()方法 該方法主要用于畫出地圖,主要代碼和注釋如下所示:
public static void DrawMap()//定義畫地圖的方法
{
Console.WriteLine("圖例:幸運輪盤:⊙ 地雷:☆ 暫停:▲ 時空隧道:卐 ");//輸出在屏幕上
DrawStringMapLeftToRight(0, 29);//調(diào)用畫橫行的方法畫第一橫行,參數(shù)為0和29
//畫地圖第一豎行
for (int i = 30; i <= 34; i++)
{
for (int j = 0; j <= 28; j++)//在第二豎行前面空余部分畫空格
{
Console.Write(" ");
}
Console.WriteLine(DrawStringMap(i));//調(diào)用畫地圖的方法,并在屏幕上輸出
}
//畫地圖第二橫行
for (int i=64;i>=35;i--)
{
Console.Write(DrawStringMap(i));//調(diào)用畫地圖的方法,并在屏幕上輸出,且該畫地圖無需換行
}
Console.WriteLine();//換行繼續(xù)畫
//畫第二豎行
for (int i=65;i<=69;i++)
{
Console.WriteLine(DrawStringMap(i)); //調(diào)用畫地圖的方法,并在屏幕上輸出
}
DrawStringMapLeftToRight(70, 99);//調(diào)用畫橫行的方法畫第三橫行,參數(shù)為70和99
Console.WriteLine();//輸出在屏幕上
}
10.表示勝利的Win()方法 該方法主要用在某一玩家到達終點后,提示勝利界面,主要代碼和注釋如下所示:(粘貼過來位置變了,但是無傷大雅,這個可直接復(fù)制老師的源碼)
public static void Win()//定義一個勝利的方法,用來在玩家勝利時提示勝利界面
{
Console.ForegroundColor = ConsoleColor.Red;//將輸出內(nèi)容的顏色改為紅色
Console.WriteLine(" ◆ ");
Console.WriteLine(" ■ ◆ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ◆■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ◆ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ■■■■■■■ ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ■ ●■● ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■ ■ ■■■■■■ ● ■ ● ■ ■ ■");
Console.WriteLine(" ■■■■ ■ ● ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ■ ■");
Console.WriteLine(" ■ ■ ■ ■ ● ■ ");
Console.WriteLine(" ■ ■■ ■■■■■■ ■ ● ●");
Console.ResetColor();
}
聲明:本站所有文章資源內(nèi)容,如無特殊說明或標注,均為采集網(wǎng)絡(luò)資源。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系本站刪除。