commit
4db0259bf0
10 changed files with 3288 additions and 0 deletions
@ -0,0 +1,4 @@ |
|||||||
|
[ |
||||||
|
{"name": "Разговор о квадратичной сложности", "damage": 5}, |
||||||
|
{"name": "Принципы Гегеля", "damage": 8} |
||||||
|
] |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,17 @@ |
|||||||
|
[ |
||||||
|
{"name": "колхозочки", "damage": 5}, |
||||||
|
{"name": "хука", "damage": 10}, |
||||||
|
{"name": "джеба", "damage": 15}, |
||||||
|
{"name": "хитрого удара рукой", "damage": 20}, |
||||||
|
{"name": "удара номер 22", "damage": 25}, |
||||||
|
{"name": "пинка по самолюбию", "damage": 30}, |
||||||
|
{"name": "подлого удара", "damage": 35}, |
||||||
|
{"name": "очень подлый удар", "damage": 40}, |
||||||
|
{"name": "очень подлый удар", "damage": 45}, |
||||||
|
{"name": "очень подлый удар", "damage": 50}, |
||||||
|
{"name": "очень подлый удар", "damage": 65}, |
||||||
|
{"name": "очень подлый удар", "damage": 70}, |
||||||
|
{"name": "лихого заброса", "damage": 75}, |
||||||
|
{"name": "удара ногой с разворота", "damage": 80} |
||||||
|
|
||||||
|
] |
@ -0,0 +1,74 @@ |
|||||||
|
package fighter |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
"math/rand" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
type Fighter struct { |
||||||
|
name string |
||||||
|
health byte |
||||||
|
strength byte |
||||||
|
intelligence byte |
||||||
|
dexterity byte |
||||||
|
speed byte |
||||||
|
} |
||||||
|
|
||||||
|
// Инициализация бойца. Принимает имя, генерирует его характеристики
|
||||||
|
func (f *Fighter) InitFighter(name string) { |
||||||
|
f.name = name |
||||||
|
f.health = 50 + getRandomByte(120) |
||||||
|
|
||||||
|
f.strength = getRandomByte() |
||||||
|
f.strength = getRandomByte(201) |
||||||
|
f.intelligence = getRandomByte() |
||||||
|
f.dexterity = getRandomByte() |
||||||
|
f.speed = getRandomByte() |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
func (f *Fighter) Name() string { |
||||||
|
return f.name |
||||||
|
} |
||||||
|
|
||||||
|
func (f *Fighter) Health() byte { |
||||||
|
return f.health |
||||||
|
} |
||||||
|
|
||||||
|
func (f *Fighter) Characteristics() string { |
||||||
|
return fmt.Sprintf("здоровье: %d\nсила: %d\nинтелект: %d\nловкость: %d\n", |
||||||
|
f.health, f.strength, f.intelligence, f.dexterity) |
||||||
|
} |
||||||
|
|
||||||
|
// Возвращает число от 0 до 254, если передан n, то от 0 до n
|
||||||
|
// Если n больше 254, то оно игнорируется
|
||||||
|
func getRandomByte(n ...int) byte { |
||||||
|
rand.Seed(time.Now().UnixNano()) |
||||||
|
var max int = 255 |
||||||
|
|
||||||
|
if len(n) == 1 && n[0] < 255 { |
||||||
|
max = n[0] |
||||||
|
} |
||||||
|
|
||||||
|
return byte(rand.Intn(max)) |
||||||
|
} |
||||||
|
|
||||||
|
func ChooseRandomFighterName() string { |
||||||
|
rand.Seed(time.Now().UnixNano()) |
||||||
|
var max int = len(names) |
||||||
|
return names[rand.Intn(max)] |
||||||
|
} |
||||||
|
|
||||||
|
func GetRandomNames(count int) []string { |
||||||
|
rand.Seed(time.Now().UnixNano()) |
||||||
|
|
||||||
|
var max int = len(names) - 1 |
||||||
|
var resultNames []string |
||||||
|
|
||||||
|
for i := 0; i < count; i++ { |
||||||
|
resultNames = append(resultNames, names[rand.Intn(max)]) |
||||||
|
} |
||||||
|
|
||||||
|
return resultNames |
||||||
|
} |
@ -0,0 +1,96 @@ |
|||||||
|
// Модудь, эмулирующий сражение двух бойцов
|
||||||
|
package fighter |
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/json" |
||||||
|
"fmt" |
||||||
|
"io/ioutil" |
||||||
|
"log" |
||||||
|
"math/rand" |
||||||
|
"time" |
||||||
|
) |
||||||
|
|
||||||
|
type Punch struct { |
||||||
|
Name string |
||||||
|
Damage int |
||||||
|
} |
||||||
|
|
||||||
|
// Загружает список приемов и их урон из json файла со структурой
|
||||||
|
// `[{"name": "p_name_1", "damage": 5},{"name": "p_name_2", "damage": 8}]`
|
||||||
|
|
||||||
|
func loadPunches(filname string) []Punch { |
||||||
|
cont, err := ioutil.ReadFile(filname) |
||||||
|
if err != nil { |
||||||
|
log.Fatal("Error while reading file: ", err) |
||||||
|
} |
||||||
|
|
||||||
|
var punches []Punch |
||||||
|
|
||||||
|
err = json.Unmarshal(cont, &punches) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
log.Fatal("Error during Unmarshal(): ", err) |
||||||
|
} |
||||||
|
|
||||||
|
return punches |
||||||
|
} |
||||||
|
|
||||||
|
// Возвращает победителя.
|
||||||
|
func StartFight(firstFighter, secondFighter *Fighter) *Fighter { |
||||||
|
var winner *Fighter |
||||||
|
var choice int |
||||||
|
|
||||||
|
StrengthPunches := loadPunches("./cmd/fight_club/fighter/data/str_punches.json") |
||||||
|
|
||||||
|
for firstFighter.health > 0 && secondFighter.health > 0 { |
||||||
|
time.Sleep(time.Second) |
||||||
|
choice = choosePunch(firstFighter.strength, StrengthPunches) |
||||||
|
firstFighter.getPunch(&StrengthPunches[choice]) |
||||||
|
|
||||||
|
if firstFighter.health == 0 { |
||||||
|
break |
||||||
|
} |
||||||
|
|
||||||
|
time.Sleep(time.Second) |
||||||
|
choice = choosePunch(secondFighter.strength, StrengthPunches) |
||||||
|
secondFighter.getPunch(&StrengthPunches[choice]) |
||||||
|
|
||||||
|
fmt.Println() |
||||||
|
} |
||||||
|
|
||||||
|
if firstFighter.health > 0 { |
||||||
|
winner = firstFighter |
||||||
|
} else { |
||||||
|
winner = secondFighter |
||||||
|
} |
||||||
|
|
||||||
|
return winner |
||||||
|
} |
||||||
|
|
||||||
|
// Выбор приема на основе характеристики
|
||||||
|
func choosePunch(punchCharacteristic byte, punchList []Punch) int { |
||||||
|
var choice int |
||||||
|
|
||||||
|
if int(punchCharacteristic) <= len(punchList) { |
||||||
|
choice = rand.Intn(int(punchCharacteristic) - 1) |
||||||
|
} else { |
||||||
|
choice = rand.Intn(len(punchList)) |
||||||
|
} |
||||||
|
|
||||||
|
return choice |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// Боец получает удар
|
||||||
|
func (f *Fighter) getPunch(punch *Punch) { |
||||||
|
if punch.Damage > int(f.health) { |
||||||
|
f.health = 0 |
||||||
|
fmt.Printf("%v получает урон от %v. HP: %d\n", |
||||||
|
f.name, punch.Name, f.health) |
||||||
|
} else { |
||||||
|
f.health -= byte(punch.Damage) |
||||||
|
fmt.Printf("%v получает урон от %v. HP: %d\n", |
||||||
|
f.name, punch.Name, f.health) |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package fighter |
||||||
|
|
||||||
|
import ( |
||||||
|
"encoding/json" |
||||||
|
"io/ioutil" |
||||||
|
"log" |
||||||
|
) |
||||||
|
|
||||||
|
var names []string = loadNames("./cmd/fight_club/fighter/data/names.json") |
||||||
|
|
||||||
|
func loadNames(filname string) []string { |
||||||
|
cont, err := ioutil.ReadFile(filname) |
||||||
|
if err != nil { |
||||||
|
log.Fatal("Error while reading file: ", err) |
||||||
|
} |
||||||
|
|
||||||
|
var names []string |
||||||
|
err = json.Unmarshal(cont, &names) |
||||||
|
if err != nil { |
||||||
|
log.Fatal("Error during Unmarshal(): ", err) |
||||||
|
} |
||||||
|
|
||||||
|
return names |
||||||
|
|
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package main |
||||||
|
|
||||||
|
import ( |
||||||
|
"fight_club/cmd/fight_club/fighter" |
||||||
|
"fmt" |
||||||
|
) |
||||||
|
|
||||||
|
// Главный модуль. Просит выбрать бойца из двух вариантов.
|
||||||
|
|
||||||
|
func main() { |
||||||
|
var res int |
||||||
|
|
||||||
|
randNames := fighter.GetRandomNames(3) |
||||||
|
fmt.Println(randNames[0]) |
||||||
|
for number, name := range randNames { |
||||||
|
fmt.Printf("%d. %v\n", number+1, name) |
||||||
|
} |
||||||
|
|
||||||
|
fmt.Printf("Выбери своего бойца (введи его номер): ") |
||||||
|
_, err := fmt.Scanf("%d", &res) |
||||||
|
|
||||||
|
if err != nil { |
||||||
|
fmt.Println("Ты выбираешь не правильно") |
||||||
|
} |
||||||
|
|
||||||
|
var frst, scnd fighter.Fighter |
||||||
|
frst.InitFighter(randNames[res-1]) |
||||||
|
scnd.InitFighter(fighter.ChooseRandomFighterName()) |
||||||
|
|
||||||
|
fmt.Println("В бою учавствуют:") |
||||||
|
fmt.Printf("(*) %v\n%v\n", frst.Name(), frst.Characteristics()) |
||||||
|
|
||||||
|
fmt.Printf("( ) %v\n%v\n", scnd.Name(), scnd.Characteristics()) |
||||||
|
|
||||||
|
winner := fighter.StartFight(&frst, &scnd) |
||||||
|
|
||||||
|
fmt.Println() |
||||||
|
|
||||||
|
if winner == &frst { |
||||||
|
fmt.Println("Твой боец победил!") |
||||||
|
} else { |
||||||
|
fmt.Println("Твой боец проиграл!") |
||||||
|
} |
||||||
|
|
||||||
|
fmt.Printf("Победил %v, у него осталось %d HP\n", winner.Name(), winner.Health()) |
||||||
|
|
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
#+title: Кто победит? |
||||||
|
|
||||||
|
* Что это? |
||||||
|
В нашем реалме недавно запретили все виды соревновательных боев (даже улиточные бои!). Поэтому, мы с друзьями решили попробовать сделать заменитель. Так как заперт касается только физических форм жизни (они могут получить урон), мы решили сделать бои джинов. |
||||||
|
|
||||||
|
К счастью, в наше время джины стали маленькие и безобидные. Им самим весело друг с другом соревноваться, ведь боли они не чувствуют. |
||||||
|
|
||||||
|
А еще это отличный способ разрешить спор: если победил тот герой, на которого поставил первый человек -- он и будет победителем в споре (оставим драку джинам). |
||||||
|
|
||||||
|
* Как запустить |
||||||
|
Клонировать проект =git clone = |
||||||
|
|
||||||
|
#+begin_src emacs-lisp :results none |
||||||
|
|
||||||
|
#+end_src |
Loading…
Reference in new issue