Итак, я пытаюсь сделать простой баллистический калькулятор для игры Arma 3 с помощью Python 2.7 и файла Excel. Намерение состоит в том, чтобы сделать простую программу, которая запускается в терминале и запрашивает данные, связанные с выстрелом, который вы пытаетесь рассчитать, и выводит значение, равное задержке mil-dot (точки в снайперском прицеле). нужно для удачного выстрела в створ. Ссылка с таблицей примеров подробно объяснит, что это значит. Это довольно просто.
Он включает в себя выполнение тригонометрических вычислений, чтобы найти истинное горизонтальное расстояние до цели. Затем используйте этот диапазон в сочетании со значением (проанализированным? с помощью xlrd) из файла Excel, который содержит переменную, используемую в расчете удержания.
то есть горизонтальное расстояние = диапазон * cos (угол)
горизонтальное расстояние - обнуление = hold_over_variable_x ;
затем используйте таблицу с этой страницы Steam, чтобы получить другую переменную, используемую для расчета удержания. . В этом примере таблица винтовки M320 LRR, которая будет сохранена в файле Excel. (Я хотел бы добавить больше винтовок в будущем и использовать переменную raw_input для выбора соответствующего листа Excel)
Обнуление будет переменной, которая назначается через raw_input и необходима для извлечения правильного значения из указанной таблицы.
например обнуление = 1000
диапазон = 1125
угол = 15,5
горизонтальное расстояние = 1125, потому что (15,5) = 1100
горизонтальное расстояние - обнуление = 100 = hold_over_variable_x
Hold_over_variable_y = -1,5 (проанализировано из файла Excel с использованием обнуляющей переменной)
удержание_овер = 100 * -1,5 = -150
Hold_over в идеале будет печататься как -1,5.
Вот мой код на данный момент, извините за плохое форматирование *edit; правильное форматирование исходного кода:
zeroing = int(raw_input("Zeroing?"))
designator_range = int(raw_input("Range?"))
angle = float(raw_input("Angle?"))
from math import cos, radians
horizontal_distance = designator_range * cos (radians(angle))
import xlrd
workbook = xlrd.open_workbook('mildot_arma.xls')
worksheet = workbook.sheet_by_name('M320')
hold_over_variable_x = horizontal_distance - zeroing
if zeroing == 300:
hold_over_variable_y == sheet.cell(1,1).value
elif zeroing == 400:
hold_over_variable_y == sheet.cell(2,1).value
elif zeroing == 500:
hold_over_variable_y == sheet.cell(3,1).value
elif zeroing == 600:
hold_over_variable_y == sheet.cell(4,1).value
elif zeroing == 700:
hold_over_variable_y == sheet.cell(5,1).value
elif zeroing == 800:
hold_over_variable_y == sheet.cell(6,1).value
elif zeroing == 900:
hold_over_variable_y == sheet.cell(7,1).value
elif zeroing == 1000:
hold_over_variable_y == sheet.cell(8,1).value
elif zeroing == 1100:
hold_over_variable_y == sheet.cell(9,1).value
elif zeroing == 1200:
hold_over_variable_y == sheet.cell(10,1).value
elif zeroing == 1300:
hold_over_variable_y == sheet.cell(11,1).value
elif zeroing == 1400:
hold_over_variable_y == sheet.cell(12,1).value
elif zeroing == 1500:
hold_over_variable_y == sheet.cell(13,1).value
else:
hold_over_variable_y = sheet.cell(14,1).value
hold_over = hold_over_variable_x * hold_over_variable_y
print hold_over
Я получаю ошибки:
Using variable 'hold_over_variable_y' before assignment
Undefined variable 'sheet'
Начиная с того момента, когда я нажимаю функции if.
Я супер нуб в этом. Извините за гигантский пост. Любая помощь или совет очень ценятся!
*Редактировать №2:
Ларс точно знал, что мне нужно исправить. Я использовал == в тех местах, где должен был использовать =, и мне нужно было изменить sheet.cell на worksheet.cell. Это мой первый реальный проект, который может быть полезен для меня, и я немного горжусь им. Спасибо за помощь.
Вот код, как он есть сейчас. Попробую поставить все это под пока True: надеясь, что это позволит мне вводить новые данные и рассчитывать следующий выстрел, не закрывая терминал.
#Horizontal distance and Mil-dot Hold Calculator for M320 in Arma 3
#Asks for ballistic data to assign values to variables that will be used in range and mil-dot calculations
zeroing = int(raw_input("Zeroing?"))
designator_range = int(raw_input("Range?"))
angle = float(raw_input("Angle?"))
#Imports cos and radians from math module
from math import cos, radians
#Trigonometric, horizontal distance calculation. Converts angle to radian and multiplies its cosine with the designator range.
horizontal_distance = designator_range * cos (radians(angle))
#Imports excel workbook, 'mildot_arma.xls", worksheet 'M320'. A mil-dot balistics table for the M320 to be used in hold over calculation
import xlrd
workbook = xlrd.open_workbook('mildot_arma.xls')
worksheet = workbook.sheet_by_name('M320')
#Beginning of Mil-dot calculation process
#Creates hold over variable_x from distance minus zeroing to be calculated with sheet
hold_over_variable_x = horizontal_distance - zeroing
#Parses hold over variable_y from sheet to be calculated with previous variable, (the most complicated part)
if zeroing == 300:
hold_over_variable_y = worksheet.cell(1,1).value
elif zeroing == 400:
hold_over_variable_y = worksheet.cell(2,1).value
elif zeroing == 500:
hold_over_variable_y = worksheet.cell(3,1).value
elif zeroing == 600:
hold_over_variable_y = worksheet.cell(4,1).value
elif zeroing == 700:
hold_over_variable_y = worksheet.cell(5,1).value
elif zeroing == 800:
hold_over_variable_y = worksheet.cell(6,1).value
elif zeroing == 900:
hold_over_variable_y = worksheet.cell(7,1).value
elif zeroing == 1000:
hold_over_variable_y = worksheet.cell(8,1).value
elif zeroing == 1100:
hold_over_variable_y = worksheet.cell(9,1).value
elif zeroing == 1200:
hold_over_variable_y = worksheet.cell(10,1).value
elif zeroing == 1300:
hold_over_variable_y = worksheet.cell(11,1).value
elif zeroing == 1400:
hold_over_variable_y = worksheet.cell(12,1).value
elif zeroing == 1500:
hold_over_variable_y = worksheet.cell(13,1).value
else:
hold_over_variable_y = worksheet.cell(14,1).value
#Calculates mil-dot hold over from variables, and assigns mil-dot hold over value
hold_over = hold_over_variable_x * hold_over_variable_y
#Prints final hold over calculation
print hold_over