typescript 贪吃蛇[学习过程中,模仿的一个例子]

代码实现ts:  1 ‘use strict‘
  2 module Main {
  3
  4     const FloorType = {
  5         space: "space",
  6         snack: "body",
  7         food: "food"
  8     }
  9     const enum Direction {
 10         left = 37,
 11         up = 38,
 12         right = 39,
 13         down = 40
 14     }
 15     interface Block {
 16         pos: Pos
 17         type: string
 18         node: HTMLElement
 19
 20     }
 21     interface Pos {
 22         x: number
 23         y: number
 24     }
 25     let score: number = 0;
 26     export class FLoor {
 27
 28         private table: HTMLTableElement
 29         public row: number
 30         public col: number
 31         public blocks: Block[]
 32         private parent: HTMLElement
 33         constructor(options?) {
 34             console.log(options);
 35             options = options || {};
 36             this.table = document.createElement("table");
 37             this.parent = options.parent || document.body;
 38             this.row = options.row || 20;
 39             this.col = options.col || 20;
 40             this.blocks = [];
 41         }
 42         DrawFloor() {
 43
 44             for (let i = 0; i < this.row; i++) {
 45                 let tr = <HTMLTableRowElement>this.table.insertRow(-1);
 46                 for (let k = 0; k < this.col; k++) {
 47                     let td = <HTMLTableCellElement>tr.insertCell(-1);
 48                     td.className = FloorType.space;
 49                     let block: Block = {
 50                         pos: { x: k, y: i },
 51                         type: FloorType.space,
 52                         node: td
 53                     }
 54                     this.blocks.push(block);
 55                 }
 56             }
 57             this.parent.appendChild(this.table);
 58
 59         }
 60         DrawGameOver() {
 61             let div = document.createElement("div");
 62             div.className = "gameover";
 63             div.innerHTML = "Game Over score:" + score;
 64             div.style.top = this.row * 20 / 2 - 50 + "px";
 65             div.style.left = this.row * 20 / 2 - 100 + "px";
 66             this.parent.appendChild(div);
 67
 68         }
 69
 70         ReDraw(blocks: Block[]) {
 71
 72             blocks.forEach((block) => { block.node.className = block.type })
 73         }
 74     }
 75     export class Snack {
 76
 77         private len: number;
 78         private speed: number;
 79         private bodies: Block[];
 80         private direction: Direction;
 81         private floor: FLoor;
 82         private timer?: number;
 83         constructor(floor: FLoor, options?) {
 84             options = options || {};
 85             this.len = options.len || 3;
 86             this.speed = options.speed || 60;
 87             this.direction = options.direction || Direction.right;
 88             this.floor = options.floor || floor;
 89             this.bodies = [];
 90         }
 91         DrawSnack() {
 92
 93             let setDirection = (e: KeyboardEvent): void => {
 94                 const keycode = e.keyCode;
 95                 switch (keycode) {
 96                     case Direction.left:
 97                         if (this.direction !== Direction.right) {
 98                             this.direction = Direction.left;
 99                         }
100                         break;
101
102                     case Direction.right:
103                         if (this.direction !== Direction.left) {
104                             this.direction = Direction.right;
105                         }
106                         break;
107                     case Direction.up:
108                         if (this.direction !== Direction.down) {
109                             this.direction = Direction.up;
110                         }
111                         break;
112                     case Direction.down:
113                         if (this.direction !== Direction.up) {
114                             this.direction = Direction.down;
115                         }
116                         break;
117                 }
118             }
119             document.addEventListener(‘keydown‘, setDirection, false);
120             for (let i = 0; i < this.len; i++) {
121                 this.bodies.push(this.floor.blocks[i]);
122             }
123             this.RandFood();
124             this.bodies.forEach((block) => { block.type = FloorType.snack });
125             this.floor.ReDraw(this.bodies);
126             this.timer = setInterval(() => { this.Move() }, this.speed);
127         }
128         RandFood() {
129
130             let p: Pos = {
131                 x: Math.ceil(this.floor.col * Math.random()),
132                 y: Math.ceil(this.floor.row * Math.random()),
133             }
134             let food = this.floor.blocks.filter((block) => {
135                 if (block.pos.x == p.x && block.pos.y == p.y) {
136                     return true;
137                 }
138             });
139             food[0].type = FloorType.food;
140             this.floor.ReDraw(food);
141
142
143         }
144         Move() {
145
146             let head: Block = this.bodies[this.bodies.length - 1];
147             let next: Block = this.next(head);
148             if (!next || next.type == FloorType.snack) {
149                 this.Die();
150                 return;
151             }
152             if (next.type == FloorType.food) {
153                 this.bodies.push(next);
154                 next.type = FloorType.snack;
155                 this.floor.ReDraw(this.bodies);
156                 this.RandFood();
157                 next = this.next(this.bodies[this.bodies.length - 1]);
158                 score++;
159             }
160
161             let tail: Block = <Block>this.bodies.shift();
162             tail.type = FloorType.space;
163             next.type = FloorType.snack;
164             this.bodies.push(next);
165             this.floor.ReDraw([tail]);
166             this.floor.ReDraw(this.bodies);
167         }
168         Die() {
169             clearInterval(this.timer);
170             this.floor.DrawGameOver();
171         }
172
173         next(targert: Block): Block {
174             let x: number;
175             let y: number;
176             switch (this.direction) {
177                 case Direction.left:
178                     x = targert.pos.x - 1;
179                     y = targert.pos.y;
180                     break;
181                 case Direction.right:
182                     x = targert.pos.x + 1;
183                     y = targert.pos.y;
184                     break;
185                 case Direction.up:
186                     x = targert.pos.x;
187                     y = targert.pos.y - 1;
188                     break;
189                 case Direction.down:
190                     x = targert.pos.x;
191                     y = targert.pos.y + 1;
192                     break;
193             }
194             return this.floor.blocks.filter((block) => {
195                 if (x == block.pos.x && y == block.pos.y) {
196                     return true;
197                 }
198             })[0];
199
200         }
201
202
203     }
204
205 }
206 let floor=new Main.FLoor({
207
208     parent:document.getElementById("box")
209 });
210 floor.DrawFloor();
211 let snack=new Main.Snack(floor);
212 snack.DrawSnack();html页面
 1 <html lang="en">
 2
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <meta http-equiv="X-UA-Compatible" content="ie=edge">
 7     <title>Document</title>
 8     <style>
 9         table {
10             border-bottom: 1px solid black;
11             border-right: 1px solid black;
12             border-collapse: collapse;
13         }
14
15         td {
16             border-left: 1px solid black;
17             border-top: 1px solid black;
18             padding: 10px;
19
20         }
21
22         .space {
23             background-color: white;
24         }
25
26         .body {
27             background-color: black;
28         }
29
30         .food {
31             background-color: red;
32         }
33         .gameover{
34
35             position: absolute;
36             font-size: 36px;
37             color: aqua;
38             width:200px;
39             text-align: center;
40         }
41         #box{
42             float: left;
43             position: relative;
44
45         }
46     </style>
47 </head>
48
49 <body>
50
51  <div id="box">
52
53  </div>
54  <script src="Snack.js"></script>
55 <!-- <script src="Game.js"></script> -->
56 </body>
57
58 </html>代码下载:发送邮件to:[email protected]

原文地址:https://www.cnblogs.com/xiaotiejiang/p/9233388.html

时间: 2024-10-12 07:01:42

typescript 贪吃蛇[学习过程中,模仿的一个例子]的相关文章

自制贪吃蛇游戏中的几个“大坑”

贪吃蛇游戏已经告一段落了,在完成这个游戏的过程中,我遭遇了许多"坎坷"和"挫折",下面就几个让我印象深刻的"挫折"做一个具体的讲解,以此来为这个贪吃蛇项目画上一个完整句号.(包括打包这个游戏时遇到的问题及解决方式.) BUG1  在运行贪吃蛇游戏时,如果同时按下两个方向键会出现贪吃蛇"莫名其妙"死亡的情况.针对此情况我先是判断贪吃蛇的死亡原因: #贪吃蛇死亡判定 def isdead(self): #条件1--贪吃蛇撞墙 if

mysql中case的一个例子

最近遇到一个问题: year amount num 1991 1 1.1 1991 2 1.2 1991 3 1.3 1992 1 2.1 1992 2 2.2 1992 3 3.3 把上面表格的数据查询成: year m1 m2 m3 1991 1.1 1.2 1.3 1992 2.1 2.2 2.3 看到这样的需求,首先想到的是用case去统计以及 用group by来分组 第一版sql代码: SELECT `year`, (CASE WHEN amount = 1 THEN num END

js+jQuery实现贪吃蛇小游戏

这是我第一次这么认真的去写一个程序.今天老师布置的编程任务是实现一个贪吃蛇的小游戏,一开始感觉很茫然的,因为以前都没有这么系统的去做过一个编程任务.后来理清思路去做,感觉问题也并不是那么的难. 首先,第一步肯定是要编写出我们的的静态页面. 第二步,让我们的贪吃蛇先从一个开始动起来. 第三步,让我们通过键盘去控制他的运动方向. 第四步,让我们去判断我们的贪吃蛇有没有撞墙,有没有吃到自己,因为这已经犯规了. 第五步,给我们的贪吃蛇随机生成一个‘食物’. 第六步,实现每当我们的贪吃蛇吃了一个食物,他都

MFC贪吃蛇

1多人贪吃蛇项目描述 1.1功能描述 实现多人对战贪吃蛇,具体实现功能:A.可以选择游戏人数,最多设置4人同时游戏:B.显示玩家得到的分数:C.可以设置游戏的速度:D.能实现最高分的记录 1.2所需技术 1.在对话框中创建窗口:2.双缓冲绘图:3.蛇身移动处理:4.碰撞检测:5.Ini文件操作 2多人贪吃蛇运行流程 3多人贪吃蛇详细设计 3.1贪吃蛇个体类设计 把贪吃蛇单独的设为一个类,其中包含成员变量如下 BOOL m_bAliveFlg; //蛇当前存活标志 int m_iDirect; /

[C入门 - 游戏编程系列] 贪吃蛇篇(四) - 食物实现

由于食物是贪吃蛇游戏中最简单的一部分,而且和其他部分关联性不强,基本上是一个独立的部分,所以我打算先实现它. 我的想法是食物必须在世界中才能被创造出来,也就是说,先有世界再有食物,所以我得先判断世界是否存在,存在的话才可以创建食物. Food * SNK_CreateFood(World *world, int size) { Food *food; if (world == 0) return 0; if ((food = (Food *)SDL_malloc(sizeof(Food))) =

[C入门 - 游戏编程系列] 贪吃蛇篇(二) - 食物定义

游戏中的食物没有那么多复杂属性,特别是贪吃蛇游戏中,我把食物看待的很简单: 1. 它必须属于世界,才能出现在世界.不可能一个不属于世界的食物,出现在世界中:但是可能存在着一个食物,它属于世界,但是却没有出现在世界中(即食物的颜色和世界的颜色相同,因此看不见食物).这就像鬼一样,它可能存在于这个世界上,但我们看不到它. 2. 一个属于世界的食物,具有在这个世界中的位置. 3. 它有颜色和大小. 因此,食物的结构体定义就显而易见了! typedef struct Food { World *worl

贪吃蛇“大作战”(三)

例程实操与分析 在之前的两篇博客中分别通过面向过程和面向对象的编程思想分析介绍了来自sunny开始学坏的贪吃蛇例程,今天的博客将通过运行这个贪吃蛇例程来了解各行代码的作用,同时通过"找茬"的方式深入分析了解贪吃蛇的运行机制并改善这个例程. 下面是这个贪吃蛇例程的代码: 1 import os,random 2 sw=[[5,5]] 3 #lc=[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6]] 4 lc=[[5,i] for i in range(1

贪吃蛇“大作战”(四)

创建真正的游戏 之前演示的贪吃蛇游戏是以python命令行的形式模拟实现的,今天博客的主题就是是创建一个真正的贪吃蛇游戏,其摆脱了命令行的限制,界面更加美观,人机交互更加方便,可以让玩家有更好的游戏体验. 那么,要如何将贪吃蛇游戏做的更好.一个真正的游戏是通过图形用户界面GUI(Graphical User Interface)来展示的.在python中,要做一个GUI有多种选择,简单的就是easygui模块,进阶版的就是tkinter模块.wxPython模块等:当然,还有些模块虽然不是专门做

贪吃蛇“大作战”(五)

创建真正的游戏(续) 在上一篇博客介绍了pygame模块的安装,并开始通过pygame模块来创建贪吃蛇游戏.在上篇博客中我创建了一个窗体,贪吃蛇游戏将在窗体中运行.同时简单编写了一个退出窗体的事件应对机制,今天的博客将深入学习pygame模块,并一步一步"勾勒"出完整的贪吃蛇游戏. 上篇博客贪吃蛇代码编写到创建贪吃蛇游戏的窗体: import pygame #导入pygame模块 from pygame.locals import * #导入pygame模块中常用的函数和常量,如表示全