50٪ تخفیف روی تمام دوره‌ها!
پایان تخفیف تا:
مشاهده دوره‌ها
0

مشکل در فراخوانی توابع

سلام

قصد دارم برنامه دوز یا X و O رو در سی شارپ بنویسم. در کد زیر غیر از تابع Main چهار تابع تعریف کردم که همگی هم در یک کلاس هستند.مشکلی که دارم این هست که وقتی توابعی که همگی در یک کلاس هستند رو فراخوانی می کنم کامپایلر Error میده ممنون میشم راهنمایی کنید.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace Abbas
{
    class Program
    {
        char[] board = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        static void Main(string[] args)
        {
            bool player = false; // true = X false = O
            Program p = new Program();
            displayBoard(ref p.board);

            bool result = checkWin(true);
            while (!result)
            {
                if (player == true)
                    player = false;
                else
                    player = true;
                move(player);
            }
            if (player == true)
                Console.WriteLine("Player 1 WINS");
            else
                Console.WriteLine("Player 2 WINS");
        }



        static void displayBoard(ref char[] board)
        {
            Console.WriteLine();
            Console.Write('\t');
            Console.Write(board[0]);
            Console.Write(" | ");
            Console.Write(board[1]);
            Console.Write(" | ");
            Console.WriteLine(board[2]);
            Console.Write('\t');
            Console.WriteLine("---------");
            Console.Write('\t');
            Console.Write(board[3]);
            Console.Write(" | ");
            Console.Write(board[4]);
            Console.Write(" | ");
            Console.WriteLine(board[5]);
            Console.Write('\t');
            Console.WriteLine("---------");
            Console.Write('\t');
            Console.Write(board[6]);
            Console.Write(" | ");
            Console.Write(board[7]);
            Console.Write(" | ");
            Console.Write(board[8]);
        }
        bool checkWin()
        {
            if (board[0] == board[1] && board[2] == board[0])
                return true;
            else if (board[3] == board[4] && board[5] == board[3])
                return true;
            else if (board[6] == board[7] && board[8] == board[6])
                return true;
            else if (board[0] == board[3] && board[6] == board[0])
                return true;
            else if (board[1] == board[4] && board[7] == board[1])
                return true;
            else if (board[2] == board[5] && board[8] == board[2])
                return true;
            else if (board[0] == board[4] && board[8] == board[0])
                return true;
            else if (board[2] == board[4] && board[6] == board[2])
                return true;
            else
                return false;
        }

        void move(bool who)
        {
            int spot;
            if (who == true)
                Console.WriteLine("\nEnter your move Player 1: ");
            else
                Console.WriteLine("\nEnter your move Player 2: ");

            spot=int.Parse( Console.ReadLine()); 
            if (isLegal(spot))
            {
                if (who == true)
                    board[spot - 1] = 'X';
                else
                    board[spot - 1] = 'O';
            }
            else
                move(who);
            displayBoard(ref board);
        }

        bool isLegal(int spot)
        {
            if (board[spot - 1] == 'X' || board[spot - 1] == 'O')
                return false;
            else
                return true;
        }
    }
}

پرسیده شده در 1395/11/20 توسط

3 پاسخ

0

ممنون از لطف شما

توابع مورد نظر رو static کردم اما تو تابع Move باز هم Error دارم به این دلیل که فیلد غیر استاتیک فقط قبول میکنه سعی کردم یک شیء از کلاس Program رو تو تابع Move ایجاد کنم اما ظاهراً چون داخل حلقه بود قبول نکرد و هنوز برنامه خطا میده

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace Abbas
{
    class Program
    {
        char[] board = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        static void Main(string[] args)
        {
            bool player = false; // true = X false = O
            Program p = new Program();
            displayBoard(ref p.board);

            bool result = checkWin(ref p.board);
            while (!result)
            {
                if (player == true)
                    player = false;
                else
                    player = true;
                move(player);
            }
            if (player == true)
                Console.WriteLine("Player 1 WINS");
            else
                Console.WriteLine("Player 2 WINS");
        }



        static void displayBoard(ref char[] board)
        {
            Console.WriteLine();
            Console.Write('\t');
            Console.Write(board[0]);
            Console.Write(" | ");
            Console.Write(board[1]);
            Console.Write(" | ");
            Console.WriteLine(board[2]);
            Console.Write('\t');
            Console.WriteLine("---------");
            Console.Write('\t');
            Console.Write(board[3]);
            Console.Write(" | ");
            Console.Write(board[4]);
            Console.Write(" | ");
            Console.WriteLine(board[5]);
            Console.Write('\t');
            Console.WriteLine("---------");
            Console.Write('\t');
            Console.Write(board[6]);
            Console.Write(" | ");
            Console.Write(board[7]);
            Console.Write(" | ");
            Console.Write(board[8]);
        }
       static bool checkWin(ref char[] board)
        {
            if (board[0] == board[1] && board[2] == board[0])
                return true;
            else if (board[3] == board[4] && board[5] == board[3])
                return true;
            else if (board[6] == board[7] && board[8] == board[6])
                return true;
            else if (board[0] == board[3] && board[6] == board[0])
                return true;
            else if (board[1] == board[4] && board[7] == board[1])
                return true;
            else if (board[2] == board[5] && board[8] == board[2])
                return true;
            else if (board[0] == board[4] && board[8] == board[0])
                return true;
            else if (board[2] == board[4] && board[6] == board[2])
                return true;
            else
                return false;
        }

        static void move(bool who)
        {
            int spot;


            if (who == true)
                Console.WriteLine("\nEnter your move Player 1: ");
            else
                Console.WriteLine("\nEnter your move Player 2: ");

            spot = int.Parse(Console.ReadLine());
            if (isLegal(spot))
            {

                if (who == true)
                    board[spot - 1] = 'X';
                else
                    board[spot - 1] = 'O';
            }
            else
                move(who);
            displayBoard(ref board);
        }

        static bool isLegal(int spot)
        {
            if (board[spot - 1] == 'X' || board[spot - 1] == 'O')
                return false;
            else
                return true;
        }
    }
}
پاسخ در 1395/11/20 توسط
1

سلام دوست عزیز، مشکلات کد شما دو مورد هست:

  1. متد های checkWin و move و isLegal باید به صورت static تعریف بشن تا داخل Main بشه ازشون استفاده کرد.
  2. متد checkWin هیچ پارامتری قبول نمیکنه، اما داخل Main بهش مقدار true ارسال شده.
پاسخ در 1395/11/20 توسط
1

کد زیر اصلاح شده، نیازی به این نیست که از Program شئ بسازید، فقط board رو استاتیک کنید:

namespace Abbas
{
    class Program
    {
        static char[] board = { '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        static void Main(string[] args)
        {
            bool player = false; // true = X false = O
            displayBoard(ref board);

            bool result = checkWin(ref board);
            while (!result)
            {
                if (player == true)
                    player = false;
                else
                    player = true;
                move(player);
            }
            if (player == true)
                Console.WriteLine("Player 1 WINS");
            else
                Console.WriteLine("Player 2 WINS");
        }



        static void displayBoard(ref char[] board)
        {
            Console.WriteLine();
            Console.Write('\t');
            Console.Write(board[0]);
            Console.Write(" | ");
            Console.Write(board[1]);
            Console.Write(" | ");
            Console.WriteLine(board[2]);
            Console.Write('\t');
            Console.WriteLine("---------");
            Console.Write('\t');
            Console.Write(board[3]);
            Console.Write(" | ");
            Console.Write(board[4]);
            Console.Write(" | ");
            Console.WriteLine(board[5]);
            Console.Write('\t');
            Console.WriteLine("---------");
            Console.Write('\t');
            Console.Write(board[6]);
            Console.Write(" | ");
            Console.Write(board[7]);
            Console.Write(" | ");
            Console.Write(board[8]);
        }
        static bool checkWin(ref char[] board)
        {
            if (board[0] == board[1] && board[2] == board[0])
                return true;
            else if (board[3] == board[4] && board[5] == board[3])
                return true;
            else if (board[6] == board[7] && board[8] == board[6])
                return true;
            else if (board[0] == board[3] && board[6] == board[0])
                return true;
            else if (board[1] == board[4] && board[7] == board[1])
                return true;
            else if (board[2] == board[5] && board[8] == board[2])
                return true;
            else if (board[0] == board[4] && board[8] == board[0])
                return true;
            else if (board[2] == board[4] && board[6] == board[2])
                return true;
            else
                return false;
        }

        static void move(bool who)
        {
            int spot;


            if (who == true)
                Console.WriteLine("\nEnter your move Player 1: ");
            else
                Console.WriteLine("\nEnter your move Player 2: ");

            spot = int.Parse(Console.ReadLine());
            if (isLegal(spot))
            {

                if (who == true)
                    board[spot - 1] = 'X';
                else
                    board[spot - 1] = 'O';
            }
            else
                move(who);
            displayBoard(ref board);
        }

        static bool isLegal(int spot)
        {
            if (board[spot - 1] == 'X' || board[spot - 1] == 'O')
                return false;
            else
                return true;
        }
    }
}
پاسخ در 1395/11/20 توسط

پاسخ شما