使用C#写最基本的五子棋

本文介绍了使用C#编写五子棋游戏的过程,包括界面设计、棋盘绘制、棋子类、游戏逻辑等。作者通过GDI+画图实现棋盘与棋子,并详细阐述了落子判断、胜负检测的实现思路,同时反思了代码可读性和扩展性的不足,表达了期待指正和学习的愿望。
摘要由CSDN通过智能技术生成

2018.9.30更新:判断斜着胜利的条件确实有问题,评论里已经指出来并更正了,我这边缺少研发环境也就不改了,感谢各位朋友。


2018.2.9更新:惊了,没想到被度娘推到了第三,翻箱倒柜找出了两年前的代码然后推上了github,献给各位求代码的pong友们。https://github.com/steveliu13/wuziqi_in_csharp

这是和原文的分割线


曾经自学C#做计算机图形学的作业,GDI+画图确实好用,目前在找.NET的实习,尝试做了一个最基本的五子棋,复习一下C#的基本语法,目前只能当跟基友一起玩的单机小游戏,之后再加入AI和联网对战功能。目前我还是小菜鸟,过程设计和代码有不合理或者能优化的地方欢迎各位大神指正。

首先是界面设计,最后就是这样,控件一共有一个PictureBox;一个开始Button,命名为btnStart;一个重置Button,命名为btnReset;一个Label,用于显示游戏状态。五子棋界面

然后是各基本类。新建一个MainSize类用于存放界面上的可能用到的参数,主框体大小520460,棋盘是一个PictureBox控件,大小401401,棋盘20行20列,每个格子边长20,棋子直径16。新建一个ChessBoard类表示棋盘,有一个静态函数DrawBoard。之前做计算机图形学作业画函数时用到的画坐标系方法在这里同样适用,函数代码如下。

class ChessBoard
    {
        
        static readonly Color color = Color.Black;
        static readonly float penWid = 1.0f;
        static readonly Pen pen = new Pen(color, penWid);        

        public static void DrawCB(Graphics gra,PictureBox pic)
        {
            //每排数量
            int horC = MainSize.CBWid / MainSize.CBGap;
            //间隔
            int gap = MainSize.CBGap;
            Image img = new Bitmap(MainSize.CBWid, MainSize.CBHei);
            gra = Graphics.FromImage(img);
            gra.Clear(Color.White);
            gra.DrawRectangle(pen, 0, 0, MainSize.CBWid, MainSize.CBHei);
            //画棋盘
            for (int i = 0; i < horC; i++)
            {
                gra.DrawLine(pen, 0, i * gap, MainSize.CBWid, i * gap);
                gra.DrawLine(pen, i * gap, 0, i * gap, MainSize.CBHei);
            }
            gra.DrawLine(pen, 0, horC * gap, MainSize.CBWid, horC * gap - 1);
            gra.DrawLine(pen, hor
以下是一个简单的五子棋程序的C#代码示例: ```csharp using System; namespace FiveInARow { class Program { static int ROWS = 15; static int COLS = 15; static char[,] board = new char[ROWS, COLS]; static void Main(string[] args) { InitializeBoard(); PrintBoard(); char player = 'X'; bool gameOver = false; while (!gameOver) { Console.WriteLine("Player " + player + "'s turn:"); Console.Write("Enter row number (1-" + ROWS + "): "); int row = Convert.ToInt32(Console.ReadLine()) - 1; Console.Write("Enter column number (1-" + COLS + "): "); int col = Convert.ToInt32(Console.ReadLine()) - 1; if (IsValidMove(row, col)) { PlacePiece(row, col, player); if (IsWinningMove(row, col)) { Console.WriteLine("Player " + player + " wins!"); gameOver = true; } else if (IsBoardFull()) { Console.WriteLine("It's a tie!"); gameOver = true; } else { player = (player == 'X') ? 'O' : 'X'; PrintBoard(); } } else { Console.WriteLine("Invalid move. Please try again."); } } Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } static void InitializeBoard() { for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { board[row, col] = '-'; } } } static void PrintBoard() { Console.WriteLine(); for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { Console.Write(board[row, col] + " "); } Console.WriteLine(); } Console.WriteLine(); } static bool IsValidMove(int row, int col) { if (row < 0 || row >= ROWS || col < 0 || col >= COLS) { return false; } return board[row, col] == '-'; } static void PlacePiece(int row, int col, char player) { board[row, col] = player; } static bool IsWinningMove(int row, int col) { char player = board[row, col]; // check horizontal int count = 1; int c = col - 1; while (c >= 0 && board[row, c] == player) { count++; c--; } c = col + 1; while (c < COLS && board[row, c] == player) { count++; c++; } if (count >= 5) { return true; } // check vertical count = 1; int r = row - 1; while (r >= 0 && board[r, col] == player) { count++; r--; } r = row + 1; while (r < ROWS && board[r, col] == player) { count++; r++; } if (count >= 5) { return true; } // check diagonal 1 count = 1; r = row - 1; c = col - 1; while (r >= 0 && c >= 0 && board[r, c] == player) { count++; r--; c--; } r = row + 1; c = col + 1; while (r < ROWS && c < COLS && board[r, c] == player) { count++; r++; c++; } if (count >= 5) { return true; } // check diagonal 2 count = 1; r = row - 1; c = col + 1; while (r >= 0 && c < COLS && board[r, c] == player) { count++; r--; c++; } r = row + 1; c = col - 1; while (r < ROWS && c >= 0 && board[r, c] == player) { count++; r++; c--; } if (count >= 5) { return true; } return false; } static bool IsBoardFull() { for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { if (board[row, col] == '-') { return false; } } } return true; } } } ``` 这个程序使用一个二维字符数组来表示棋盘,使用 `-` 表示空位置,使用 `X` 和 `O` 表示两个玩家。程序使用一个循环来不断让两个玩家交替下棋,直到出现胜利或平局为止。在每个回合中,程序会让当前玩家输入一个位置来下棋,然后检查该位置是否有效,如果是,就下棋并检查是否出现胜利或平局。如果没有出现胜利或平局,则切换到另一个玩家,然后打印棋盘以供下一个回合使用。如果出现胜利或平局,程序将退出循环并显示相应的消息。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值