js贪吃蛇-简单版

时间:2021-12-05 01:58:17

分享个用原生js写的贪吃蛇,最近在学java,按照当年写的 js的思路,转换成java,换汤不换药

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Language" content="en" />
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<title>title</title>
<style type="text/css">
table{
border: 1px solid gray;
border-collapse:collapse;
}
td{
width:2px;
height:2px;
}
.red{
background-color:black;
}
.black{
background-color: red;
}
</style> <script type="text/javascript" >
(function(window){ function bind( fn, context ) {
if ( typeof context === "string" ) {
var tmp = fn[ context ];
context = fn;
fn = tmp;
} var slice = Array.prototype.slice; // Simulated bind
var args = slice.call( arguments, 2 ),
proxy = function() {
return fn.apply( context, args.concat( slice.call( arguments ) ) );
}; return proxy;
} function extend(o1, o2) {
for (var i in o2) o1[i] = o2[i];
return o1;
} function clog(d){
try{
console.log(d);
}catch(e){};
} function each(obj, callback, args) {
var name,i = 0,
len = obj.length,
isObj = len == undefined;
if(args){
if(isObj){
for(name in obj){
if(callback.apply(obj[name], args) === false ) break;
}
}else{
for(;i < len;){
if(callback.apply(obj[i++], args) === false ) break;
}
}
}else{
if(isObj){
for(name in obj){
if(callback.call(obj[name], name, obj[name]) === false ) break;
}
}else{
for(;i < len;){
if(callback.call(obj[i], i, obj[i++]) === false ) break;
}
}
}
}
function range(m, n) {
var arr = [];
for(;m <= n; m++){
arr[m] = m;
}
return arr;
}
var css = {
hasClass: function(a, b) {
return RegExp("\\b" + b + "\\b").test(a.className)
},
addClass: function(a, b) {
if (!this.hasClass(a, b)) a.className = a.className + " " + b
},
removeClass: function(a, b) {
a.className = a.className.replace(RegExp("\\b" + b + "\\b"), "")
}
};
function Snake(conf) {
var conf = extend({
x: 0,
y: 4,
keycode: 39,
move_arr: [[0,0,0],[0,1,1],[0,2,2],[0,3,3]],
food_arr: [],
step: 0,
t_size: 40,
speed: 100
}, conf);
extend(this, conf);
this.init();
};
Snake.prototype.init = function() {
var self = this, timer,
auto = function() {
if(self.x >= 0 && self.x < self.t_size && self.y >= 0 && self.y < self.t_size && self.is_moved()){
self.direct_opt();
timer = setTimeout(auto, self.speed);
}
};
this.last_keycode = this.keycode;
this.allow_arr = range(0, this.t_size * this.t_size - 1);
this.drawTable();
//按下按键
document.onkeydown = function (e){
var _code = (window.event||e).keyCode;
if(self.last_keycode != _code && Math.abs(_code-self.last_keycode) != 2){
self.last_keycode = self.keycode = _code;
}
clearTimeout(timer);
auto();
} var func = bind(this.random_food, this);
each(range(0,8), func);
this.random_food();
auto();
}
Snake.prototype.two2one = function(num, scale) {
scale = scale || this.t_size;
if(typeof num == 'number'){
return [Math.floor(num/scale), num%scale];
}else{
return num[0] * scale + num[1];
}
}
Snake.prototype.is_moved = function() {
var td = this.table.rows[this.x].cells[this.y]
return !css.hasClass(td, 'red');
}
Snake.prototype.random_food = function() {
var self = this,
rand = function(m, n) {
return Math.floor(Math.random() * ( n - m + 1) + m);
},
in_array = function(val, arr) {
var flag = false;
for(var i = 0; i < arr.length; i++){
if(arr[i] == val){
flag = true;
}
}
return flag;
},
get_no_moved_arr = function() {
var tmp_arr = [],moved_arr = self.move_arr,
arr = [], f_arr, move_num, moved_str;
if(self.food_arr.length > 0) {
moved_arr = moved_arr.concat(self.food_arr);
}
for(var i = 0; i < self.move_arr.length; i++) {
tmp_arr.push(self.move_arr[i][2]);
}
moved_str = ',' + tmp_arr.join(',') + ',';
for(var i = 0; i < self.allow_arr.length; i++) {
if(moved_str.indexOf(',' + self.allow_arr[i] + ',') === -1) {
arr.push(self.allow_arr[i]);
}
}
move_num = arr[rand(0, arr.length - 1)];
f_arr = self.two2one(move_num)
self.food_arr.push(f_arr.concat(move_num));
return f_arr;
},
no_moded_arr = get_no_moved_arr();
var rand_handler = this.table.rows[no_moded_arr[0]].cells[no_moded_arr[1]];
css.addClass(rand_handler, 'black');
}
Snake.prototype.drowSnake = function() {
for(var i = 0; i < this.move_arr.length; i++){
var cur = this.move_arr[i],
cur_handler = this.table.rows[cur[0]].cells[cur[1]];
if(!css.hasClass(cur_handler, 'red')){
css.addClass(cur_handler, 'red');
}
}
}
Snake.prototype.drawTable = function() {
document.body.innerHTML = 'total score: <span id="score">0</span>';
var table = document.createElement('table');
this.table = table;
for(var i = 0; i < this.t_size; i++){
var row = table.insertRow(0);
for(var j = 0; j < this.t_size; j++){
row.insertCell(0);
}
}
this.score = document.getElementById('score');
document.body.appendChild(table); this.drowSnake();
}
Snake.prototype.direct_opt = function() {
this.move_arr.push([this.x, this.y, this.two2one([this.x, this.y], this.t_size - 1)]);
this.drowSnake();
var next_pos = this.table.rows[this.x].cells[this.y];
if(this.step++ && !css.hasClass(next_pos, 'black')){
var last_pos = this.move_arr.shift();
css.removeClass(this.table.rows[last_pos[0]].cells[last_pos[1]], 'red');
}
if(css.hasClass(next_pos, 'black')){
css.removeClass(next_pos, 'black');
this.score.innerHTML = parseInt(this.score.innerHTML) + 10;
this.food_arr.shift();
this.random_food(); if(this.speed >80 && (this.move_arr.length - 4) % 10 == 0) {
this.speed *= 0.9;
}
}
switch(+this.keycode){
case 37:
this.y--;
break;
case 38:
this.x--;
break;
case 39:
this.y++;
break;
default:
this.x++;
}
}
Snake.prototype.drawTable1 = function() {
var str = '',
tr = [];
for(var i = 0; i < this.t_size; i++){
var td = [];
for(var j = 0; j < this.t_size; j++){
td.push('<td></td>');
}
tr.push('<tr>' + td.join('') + '</tr>');
}
str = '<table>' + tr.join('') + '</table>';
document.body.innerHTML = str;
}
window.Snake = Snake;
})(window);
window.onload = function() {
new Snake();
}
</script>
</head>
<body >
</body>
</html>

效果

js贪吃蛇-简单版

js贪吃蛇-简单版的更多相关文章

  1. 原生js写的贪吃蛇网页版游戏特效

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <bo ...

  2. 原生Js贪吃蛇游戏实战开发笔记

    前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...

  3. JS贪吃蛇游戏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  4. c&sol;c&plus;&plus; 贪吃蛇控制台版

    贪吃蛇控制台版(操作系统win7 64位:编译环境gcc, vs2017通过,其它环境未测试 不保证一定通过) 运行效果: #include <iomanip> #include < ...

  5. JS贪吃蛇小游戏

    效果图展示: 具体实现代码如下: (1)html部分 !DOCTYPE html> <html> <head> <meta charset="utf-8& ...

  6. js贪吃蛇(构造函数)

    给大家分享一下这几天我研究的一个贪吃蛇,挺简单的,但是实现起来其实有点绕的,我给大家附上完整代码,一起分析学习一下,主要用的是构造函数. 思想: .设计蛇:属性有宽.高.方向.状态(有多少节),方法: ...

  7. HTML5&plus;CSS&plus;JS 贪吃蛇demo

    我写博客的主要目的就是温习所学的知识,自己以前写的游戏当然不能放过! 这款网页版贪吃蛇是大一下册学习网页前端时老师教我们写的,由于那个时候初学网页前端,所以这款游戏是纯原生Java Script写的, ...

  8. Java经典小游戏——贪吃蛇简单实现(附源码)

    一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...

  9. js贪吃蛇源码

    1.注意,自己引入jquery,这个demo基于jquery的,我的jquery是写的本地的 2.没有写注释,看不懂的再问我吧, <!DOCTYPE html><html> & ...

随机推荐

  1. 史上最详细的iOS之事件的传递和响应机制

    前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...

  2. MinStack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  3. Asp&period;net获取用户真实Ip地址

    /// <summary> /// 获取远程访问用户的Ip地址 /// </summary> /// <returns>返回Ip地址</returns> ...

  4. Python脚本控制的WebDriver 常用操作 &lt&semi;一&gt&semi; 启动浏览器

    由于本人的学习定位是基于Selenium+WebDriver+Python+FireFox+Eclipse+Pydev, 所以我的笔记也只和这方面相关. 我打算先学习基于Python脚本WebDriv ...

  5. 第十一章、认识与学习 BASH 管线命令 &lpar;pipe&rpar;

    管线命令使用『 | 』界定符号 [root@www ~]# ls -al /etc | less 管线命令『 | 』仅能处理经由前面一个命令传来的正确信息,也就是 standard output 的信 ...

  6. FileSystemWatcher使用方法具体解释

    FileSystemWatcher控件主要功能: 监控指定文件或文件夹的文件的创建.删除.修改.重命名等活动.能够动态地定义须要监控的文件类型及文件属性修改的类型. 1.经常使用的几个基本属性: (1 ...

  7. 五分钟秒懂Java日志组件

    Java中有许多种日志记录方式,有些API有占位符,有些API没占位符,初学的人可能会搞不清楚这些日志组件的由来.我一开始的时候也是很懵逼的,后来一点点弄懂了于是就又了这篇文章. 在Java中进行日志 ...

  8. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&amp&semi;源码&lpar;A&period;高斯消元,D&comma;模拟,E&comma;前缀和,F&comma;LCS,H&comma;Prim算法,I&comma;胡搞,J&comma;树状数组&rpar;

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  9. asp&period;net动态添加控件学习

    看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...

  10. python正则匹配示例

    text="山东省临沂市兰山区 市委大院中区21号楼4单元 276002 奥特曼1号 18254998111" #匹配手机号 m=re.findall(r"1\d{10} ...