Browse Source

Initial commit

master
Дмитрий 2 years ago
commit
4db0259bf0
  1. 5
      Makefile
  2. 4
      cmd/fight_club/fighter/data/int_punches.json
  3. 3002
      cmd/fight_club/fighter/data/names.json
  4. 17
      cmd/fight_club/fighter/data/str_punches.json
  5. 74
      cmd/fight_club/fighter/fighter.go
  6. 96
      cmd/fight_club/fighter/fighting.go
  7. 25
      cmd/fight_club/fighter/names.go
  8. 47
      cmd/fight_club/main.go
  9. 3
      go.mod
  10. 15
      readme.org

5
Makefile

@ -0,0 +1,5 @@
run:
go run cmd/fight_club/main.go
compile:

4
cmd/fight_club/fighter/data/int_punches.json

@ -0,0 +1,4 @@
[
{"name": "Разговор о квадратичной сложности", "damage": 5},
{"name": "Принципы Гегеля", "damage": 8}
]

3002
cmd/fight_club/fighter/data/names.json

File diff suppressed because it is too large Load Diff

17
cmd/fight_club/fighter/data/str_punches.json

@ -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}
]

74
cmd/fight_club/fighter/fighter.go

@ -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
}

96
cmd/fight_club/fighter/fighting.go

@ -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)
}
}

25
cmd/fight_club/fighter/names.go

@ -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
}

47
cmd/fight_club/main.go

@ -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())
}

3
go.mod

@ -0,0 +1,3 @@
module fight_club
go 1.18

15
readme.org

@ -0,0 +1,15 @@
#+title: Кто победит?
* Что это?
В нашем реалме недавно запретили все виды соревновательных боев (даже улиточные бои!). Поэтому, мы с друзьями решили попробовать сделать заменитель. Так как заперт касается только физических форм жизни (они могут получить урон), мы решили сделать бои джинов.
К счастью, в наше время джины стали маленькие и безобидные. Им самим весело друг с другом соревноваться, ведь боли они не чувствуют.
А еще это отличный способ разрешить спор: если победил тот герой, на которого поставил первый человек -- он и будет победителем в споре (оставим драку джинам).
* Как запустить
Клонировать проект =git clone =
#+begin_src emacs-lisp :results none
#+end_src
Loading…
Cancel
Save