C#实现飞行棋(Winform)攻略
基本流程
飞行棋是一个简单的棋类游戏,玩家通过掷骰子前进,最先将所有棋子走完的玩家获胜。实现游戏的基本流程如下:
- 新建WinForm窗体,添加控件
- 点击“开始”按钮,初始化游戏数据
- 玩家掷骰子,随机移动棋子
- 判断是否有棋子达到终点,如有则获胜
- 切换到下一个玩家,返回步骤3
代码实现
窗体设计
使用Visual Studio创建WinForm应用程序,设置窗体大小为400*400,添加以下控件:
- Label x5:标题、玩家1、玩家2、骰子、提示信息
- PictureBox x4:飞机图标1、飞机图标2、骰子图标、背景图
- Button x1:开始按钮
为控件设置相应的名称、位置和大小,设计好界面布局。
初始化游戏数据
在Form1类中添加以下代码,初始化游戏数据:
// 定义变量
int[] playerPos = new int[2] { 0, 0 }; // 玩家初始位置
int playerTurn; // 当前玩家
int diceNumber; // 骰子点数
int[,] map = new int[96, 96]; // 地图数据
PictureBox[] playerIcons = new PictureBox[2]; // 飞机图标
// 初始化地图
private void InitMap()
{
for (int i = 0; i < 96; i++)
{
for (int j = 0; j < 96; j++)
{
if (i % 6 == 0 || j % 6 == 0)
{
map[i, j] = 1;
}
}
}
// 目标点位置为地图第42行第14、16、18、20列
map[42,14] = map[42,16] = map[42,18] = map[42,20] = 2;
}
// 初始化游戏数据
private void InitGame()
{
playerTurn = 1;
diceNumber = 0;
playerIcons[0] = pictureBox1;
playerIcons[1] = pictureBox2;
InitMap();
UpdatePlayerInfo(); // 更新玩家信息
UpdateMap(); // 更新地图显示
}
在InitMap函数中,根据地图的大小和位置规则,初始化了96*96的地图数据,用数字1表示棋盘格,数字2表示目标点。在InitGame函数中,初始化了玩家位置、当前玩家、骰子点数等游戏数据。
移动棋子
在点击“掷骰子”按钮时,随机生成1~6的数字,根据骰子点数移动当前玩家的棋子,代码如下:
private void MovePlayer(int steps)
{
int newPos = playerPos[playerTurn - 1] + steps;
if (newPos > 99)
{
newPos = 99 - (newPos - 99); // 超过终点,回退
}
playerPos[playerTurn - 1] = newPos; // 更新玩家位置
UpdatePlayerInfo(); // 更新玩家信息
UpdateMap(); // 更新地图显示
}
根据参数steps计算出新的位置newPos,如果超过终点,则回退到终点。更新玩家位置后,调用UpdatePlayerInfo和UpdateMap函数更新玩家信息和地图显示。
判断胜利
在移动棋子后,判断当前玩家是否获胜。如果棋子位置等于终点位置,即为获胜。代码如下:
private bool CheckWinner()
{
if (playerPos[playerTurn - 1] == 95)
{
timer1.Enabled = false; // 停止计时器
MessageBox.Show("恭喜,玩家" + playerTurn + "获胜!");
return true;
}
return false;
}
如果有玩家获胜,则弹出提示框,停止计时器。
其他函数
还需实现一些其他函数,如更改提示信息、更新玩家信息、更新地图显示等。以下是部分示例代码:
// 更改提示信息
private void UpdateTips(string str)
{
labelTips.Text = str;
}
// 更新玩家信息
private void UpdatePlayerInfo()
{
labelPlayer1.Text = "玩家1:" + playerPos[0];
labelPlayer2.Text = "玩家2:" + playerPos[1];
playerIcons[playerTurn - 1].Location = new Point(29 + playerPos[playerTurn - 1] % 10 * 40,
29 + playerPos[playerTurn - 1] / 10 * 40);
}
// 更新地图显示
private void UpdateMap()
{
for (int i = 0; i < 96; i++)
{
for (int j = 0; j < 96; j++)
{
if (map[i, j] == 1) // 棋盘格
{
bg.Controls[i * 96 + j].BackColor = Color.White;
}
else if (map[i, j] == 2) // 目标点
{
bg.Controls[i * 96 + j].BackColor = Color.YellowGreen;
}
}
}
}
示范程序
以下是两个程序示例,一个是实现控制台版本的飞行棋游戏,一个是实现基于Winform的飞行棋游戏。
控制台版
using System;
namespace ConsoleApp1
{
class Program
{
// 定义变量
static int[] playerPos = new int[2];
static int playerTurn; // 当前玩家
static Random random = new Random();
static void Main(string[] args)
{
InitGame();
while (true)
{
Console.WriteLine("轮到玩家" + playerTurn + "掷骰子,按下任意键开始...");
Console.ReadKey();
int diceNumber = random.Next(1, 7);
Console.WriteLine("玩家" + playerTurn + "掷出了" + diceNumber + "点");
MovePlayer(diceNumber);
if (CheckWinner())
{
break;
}
playerTurn = (playerTurn + 1) % 2 + 1; // 切换到下一个玩家
}
Console.WriteLine("游戏结束");
Console.ReadKey();
}
// 初始化游戏数据
static void InitGame()
{
playerPos[0] = 0;
playerPos[1] = 0;
playerTurn = 1;
}
// 移动棋子
static void MovePlayer(int steps)
{
playerPos[playerTurn - 1] += steps;
if (playerPos[playerTurn - 1] > 99)
{
playerPos[playerTurn - 1] = 99 - (playerPos[playerTurn - 1] - 99); // 超过终点,回退
}
Console.WriteLine("玩家" + playerTurn + "移动到了" + playerPos[playerTurn - 1]);
}
// 判断胜利
static bool CheckWinner()
{
if (playerPos[playerTurn - 1] == 95)
{
Console.WriteLine("恭喜,玩家" + playerTurn + "获胜!");
return true;
}
return false;
}
}
}
Winform版
详细代码可参考前文中提供的函数与代码示例。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
// 定义变量
int[] playerPos = new int[2] { 0, 0 };
int playerTurn;
int diceNumber;
int[,] map = new int[96, 96];
PictureBox[] playerIcons = new PictureBox[2];
public Form1()
{
InitializeComponent();
InitGame(); // 初始化游戏数据
}
private void buttonStart_Click(object sender, EventArgs e)
{
diceNumber = new Random().Next(1, 7); // 随机生成骰子点数
MovePlayer(diceNumber); // 移动棋子
if (!CheckWinner()) // 判断是否获胜
{
playerTurn = playerTurn % 2 + 1; // 切换到下一个玩家
}
}
private void InitMap()
{
for (int i = 0; i < 96; i++)
{
for (int j = 0; j < 96; j++)
{
if (i % 6 == 0 || j % 6 == 0)
{
map[i, j] = 1;
}
}
}
map[42,14] = map[42,16] = map[42,18] = map[42,20] = 2;
}
private void InitGame()
{
playerTurn = 1;
diceNumber = 0;
playerIcons[0] = pictureBox1;
playerIcons[1] = pictureBox2;
InitMap();
UpdatePlayerInfo();
UpdateMap();
}
private void MovePlayer(int steps)
{
int newPos = playerPos[playerTurn - 1] + steps;
if (newPos > 99)
{
newPos = 99 - (newPos - 99); // 超过终点,回退
}
playerPos[playerTurn - 1] = newPos;
UpdatePlayerInfo();
UpdateMap();
}
private bool CheckWinner()
{
if (playerPos[playerTurn - 1] == 95)
{
timer1.Enabled = false; // 停止计时器
MessageBox.Show("恭喜,玩家" + playerTurn + "获胜!");
return true;
}
return false;
}
private void UpdateTips(string str)
{
labelTips.Text = str;
}
private void UpdatePlayerInfo()
{
labelPlayer1.Text = "玩家1:" + playerPos[0];
labelPlayer2.Text = "玩家2:" + playerPos[1];
playerIcons[playerTurn - 1].Location = new Point(29 + playerPos[playerTurn - 1] % 10 * 40,
29 + playerPos[playerTurn - 1] / 10 * 40);
}
private void UpdateMap()
{
for (int i = 0; i < 96; i++)
{
for (int j = 0; j < 96; j++)
{
if (map[i, j] == 1) // 棋盘格
{
bg.Controls[i * 96 + j].BackColor = Color.White;
}
else if (map[i, j] == 2) // 目标点
{
bg.Controls[i * 96 + j].BackColor = Color.YellowGreen;
}
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
// 设置背景图
Bitmap bgimg = new Bitmap(WindowsFormsApp1.Properties.Resources.bg, 96 * 40, 96 * 40);
PictureBox bgpb = new PictureBox();
bgpb.Image = bgimg;
bgpb.Location = new Point(0, 0);
bgpb.Size = new Size(bgimg.Width, bgimg.Height);
bg.Controls.Add(bgpb);
bg.Size = new Size(bgimg.Width, bgimg.Height);
UpdatePlayerInfo();
}
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现飞行棋(Winform) - Python技术站