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;
}
}
}