海军战舰游戏






1.11/5 (3投票s)
2005年7月27日
4分钟阅读

48294

1088
一个客户端-服务器海军战棋游戏。
引言
一个使用 sockets 和 IO 的客户端-服务器应用程序,用于玩海军战棋。
在您开始阅读之前
本文是分为两部分的系列文章的第一部分。这第一部分介绍了如何绘制海军战棋的战场。为了更好地理解本文,您应该了解一点 socket 连接(对于第 2 部分)、命名空间 System.Drawing
和 IO
(对于第 2 部分也是)。如果您不知道我在说什么,我建议您阅读 Deitel 的书 “C# How to Program”。但是如果您没有钱,MSDN 中的文档是一个很大的帮助。最重要的是您拥有这本书并在 MSDN 中浏览。
一个简单的(?) C# 游戏
我想写一个简单的 C# 游戏,我想:“海军战棋是个好主意”。但是当我编码时,现实并非如此美好。我多次用头撞击键盘,主要是当我想要找到一种方法在两个窗体中的正确位置绘制“X”坐标时,但应用程序已经完成了。
绘制战场
好吧,现在开始吧。首先我需要绘制一个战场和坐标(当然,用字母和数字表示)。我该怎么做呢?我创建了一个名为 BattleField
的类。
这些是该方法用来在我的类中绘制战场的变量,请注意我将它们的值放在这里
private int iCol = 0, iRow = 0, iX = 30, iY = 80;
private const int m_iWidth = 50, m_iHeight = 50;
主要方法是这个
private void Draw()
{
string abc = "12345abcde";
string[,] sCoordinates = new string[2,5];
for(int i = 0 ; i <= 9 ; i++)
{
//populate the array
if(i == 5)
{
iCol = 0;
iRow += 1;
}
sCoordinates[iRow,iCol] = abc.Substring(0,1);
abc = abc.Remove(0,1);
iCol += 1;
}
float fLocal = (float)60;
float fX = (float)iX;
float fY = (float)iY;
Font font = new Font("Arial", 10);
SolidBrush sBlack = new SolidBrush(Color.Black);
Point pLocation = new Point(iX, iY);
PointF pfLocation = new PointF(fX, fY);
Pen pen = new Pen(new SolidBrush(Color.Black), 3);
//Setting the row and column to origin
iRow = 0;
iCol = 0;
pfLocation.X += 25;
pfLocation.Y = fLocal;
for(int iCount = 0 ; iCount <= 9 ; iCount++)
{
//put numbers
if(iCount <= 4)
{
m_FormGraphs.DrawString(sCoordinates[iRow,
iCol].ToString(),font, sBlack, pfLocation);
pfLocation.X += 50;
}
//put letters
else
{
if(iCount == 5)
{
pfLocation.X = 10;
pfLocation.Y += 40;
iRow +=1;
iCol = 0;
}
m_FormGraphs.DrawString(sCoordinates[iRow,
iCol].ToString(),font, sBlack, pfLocation);
pfLocation.Y += 50;
}
iCol += 1;
}
//to draw 5 squares in a row
for(int iOtherCount = 0; iOtherCount < 5 ; iOtherCount++)
{
//to draw 1 square in each column
for(int j = 0 ; j < 5 ; j++)
{
m_FormGraphs.DrawRectangle(pen, pLocation.X,
pLocation.Y, m_iWidth, m_iHeight);
pLocation.X += 50;
}
pLocation.X = iX;
pLocation.Y += 50;
}
}
绘制坐标
在我的 Draw
方法中,创建了一个带有坐标 “12345abcde” 的字符串和一个 2x5 的矩阵。该数组在一个循环中填充。下面有三个 float
变量、一个 Font
和一个 SolidBrush
以及两个 Point
对象,其中一个是名为 pfLocation
的 PointF
。现在,如何使用它们来绘制战场?如果您注意到下面,变量 iRow
和 iCol
设置为 0,值 25 被添加到 pfLocation.X
属性,并且 pfLocation.Y
被分配为 fLocal
变量中包含的值。为什么?我需要将字母放在前 5 个方格的顶部,并与它们的中心对齐,所以我将 25 加到我的 pfLocation.X
中并绘制我的第一个数字。之后我继续求和,现在的值是 50,因为我需要去下一个方格的一半并绘制下一个数字。字母的过程相同,但它们以垂直位置绘制,但这次 pfLocation.X
首先被赋值为 10,并且 pfLocation.Y
与 40 相加。这仅用于在 PointF
的 pfLocation
对象中定义坐标。
绘制方格
现在是解释方格的时候了。看看这部分代码
for(int iOtherCount = 0; iOtherCount < 5 ; iOtherCount++)
{
//to draw 1 square in each column
for(int j = 0 ; j < 5 ; j++)
{
m_FormGraphs.DrawRectangle(pen, pLocation.X,
pLocation.Y, m_iWidth, m_iHeight);
pLocation.X += 50;
}
pLocation.X = iX;
pLocation.Y += 50;
}
还有另一个用于方格的循环,它使用 Point
对象 pLocation
。我使用的 DrawRectangle
方法有五个参数:一个 Pen
对象、X 坐标、Y 坐标、宽度和高度。为了在我的窗体中每个迭代中填充一条假想线,我在 X 坐标中求和 50,这个过程继续填充窗体中的 5 条假想线。我使用带有整数的 Point
对象来定义绘制方格的点。您可以使用 PointF
对象,但它仅适用于浮点数。
谢谢
伙计们,本系列的第一部分已经结束。在下一篇文章中,我将解释如何在应用程序中使用 socket 连接以及如何在战场上绘制 “X”。如果您有任何建议、疑问和批评,请发送电子邮件给我。感谢您的耐心。我希望您喜欢这篇文章!第二部分即将推出。我要感谢 Jesse Liberty 的书籍,Deitel 家族的 C# HTP,Daniel Turini 的文章 “我想成为一名优秀的程序员……怎么做?” [在 Daniel Turini 的巢穴中查看这篇文章],当然还有 MSDN,您和 Code Project。
文章历史
- 2005-12-07 - 文章第一部分的开始和结束。
- 2005-07-26 - 完整的软件包已发送到 The Code Project。