2015-11-12 2 views
-1

У меня есть следующий код о функции шашек игры, которая обрабатывает движение:BitConverter.ToInt16() производит неожиданный результат

public void convertMoveToIntValues(KeyValuePair<string, string> move, ref Int16 fromNumInt, ref Int16 toNumInt) { 
    Byte[] fromNumTemp = { 0, 0 }; 
    Byte[] fromNum = {0,0,0,0}; 
    fromNumTemp = Encoding.ASCII.GetBytes(move.Key); 
    fromNumTemp[0] -= 96; 
    fromNumTemp[1] -= 48; 
    fromNum[1] = fromNumTemp[0]; 
    fromNum[3] = fromNumTemp[1]; 
    fromNumInt = (Int16)(BitConverter.ToInt16(fromNum, 0) * 8 + BitConverter.ToInt16(fromNum, 2)); 
    Byte[] toNumTemp = {0,0}; 
    Byte[] toNum = { 0, 0, 0, 0 }; 
    toNumTemp = Encoding.ASCII.GetBytes(move.Value); 
    toNumTemp[0] -= 96; 
    toNumTemp[1] -= 48; 
    toNum[1] = toNumTemp[0]; 
    toNum[3] = toNumTemp[1]; 
    toNumInt = (Int16)(BitConverter.ToInt16(toNum, 0) * 8 + BitConverter.ToInt16(toNum, 2)); 
} 

public void Main() { 
    Int16 a, b; 
    convertMoveToInt(New KeyValuePair<string, string>("c3","b4"), a, b); 

    Console.Writeline("The puppet moves from place no. " + a + " to place no. " + b); 
} 

я получаю неправильные решения, как: а = 6912 и B = 5120.

Я использую два типа байта [], первый для преобразования ASCII в байт, а затем другой для преобразования Byte to Int16. Хорошая ссылка на эту тему: https://msdn.microsoft.com/en-us/library/system.bitconverter.toint16(v=vs.110).aspx

Все идет хорошо до последней строки, где она производит неверный результат.

Не могли бы вы помочь мне получить правильный ответ?

+0

Вы ожидали (27, 20) вместо (6912, 5120)? – dasblinkenlight

ответ

0

Я думаю, что вы, вероятно, хотите:

toNum[0] = toNumTemp[0]; 
toNum[2] = toNumTemp[1]; 

вместо:

toNum[1] = toNumTemp[0]; 
toNum[3] = toNumTemp[1]; 

(Я также предлагаю вам написать метод, который принимает string и возвращает Int16, чтобы спасти вас писать один и тот же код дважды)

0

Теперь я получаю некоторые изменения в этом коде, но на самом деле это действительно не работает. У меня есть шахматная таблица с 8 столбцами 8 строк. Официальный подсчет таблицы, начиная с a1 - левый нижний угол до h8 - правый верхний угол. В коде у меня есть представление этих данных в массиве, который фактически начинается с левого верхнего угла таблицы и заканчивается в правом нижнем углу таблицы. Так что это каверзная вещь, чтобы получить от данных алфавитно-цифровых данных ту, которая необходима для решения массива. Прошу вас рассмотреть следующий метод, который преобразует алфавитно-цифровое значение в адрес массива, потому что мне приходится переходить на плохую фазу (например, иногда 4 ячейки вправо, чем в других случаях только 2 ячейки справа).

Спасибо!

public void convertMoveToIntValues(KeyValuePair<string, string> move, ref Int16 fromNumInt, ref Int16 toNumInt) 
{ 
    Int16 temp0, temp1; 

    Byte[] fromNumTemp = { 0, 0 }; 
    Byte[] fromNum = {0,0,0,0}; 
    fromNumTemp = Encoding.ASCII.GetBytes(move.Key); 
    fromNumTemp[0] -= 97; 
    fromNumTemp[1] -= 49; 
    fromNum[0] = fromNumTemp[0]; 
    fromNum[2] = fromNumTemp[1]; 
    temp0 = (Int16)(56 - (Int16)(BitConverter.ToInt16(fromNum, 2) * 8 + BitConverter.ToInt16(fromNum, 0))); 
    fromNumInt = (temp0 > 0) ? temp0: (Int16)(-1 * temp0); 

    Byte[] toNumTemp = {0,0}; 
    Byte[] toNum = { 0, 0, 0, 0 }; 
    toNumTemp = Encoding.ASCII.GetBytes(move.Value); 
    toNumTemp[0] -= 97; 
    toNumTemp[1] -= 49; 
    toNum[0] = toNumTemp[0]; 
    toNum[2] = toNumTemp[1]; 
    temp1 = (Int16)(56 - (Int16)(BitConverter.ToInt16(toNum, 2) * 8 + BitConverter.ToInt16(toNum, 0))); 
    toNumInt = (temp1 > 0) ? temp1: (Int16)(-1 * temp1); 
} 
Смежные вопросы