65.9K
CodeProject 正在变化。 阅读更多。
Home

海军战舰游戏

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.11/5 (3投票s)

2005年7月27日

4分钟阅读

viewsIcon

48294

downloadIcon

1088

一个客户端-服务器海军战棋游戏。

Server and client apps

引言

一个使用 sockets 和 IO 的客户端-服务器应用程序,用于玩海军战棋。

在您开始阅读之前

本文是分为两部分的系列文章的第一部分。这第一部分介绍了如何绘制海军战棋的战场。为了更好地理解本文,您应该了解一点 socket 连接(对于第 2 部分)、命名空间 System.DrawingIO(对于第 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 对象,其中一个是名为 pfLocationPointF。现在,如何使用它们来绘制战场?如果您注意到下面,变量 iRowiCol 设置为 0,值 25 被添加到 pfLocation.X 属性,并且 pfLocation.Y 被分配为 fLocal 变量中包含的值。为什么?我需要将字母放在前 5 个方格的顶部,并与它们的中心对齐,所以我将 25 加到我的 pfLocation.X 中并绘制我的第一个数字。之后我继续求和,现在的值是 50,因为我需要去下一个方格的一半并绘制下一个数字。字母的过程相同,但它们以垂直位置绘制,但这次 pfLocation.X 首先被赋值为 10,并且 pfLocation.Y 与 40 相加。这仅用于在 PointFpfLocation 对象中定义坐标。

绘制方格

现在是解释方格的时候了。看看这部分代码

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。
© . All rights reserved.