html网页游戏别踩白块,如何实现网页版别踩白块的游戏 (代码示例)

本篇文章给大家带来的内容是如何使用如何实现网页版别踩白块的游戏 (代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

自己最近一直想做个小项目,但是自己代码水平太烂了,做不了大系统,索性利用毕生所学写个小游戏,哈哈哈

别踩白块这个游戏相信很多人都在手机上玩过,今天我们就来做一个网页版的,先上一张游戏效果图:

c8d938e8e4dc529478623889e023c591.gif

不同于移动端采用手指触碰,网页版需要我们用鼠标点击黑块,黑块才会消失。刷新页面即可以开始游戏,这个小游戏最重要的部分代码,初学者也能很快看懂。YES~

在开始之前,让我们简单分析下整个游戏的流程:一定的速度下移,点击黑块,黑块消失,新的黑块在普通游戏玩家眼中,应该是游戏开始,黑块以块不断向下移动,若黑块触底则游戏结束;而以我们来说,可以将每一个黑块和白块抽象成一个个的数据结构,黑块的消失和出现其实就是 数据结构的创造和销毁,我们来看一张游戏的流程图,对于要编写的功能有一个大概的了解:

e9f632e1529afbffbed678aa553f708d.png

页面布局

可以用 div+css 布局来实现别踩白块的静态效果展示,直接上 HTML 代码,我来简要说下 HTML

思路,将主界面分解成一个4×4的大矩形格子,每一个方块代表其中一个小的矩形格,其中每一行的四个白块中有一个黑块,每一行中黑块位于那一列是随机生成的,但是我们这里现在是静态页面就自己确定了,然后通过

css 控制样式。

别踩白块

游戏初始化

根据前面的 HTML 部分我们可以知道,每个

就代表一个白块,

class=”cell black”> 就代表一个黑块,每点击一个黑块消失其实是删除了一个

,然后从上面添加一个新的

。所以我们首先要通过 js 来控制

class=”row”> 的创造和生成(记得删除在编写静态页面时候指定生成的4个 div.row)。具体方法如下://创建div, 参数className是其类名

function creatediv(className){

var div = document.createElement('div');

div.className = className;

return div;

}

// 创造一个

并且有四个子节点

function createrow(){

var con = $('con');

var row = creatediv('row'); //创建div className=row

var arr = creatcell(); //定义div cell的类名,其中一个为cell black

con.appendChild(row); // 添加row为con的子节点

for(var i = 0; i < 4; i++){

row.appendChild(creatediv(arr[i])); //添加row的子节点 cell

}

if(con.firstChild == null){

con.appendChild(row);

}else{

con.insertBefore(row, con.firstChild);

}

}

//删除div#con的子节点中最后那个

function delrow(){

var con = $('con');

if(con.childNodes.length == 6) {

con.removeChild(con.lastChild);

}

}

//创建一个类名的数组,其中一个为cell black, 其余为cell

function creatcell(){

var temp = ['cell', 'cell', 'cell', 'cell',];

var i = Math.floor(Math.random()*4);//随机生成黑块的位置

temp[i] = 'cell black';

return temp;

}

让黑块动起来

在可以通过 js 来创造和销毁 div 后,我们就要让黑块动起来,这个时候我们就用到了之前css提到的设定

id=”con”> 隐藏了一行的

,我们通过 js 的 DOM

操作使其向下方移动,并设置定时器每30毫秒移动一次,这样就实现了黑块的平滑移动,在黑块移动的同时,我们要判断黑块是否已经触底,触底则游戏失败,停止调用

move(),触底后调用函数 fail() 游戏失败,具体方法如下://使黑块向下移动

function move(){

var con = $('con');

var top = parseInt(window.getComputedStyle(con, null)['top']);

if(speed + top > 0){

top = 0;

}else{

top += speed;

}

con.style.top = top + 'px';

if(top == 0){

createrow();

con.style.top = '-100px';

delrow();

}else if(top == (-100 + speed)){

var rows = con.childNodes;

if((rows.length == 5) && (rows[rows.length-1].pass !== 1) ){

fail();

}

}

}

function fail(){

clearInterval(clock);

confirm('你的最终得分为 ' + parseInt($('score').innerHTML) );

}

点击黑块事件

让黑块动起来之后呢,就要考虑用户有没有点击到黑块,用户若点击到黑块我们要让所在那一行消失,那么就需要一个 judge 方法,具体如下:

//判断用户是否点击到了黑块,

function judge(ev){

if (ev.target.className.indexOf('black') != -1) {

ev.target.className = 'cell';

ev.target.parentNode.pass = 1; //定义属性pass,表明此行row的黑块已经被点击

score();

}

}

这一步,几个核心的功能点都已经实现了,剩下来的就是将这些方法组合起来,组成完整的逻辑关系。

完整代码

别踩白块

#score{

text-align: center;}

h2 {

text-align: center; }

div{

margin: 0 auto;

width: 100px;

height: 100px;}

#main {

width: 400px;

height: 400px;

background: white;

border: 2px solid gray;

margin: 0 auto;

position: relative;

overflow: hidden;}

#con {

width: 100%;

height: 400px;

position: relative;

top: -100px;

border-collapse:collapse;}

.row{

height: 100px;

width: 100%;}

.cell{

height: 100px;

width: 100px;

float: left;}

.black {

background: black;}

score

0

var clock = null;

var state = 0;

var speed = 4;

/*

* 初始化 init

*/

function init(){

for(var i=0; i<4; i++){

createrow();

}

// 添加onclick事件

$('main').onclick = function(ev){

judge(ev);

}

// 定时器 每30毫秒调用一次move()

clock = window.setInterval('move()', 30);

}

// 判断是否点击黑块

function judge(ev){

if (ev.target.className.indexOf('black') != -1) {

ev.target.className = 'cell';

ev.target.parentNode.pass = 1; //定义属性pass,表明此行row的黑块已经被点击

score();

}

}

// 游戏结束

function fail(){

clearInterval(clock);

confirm('你的最终得分为 ' + parseInt($('score').innerHTML) );

}

// 创建div, className是其类名

function creatediv(className){

var div = document.createElement('div');

div.className = className;

return div;

}

// 创造一个

并且有四个子节点

function createrow(){

var con = $('con');

var row = creatediv('row'); //创建div className=row

var arr = creatcell(); //定义div cell的类名,其中一个为cell black

con.appendChild(row); // 添加row为con的子节点

for(var i = 0; i < 4; i++){

row.appendChild(creatediv(arr[i])); //添加row的子节点 cell

}

if(con.firstChild == null){

con.appendChild(row);

}else{

con.insertBefore(row, con.firstChild);

}

}

// 根据id来get DOM元素

function $(id) {

return document.getElementById(id);

}

// 创建一个类名的数组,其中一个为cell black, 其余为cell

function creatcell(){

var temp = ['cell', 'cell', 'cell', 'cell',];

var i = Math.floor(Math.random()*4);

temp[i] = 'cell black';

return temp;

}

//让黑块动起来

function move(){

var con = $('con');

var top = parseInt(window.getComputedStyle(con, null)['top']);

if(speed + top > 0){

top = 0;

}else{

top += speed;

}

con.style.top = top + 'px';

if(top == 0){

createrow();

con.style.top = '-100px';

delrow();

}else if(top == (-100 + speed)){

var rows = con.childNodes;

if((rows.length == 5) && (rows[rows.length-1].pass !== 1) ){

fail();

}

}

}

// 加速函数

function speedup(){

speed += 2;

if(speed == 20){

alert('你超神了');

}

}

//删除某行

function delrow(){

var con = $('con');

if(con.childNodes.length == 6) {

con.removeChild(con.lastChild);

}

}

// 记分

function score(){

var newscore = parseInt($('score').innerHTML) + 1;

$('score').innerHTML = newscore;

if(newscore % 10 == 0){

speedup();

}

}

init();

相关推荐:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,别踩白块是一款经典的小游戏,下面给出一个使用Java语言编写的简单版别踩白块游戏代码: ```java import java.awt.Color; import java.awt.Graphics; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class DontTapTheWhiteTile extends JPanel implements KeyListener { private static final long serialVersionUID = 1L; private static final int ROWS = 4; private static final int COLS = 4; private static final int TILE_SIZE = 100; private static final int BORDER_WIDTH = 10; private static final int SCREEN_WIDTH = COLS * (TILE_SIZE + BORDER_WIDTH) + BORDER_WIDTH; private static final int SCREEN_HEIGHT = ROWS * (TILE_SIZE + BORDER_WIDTH) + BORDER_WIDTH; private int[][] tiles; private int currentRow; private int currentCol; private boolean gameOver; public DontTapTheWhiteTile() { tiles = new int[ROWS][COLS]; for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { tiles[row][col] = (row * COLS + col) % 2; // 0 for black, 1 for white } } currentRow = ROWS - 1; currentCol = 0; gameOver = false; setPreferredSize(new Dimension(SCREEN_WIDTH, SCREEN_HEIGHT)); addKeyListener(this); setFocusable(true); } public void paintComponent(Graphics g) { super.paintComponent(g); for (int row = 0; row < ROWS; row++) { for (int col = 0; col < COLS; col++) { if (tiles[row][col] == 0) { // black tile g.setColor(Color.BLACK); } else { // white tile g.setColor(Color.WHITE); } g.fillRect(col * (TILE_SIZE + BORDER_WIDTH) + BORDER_WIDTH, row * (TILE_SIZE + BORDER_WIDTH) + BORDER_WIDTH, TILE_SIZE, TILE_SIZE); } } } public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_LEFT) { if (currentCol > 0) { if (tiles[currentRow][currentCol - 1] == 1) { // stepped on white tile gameOver = true; } else { currentCol--; } } } else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { if (currentCol < COLS - 1) { if (tiles[currentRow][currentCol + 1] == 1) { // stepped on white tile gameOver = true; } else { currentCol++; } } } else if (e.getKeyCode() == KeyEvent.VK_UP) { if (currentRow > 0) { if (tiles[currentRow - 1][currentCol] == 1) { // stepped on white tile gameOver = true; } else { currentRow--; } } } else if (e.getKeyCode() == KeyEvent.VK_DOWN) { if (currentRow < ROWS - 1) { if (tiles[currentRow + 1][currentCol] == 1) { // stepped on white tile gameOver = true; } else { currentRow++; } } } repaint(); if (gameOver) { removeKeyListener(this); } } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } public static void main(String[] args) { JFrame frame = new JFrame("Don't Tap The White Tile"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); DontTapTheWhiteTile panel = new DontTapTheWhiteTile(); frame.getContentPane().add(panel); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); panel.requestFocusInWindow(); } } ``` 这个游戏的界面是一个4x4的格子,格子上随机摆放着黑色和白色的方块。玩家通过控制一个小人在格子上移动,避免踩到白色方块。玩家可以通过上、下、左、右键控制小人移动。如果小人踩到了白色方块,游戏结束。 这个游戏实现是一个继承了JPanel的类。在这个类中,我们通过维护一个二维数组来表示格子上的方块,并在paintComponent方法中根据方块的颜色来绘制格子。玩家的移动通过实现KeyListener接口中的方法来响应,如果玩家踩到了白色方块,就设置gameOver标志为true,并从面板上移除KeyListener,停止游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值