Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881

Для любителей, примитивная, но вполне рабочая змейка в исходниках

11.09.2014, 19:52. Показов 1761. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
для любителей, примитивная, но вполне рабочая змейка в исходниках.
100 строк на растерзание

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
open System
 
type GameState = 
        | Running
        | Quit
 
type Game =
      { snake     : (int * int) list
        food      : (int * int) list
        walls     : (int * int) list
        togrow    : int
        direction : int * int }
 
let H, W, RND, SPEEDINTERVAL = 30, 80, System.Random(), 200
 
let newGame() = 
     { snake       = [(H/2, W/2)]
       direction   = (-1, 0)
       food        = [1..5] |> List.map (fun _ -> (RND.Next H, RND.Next W))
       togrow      = 0
       walls       = List.collect (fun i -> [(i, 0);(i, W-1)]) [0..H-1] 
                   @ List.collect (fun i -> [(0, i);(H-1, i)]) [0..W-1]
                   @ List.map (fun _ -> (RND.Next H, RND.Next W)) [1..15] }
 
let inittail xs togrow  = match togrow, List.rev xs with
                          | 0, h :: t  -> h,  List.rev t, 0
                          | n, h :: t  -> h,  xs, n - 1
                          | _, []      -> failwith "empty list"
let waitKeyPress ()     = System.Console.ReadKey (true) |> ignore
 
let draw txt color (y, x) = 
        Console.CursorLeft <- x 
        Console.CursorTop <- y 
        Console.ForegroundColor <- color
        Console.Write(txt : string)
let draw_snake = draw "O" ConsoleColor.Yellow 
let draw_wall  = draw "Ш" ConsoleColor.Red
let draw_food  = draw "*" ConsoleColor.Green
 
 
let (|HIT|_|) game coord = 
        if List.exists ((=)coord) game.walls
           || List.exists ((=)coord) game.snake then Some coord else None
let (|EAT|_|) game coord = 
        if List.exists ((=)coord) game.food then Some coord else None
 
 
let rec mainloop state = 
        if System.Console.KeyAvailable then
            match Char.ToLower <| System.Console.ReadKey(true).KeyChar with
            | 'w' -> mainloop { state with direction = (-1, 0) }
            | 's' -> mainloop { state with direction = (1, 0) }
            | 'a' -> mainloop { state with direction = (0, -1) }
            | 'd' -> mainloop { state with direction = (0, 1) }
            | 'p' -> GameState.Quit
            | _   -> mainloop state
        else 
        System.Threading.Thread.Sleep SPEEDINTERVAL
        let hh, hw = List.head state.snake
        match hh + fst state.direction, hw + snd state.direction with
        | HIT state head ->
                draw_snake head
                draw "    G A M E   O V E R    " ConsoleColor.Red (H/2, W/2 - 10)
                waitKeyPress()
                GameState.Running
        | EAT state head ->
                let newfood = Seq.initInfinite (fun i -> (RND.Next H, RND.Next W))
                              |> Seq.skipWhile (function HIT state _ | EAT state _ -> true | _ -> false )
                              |> Seq.head
                draw_snake head
                draw_food newfood
                mainloop { state with food = newfood :: List.filter ((<>)head) state.food
                                      snake = head :: state.snake
                                      togrow = 3 + state.togrow }
        | head -> 
                let old, body, newgrow = inittail state.snake state.togrow
                draw " " ConsoleColor.Yellow old
                draw_snake head
                mainloop { state with snake = head :: body
                                      togrow = newgrow }
 
    
let rec run_loop state  = 
        match state with 
        | Running     -> 
                Console.Clear()
                let state = newGame()
                state.food  |> Seq.iter draw_food
                state.walls |> Seq.iter draw_wall
                state.snake |> Seq.iter draw_snake
                waitKeyPress()
                mainloop state |> run_loop
        | Quit        -> ()
 
 
[<EntryPoint>]
let main argv = 
    Console.SetWindowSize(W + 1, H + 1)
    run_loop Running
    0
6
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2014, 19:52
Ответы с готовыми решениями:

Для любителей, примитивная, но вполне рабочая змейка в исходниках - 2
вторая часть марлезонского балета. теперь с акторами open System open System.Collections.Generic type Io = System.Console ...

В Micro Cap не работает вполне рабочая схема
Доброго времени суток. Ситуация такая: решил я помучить MicroCap v10 с целью изучения схемотехники, нашел схему колебательного контура...

delphi архаизм или вполне "рабочая" лошадка?
Тов. как думаете, есть ли смысл на сегодняшний день в написании визуальных программ на delphi, или-же все-таки люди страдают херней, в...

2
Заблокирован
14.09.2014, 20:08
pycture, играть можно только на англ. расскладке
0
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
14.09.2014, 20:28  [ТС]
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
играть можно только на англ. расскладке
ну это легко починить
F#
1
2
3
4
5
6
7
match System.Console.ReadKey(true).Key with
| ConsoleKey.W -> mainloop { state with direction = (-1, 0) }
| ConsoleKey.S -> mainloop { state with direction = (1, 0) }
| ConsoleKey.A -> mainloop { state with direction = (0, -1) }
| ConsoleKey.D -> mainloop { state with direction = (0, 1) }
| ConsoleKey.P -> GameState.Quit
| _   -> mainloop state
там все недочеты (а они есть) легко чинятся
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.09.2014, 20:28
Помогаю со студенческими работами здесь

Примитивная игра "змейка"
Появилась необходимость написать примитивную игру в текстовом режиме. В процессе разработки наткнулся на такую проблему: при движении...

Для любителей Altium
Как бы дорожку провести ? А то как-то все длинно получается. Она одна и последняя. Опыт у меня не большой , а сам &quot;опыт&quot; ( он же...

Для любителей графов
Иван Иванович любит ходить на скачки, надеясь на них заработать кругленькую сумму. Ему приглянулась лошадь с номером K, и он решил...

Для любителей поразмышлять:)
В некотором царстве, в некотором государстве жила-была Почта. И на этой Почте все посылки отправлялись в коробках, которые имели длину,...

Для любителей поразмышлять:)
Есть урна, в которой находится n белых шаров. Вслепую достается шар, перекрашивается в черный цвет и кладется обратно( если шар уже черный,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru