Дмитрий
2 years ago
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