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; } } }
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; } } }
1
سلام دوست عزیز، مشکلات کد شما دو مورد هست:
- متد های checkWin و move و isLegal باید به صورت static تعریف بشن تا داخل Main بشه ازشون استفاده کرد.
- متد checkWin هیچ پارامتری قبول نمیکنه، اما داخل Main بهش مقدار true ارسال شده.
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; } } }