我的思路是:每一個細胞作為一個類,其中的judgeAlive()方法可判斷接受的Cell二維組內相鄰8個細胞的isAlive,進而改變自己的isAlive具體用一個二重回圈實作。但結果要么全生,要么全死,要么保持原生死狀態不變。請問大家可以幫我看看哪一步寫的不對嗎?
Cell.cs:定義Cell類
using System;
namespace LifeGame
{
class Cell
{
private const int BOARD_LENGTH_X = 44,BOARD_LENGTH_Y = 76;
public int pos_x = 0;
public int pos_y = 0;
public bool isAlive;
public Cell()
{
this.isAlive = false;
}
public void set(int x,int y)
{
this.pos_x = x;
this.pos_y = y;
}
public void judgeAlive(Cell[,] board)
{
int number_alive = 0;
int current_pos_x, current_pos_y;
for(int x = -1;x < 2;x++)
{
for(int y = -1;y < 2; y++)
{
if ((x == 0) && (y == 0))
{
continue;
}
else
{
if (x + this.pos_x < 0)
{
current_pos_x = BOARD_LENGTH_X - 1;
}
else if(x + this.pos_x>= BOARD_LENGTH_X)
{
current_pos_x = 0;
}
else
{
current_pos_x = x + this.pos_x;
}
if(y + this.pos_y < 0)
{
current_pos_y = BOARD_LENGTH_Y - 1;
}
else if(y + this.pos_y >= BOARD_LENGTH_Y)
{
current_pos_y = 0;
}
else
{
current_pos_y = y + this.pos_y;
}
if (board[current_pos_x, current_pos_y].isAlive)
{
number_alive++;
}
}
}
}
switch (number_alive)
{
case 0:
case 1:
this.isAlive = false;
break;
case 2:
break;
case 3:
this.isAlive = true;
break;
case 4:
case 5:
case 6:
case 7:
case 8:
this.isAlive = false;
break;
default:
break;
}
}
}
}
Program.cs:主程式
using System;
using System.Threading;
namespace LifeGame
{
class Program
{
public static void copyBoard(Cell[,] board_to_copy, Cell[,] board_being_copied)
{
const int BOARD_LENGTH_X = 44, BOARD_LENGTH_Y = 76;
for (int x = 0;x < BOARD_LENGTH_X; x++)
{
for(int y = 0;y < BOARD_LENGTH_Y; y++)
{
board_to_copy[x, y].isAlive = board_being_copied[x, y].isAlive;
}
}
}
public static void consoleBoard(Cell[,] board)
{
int BOARD_LENGTH_X = 44, BOARD_LENGTH_Y = 76;
Console.Write(" ");
for (int i = 0; i < BOARD_LENGTH_Y; i++)
{
if (i < 10)
{
Console.Write("{0} ", i);
}
else
{
Console.Write("{0}", i);
}
}
Console.Write("\n");
for (int x = 0; x < BOARD_LENGTH_X; x++)
{
if (x < 10)
{
Console.Write("{0} ", x);
}
else
{
Console.Write("{0}", x);
}
for (int y = 0; y < BOARD_LENGTH_Y; y++)
{
if (board[x, y].isAlive)
{
Console.Write("O");//就是一個黑方塊,CSDN不讓發
}
else
{
Console.Write(" ");
}
if (y == BOARD_LENGTH_Y - 1)
{
Console.Write("\n");
}
}
}
}
public static int userSurface(Cell[,] board)
{
while (true)
{
int BOARD_LENGTH_X = 44, BOARD_LENGTH_Y = 76;
Console.Write("LifeGame>");
string userInput = Console.ReadLine();
switch (userInput)
{
case "live":
Console.Write(@"LifeGame\live\x>");
int inX_live = Convert.ToInt32(Console.ReadLine());
Console.Write(@"LifeGame\live\y>");
int inY_live = Convert.ToInt32(Console.ReadLine());
board[inX_live, inY_live].isAlive = true;
Console.Clear();
Program.consoleBoard(board);
break;
case "die":
Console.Write(@"LifeGame\die\x>");
int inX_die = Convert.ToInt32(Console.ReadLine());
Console.Write(@"LifeGame\die\y>");
int inY_die = Convert.ToInt32(Console.ReadLine());
board[inX_die, inY_die].isAlive = false;
Console.Clear();
Program.consoleBoard(board);
break;
case "random":
Random rd = new Random();
for(int x = 0;x < BOARD_LENGTH_X; x++)
{
for(int y = 0;y < BOARD_LENGTH_Y; y++)
{
int key = rd.Next(0, 100);
switch (key % 2)
{
case 0:
board[x, y].isAlive = true;
break;
case 1:
board[x, y].isAlive = false;
break;
}
}
}
Console.Clear();
Program.consoleBoard(board);
break;
case "start":
Console.Clear();
return 0;
}
}
}
static void Main(string[] args)
{
Console.Title = "LifeGame";
const int BOARD_LENGTH_X = 44,BOARD_LENGTH_Y = 76,DURATION = 100;
Cell[,] board = new Cell[BOARD_LENGTH_X,BOARD_LENGTH_Y];
for (int x = 0; x < BOARD_LENGTH_X; x++)
{
for (int y = 0; y < BOARD_LENGTH_Y; y++)
{
board[x, y] = new Cell();
}
}
consoleBoard(board);
userSurface(board);
Cell[,] boardCopy = new Cell[BOARD_LENGTH_X, BOARD_LENGTH_Y];
for (int x = 0; x < BOARD_LENGTH_X; x++)
{
for (int y = 0; y < BOARD_LENGTH_Y; y++)
{
boardCopy[x, y] = new Cell();
}
}
copyBoard(boardCopy, board);
while (true)
{
for (int x = 0; x < BOARD_LENGTH_X; x++)
{
for (int y = 0; y < BOARD_LENGTH_Y; y++)
{
boardCopy[x, y].judgeAlive(board);
Console.Write(boardCopy[x, y].isAlive);
}
}
for(int x = 0;x < BOARD_LENGTH_X; x++)
{
for(int y = 0;y < BOARD_LENGTH_Y; y++)
{
board[x, y].isAlive = boardCopy[x, y].isAlive;
}
}
consoleBoard(board);
consoleBoard(boardCopy);
Thread.Sleep(1000);
//Console.Clear();
//return;
}
}
}
}
uj5u.com熱心網友回復:
代碼貼出來了值得鼓勵啊
太長了,說實話沒怎么看懂
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/267246.html
標籤:C#
