C#实现简单的井字游戏实例

C#实现简单的井字游戏实例攻略

简介

本文将介绍如何使用 C# 编程语言实现简单的井字游戏,并提供两个示例来帮助读者更好地理解。井字游戏是一种非常经典的零和博弈,可以用于人工智能的训练,也可以作为我们在学习开发游戏中的一个练习项目。

步骤

步骤1:创建新项目

首先,在 Visual Studio 中创建一个新的控制台应用程序项目。

步骤2:设置游戏板

我们需要设置好游戏界面,即井字棋的棋盘。这里我们把棋盘定义为一个 3x3 的数组,用“1”表示 X,“2”表示 O。

int[,] board = {
   {0, 0, 0}, 
   {0, 0, 0}, 
   {0, 0, 0}
};

步骤3:设置玩家

接下来,我们需要设置两个玩家,一个用 X 表示,一个用 O 表示。这里我们简单地使用 1 和 2 来表示 X 和 O。

int player = 1;

步骤4:显示游戏界面

在控制台中,我们可以通过以下代码来显示游戏棋盘界面。

Console.WriteLine("  0 1 2\n");
for (int i = 0; i < 3; i++)
{
   Console.Write(i + " ");
   for (int j = 0; j < 3; j++)
   {
      if (board[i,j] == 0) 
         Console.Write("- ");
      else if (board[i,j] == 1) 
         Console.Write("X ");
      else 
         Console.Write("O ");
   }
   Console.WriteLine();
}

步骤5:输入玩家落子坐标

我们还需要编写代码接受玩家的输入,并根据输入的坐标进行下棋。

Console.Write("Player " + player + ", enter x coordinate: ");
int x = Convert.ToInt32(Console.ReadLine());
Console.Write("Player " + player + ", enter y coordinate: ");
int y = Convert.ToInt32(Console.ReadLine());

if (board[x,y] == 0)
{
   board[x,y] = player;
}
else
{
   Console.WriteLine("This position is already occupied!");
}

步骤6:判断胜负

每次下棋后,我们需要判断是否已经有玩家获胜。下面是判断获胜的代码示例。

bool winner = false;
int[,] winStates = {
   {0, 1, 2},
   {3, 4, 5},
   {6, 7, 8},
   {0, 3, 6},
   {1, 4, 7},
   {2, 5, 8},
   {0, 4, 8},
   {2, 4, 6}
};

for (int i = 0; i < 8; i++)
{
   int a = winStates[i,0];
   int b = winStates[i,1];
   int c = winStates[i,2];

   if (board[a/3,a%3] != 0 &&
       board[a/3,a%3] == board[b/3,b%3] &&
       board[b/3,b%3] == board[c/3,c%3])
   {
      Console.WriteLine("Player " + player + " wins!");
      winner = true;
      break;
   }
}

if (!winner)
{
   player = (player == 1) ? 2 : 1;

   bool draw = true;
   for (int i = 0; i < 3; i++)
   {
      for (int j = 0; j < 3; j++)
      {
         if (board[i,j] == 0)
         {
            draw = false;
            break;
         }
      }
      if (!draw) break;
   }

   if (draw)
   {
      Console.WriteLine("It's a draw!");
   }
   else
   {
      Console.WriteLine("No winner yet. Next turn.");
   }
}

示例1:两个人玩

下面是一个示例,展示了两个人如何玩井字游戏。

int[,] board = {
   {0, 0, 0}, 
   {0, 0, 0}, 
   {0, 0, 0}
};
int player = 1;
bool winner = false;
bool draw = false;

Console.WriteLine("Welcome to Tic-Tac-Toe! Here's the game board:\n");

while (!winner && !draw)
{
   Console.WriteLine("Player " + player + "'s turn:");

   Console.WriteLine("  0 1 2\n");
   for (int i = 0; i < 3; i++)
   {
      Console.Write(i + " ");
      for (int j = 0; j < 3; j++)
      {
         if (board[i,j] == 0) 
            Console.Write("- ");
         else if (board[i,j] == 1) 
            Console.Write("X ");
         else 
            Console.Write("O ");
      }
      Console.WriteLine();
   }

   Console.Write("Enter x coordinate: ");
   int x = Convert.ToInt32(Console.ReadLine());

   Console.Write("Enter y coordinate: ");
   int y = Convert.ToInt32(Console.ReadLine());

   if (board[x,y] == 0)
   {
      board[x,y] = player;
      player = (player == 1) ? 2 : 1;
   }
   else
   {
      Console.WriteLine("This position is already occupied! Try again.");
   }

   for (int i = 0; i < 8; i++)
   {
      int a = winStates[i,0];
      int b = winStates[i,1];
      int c = winStates[i,2];

      if (board[a/3,a%3] != 0 &&
          board[a/3,a%3] == board[b/3,b%3] &&
          board[b/3,b%3] == board[c/3,c%3])
      {
         Console.WriteLine("Player " + player + " wins!");
         winner = true;
         break;
      }
   }

   if (!winner)
   {
      draw = true;
      for (int i = 0; i < 3; i++)
      {
         for (int j = 0; j < 3; j++)
         {
            if (board[i,j] == 0)
            {
               draw = false;
               break;
            }
         }
         if (!draw) break;
      }

      if (draw)
      {
         Console.WriteLine("It's a draw!");
      }
      else
      {
         Console.WriteLine("No winner yet. Next turn.");
      }
   }
}

示例2:单人玩(人机对战)

下面是一个示例,展示了如何让 AI 来参与游戏,支持单人对战。

int[,] board = {
   {0, 0, 0}, 
   {0, 0, 0}, 
   {0, 0, 0}
};
int player = 1;
bool winner = false;
bool draw = false;

Console.WriteLine("Welcome to Tic-Tac-Toe! Here's the game board:\n");

while (!winner && !draw)
{
   if (player == 1)
   {
      Console.WriteLine("It's your turn:");

      Console.WriteLine("  0 1 2\n");
      for (int i = 0; i < 3; i++)
      {
         Console.Write(i + " ");
         for (int j = 0; j < 3; j++)
         {
            if (board[i,j] == 0) 
               Console.Write("- ");
            else if (board[i,j] == 1) 
               Console.Write("X ");
            else 
               Console.Write("O ");
         }
         Console.WriteLine();
      }

      Console.Write("Enter x coordinate: ");
      int x = Convert.ToInt32(Console.ReadLine());

      Console.Write("Enter y coordinate: ");
      int y = Convert.ToInt32(Console.ReadLine());

      if (board[x,y] == 0)
      {
         board[x,y] = player;
         player = 2;
      }
      else
      {
         Console.WriteLine("This position is already occupied! Try again.");
      }
   }
   else
   {
      int x = -1, y = -1;
      bool found = false;

      for (int i = 0; i < 3; i++)
      {
         for (int j = 0; j < 3; j++)
         {
            if (board[i,j] == 0)
            {
               board[i,j] = player;

               for (int k = 0; k < 8; k++)
               {
                  int a = winStates[k,0];
                  int b = winStates[k,1];
                  int c = winStates[k,2];

                  if (board[a/3,a%3] != 0 &&
                      board[a/3,a%3] == board[b/3,b%3] &&
                      board[b/3,b%3] == board[c/3,c%3])
                  {
                     x = i;
                     y = j;
                     found = true;
                     break;
                  }
               }

               board[i,j] = 0;
               if (found) break;
            }
         }
         if (found) break;
      }

      if (!found)
      {
         Random rnd = new Random();

         do
         {
            x = rnd.Next(0, 3);
            y = rnd.Next(0, 3);
         } while (board[x,y] != 0);
      }

      Console.WriteLine("The computer chooses (" + x + ", " + y + ")");
      board[x,y] = player;
      player = 1;
   }

   for (int i = 0; i < 8; i++)
   {
      int a = winStates[i,0];
      int b = winStates[i,1];
      int c = winStates[i,2];

      if (board[a/3,a%3] != 0 &&
          board[a/3,a%3] == board[b/3,b%3] &&
          board[b/3,b%3] == board[c/3,c%3])
      {
         Console.WriteLine("Player " + player + " wins!");
         winner = true;
         break;
      }
   }

   if (!winner)
   {
      draw = true;
      for (int i = 0; i < 3; i++)
      {
         for (int j = 0; j < 3; j++)
         {
            if (board[i,j] == 0)
            {
               draw = false;
               break;
            }
         }
         if (!draw) break;
      }

      if (draw)
      {
         Console.WriteLine("It's a draw!");
      }
      else
      {
         Console.WriteLine("No winner yet. Next turn.");
      }
   }
}

结论

通过本文,我们可以看到,使用 C# 编程语言实现一个简单的井字游戏并不难,只需要几个简单的步骤就能够完成。对于想要更进一步学习,或者想要了解更多井字游戏的玩法和规则的人来说,我们建议继续深入学习本主题,并使用更复杂的算法来实现更强大的 AI 策略,或者为你的游戏添加更多的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现简单的井字游戏实例 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • C# String.Length方法: 获取字符串的长度

    String.Length是C#中用于获取字符串长度的属性,它的作用是返回字符串中字符的个数,这个长度计数包括空格和特殊字符。 下面介绍一下String.Length的使用方法: 语法格式 字符串.Length 返回值类型 Int32 示例一 string str = "hello world"; int length = str.Len…

    C# 2023年4月19日
    00
  • ASP.NET中制作各种3D图表的方法

    制作各种3D图表,在ASP.NET中可以分为两类:使用前端JavaScript库和通过ASP.NET后端组件渲染3D图表。 使用前端JavaScript库 Three.js Three.js是一种流行的JavaScript库,它提供了一个轻量级的3D引擎,易于使用和构建高质量的3D应用程序。由于Three.js是一个开源库,因此它可以免费使用,并且拥有广泛的…

    C# 2023年6月3日
    00
  • C#如何让winform程序中的输入文本框保留上次的输入

    要让WinForm程序中的输入文本框保留上次的输入,一种比较常见的方法是使用应用程序设置(Application Settings),下面我将提供具体的攻略。 第一步:启用应用程序设置 在Visual Studio中打开你的WinForm项目; 打开项目属性窗口(可以通过在解决方案资源管理器中右键单击项目并选择“属性”或者通过菜单栏的“项目”->“属性…

    C# 2023年6月6日
    00
  • C# WinForm捕获未处理的异常实例解析

    C# WinForm捕获未处理的异常实例解析 在开发过程中,未处理的异常是一个常见但又容易被忽略的问题。当应用程序抛出未处理异常时,程序会崩溃并弹出一个错误对话框,这会给用户留下不好的印象。为了避免这种情况,我们需要捕获程序中的未处理异常并进行处理。 在本文中,我们将介绍如何在C# WinForm应用程序中捕获未处理异常。 捕获未处理异常 在C# WinFo…

    C# 2023年5月15日
    00
  • C# datagrid非常规方法实现添加合并列

    C# 的 Datagrid 是一个非常强大的控件,但是由于它的灵活性,有时候我们需要实现一些非常规的功能,例如实现添加合并列。下面是一份完整攻略。 步骤一:准备工作 在使用非常规方法实现添加合并列之前,我们需要先明确几件事情,分别是: 我们需要使用到 WPF 的 DataGrid 控件,而不是 WinForms 的 DataGridView 控件; 我们需要…

    C# 2023年6月6日
    00
  • C#添加Windows服务 定时任务

    下面是“C#添加Windows服务 定时任务”的完整攻略: 需要准备的工具和知识 Visual Studio或其他C#开发工具 熟悉C#的基本语法 熟悉Windows服务和定时任务的概念 第一步:创建Windows服务项目 打开Visual Studio,选择“新建项目” 在弹出的“新建项目”对话框中,选择“Windows服务”项目类型 输入项目名称,选择保…

    C# 2023年6月1日
    00
  • .NET 水晶报表使用代码

    下面是 “.NET 水晶报表使用代码” 的完整攻略: 1. 安装Crystal Reports 首先需要安装 Crystal Reports,这里简单介绍一下安装步骤: 在 Visual Studio 中,打开 “工具” -> “扩展和更新”。 在 “扩展和更新” 窗口中,选择 “联机” 选项卡。 搜索 “Crystal Reports”,并安装最新的…

    C# 2023年5月31日
    00
  • C#通过标签软件Bartender的ZPL命令打印条码

    下面我将详细讲解“C#通过标签软件Bartender的ZPL命令打印条码”的完整攻略。 1. Bartender软件的安装和使用 Bartender是一款功能强大的标签设计和打印软件,可以用于创建各种类型的标签和条码。首先需要在官网下载Bartender的安装包并完成安装。 使用Bartender进行标签设计和打印的具体流程如下: 打开Bartender软件…

    C# 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部