用Node.js实现一个本地的石头剪刀布游戏

简介: 前一段日子学了个石头剪刀布游戏,自己在本地进行了实现,想挂在自己服务器上让他形成一个外网可访问的游戏的时候,出了问题,是接口请求路径不对的问题,现在还不知道什么原因,等解决之后我还会更一下。

前言

前一段日子学了个石头剪刀布游戏,自己在本地进行了实现,想挂在自己服务器上让他形成一个外网可访问的游戏的时候,出了问题,是接口请求路径不对的问题,现在还不知道什么原因,等解决之后我还会更一下。

所需要准备的

  • Node.js环境(没有的可以去官网下一下,傻瓜式安装就好)
  • 基础的html、css、js能力
  • 入门级的Node.js就好(因为我也是这个级别)
  • 一个你熟悉的代码编写工具

开始上手操作

首先我们需要一个html页面来作游戏结果的返回以及玩家操作。

需求分析:

  • 我们需要一个地方来做游戏结果的返回
  • 还需要三个按钮来给用户做操作交互

下面来看index.html文件

<div id="output" style="height: 400px; width: 600px; background: #eee"></div>
<button id="rock" style="height: 40px; width: 80px">石头</button>
<button id="scissor" style="height: 40px; width: 80px">剪刀</button>
<button id="paper" style="height: 40px; width: 80px">布</button>

我定义了一个div,来作为显示游戏结果的地方,定义了三个按钮,分别代表剪刀、石头、布。

接下来我们应该做的就是通过接口的方式,提交我们用户的操作并且获取游戏结果,将他显示在刚刚的div里。

const $button = {
        rock: document.getElementById('rock'),
        scissor: document.getElementById('scissor'),
        paper: document.getElementById('paper')
    }

const $output = document.getElementById('output')

Object.keys($button).forEach(key => {
    $button[key].addEventListener('click', function () {
        fetch(`http://${location.host}/game?action=${key}`)
            .then((res) => {
                return res.text()
            })
            .then((text) => {
                $output.innerHTML += text + '<br/>';
            })
    })
})

之后我们去建立一个game.js文件,写一下游戏的判断逻辑。

module.exports = function (palyerAction){
    if(['rock','scissor','paper'].indexOf(palyerAction) == -1){
        throw new Error('invalid playerAction');
    }
    // 计算出电脑出的结果
    var computerAction;
    var random = Math.random() * 3;
    if(random < 1){
        computerAction = "rock"
    }else if(random > 2){
        computerAction = "scissor"
    }else{
        computerAction = "paper"
    }
    if(computerAction == palyerAction){
        return 0;
    }else if(
        (computerAction == "rock" && palyerAction == "scissor") ||
        (computerAction == "scissor" && palyerAction == "paper") ||
        (computerAction == "paper" && palyerAction == "rock")
    ){
        return -1;
    }else{
        return 1;
    }
}

大致的逻辑很简单,通过随机数让电脑出拳,之后判断胜负并返回。

下面看一下用node.js写的简单交互的地方,index.js

const querystring = require('querystring');
const http = require('http');
const url = require('url');
const fs = require('fs');

const game = require('./game');

let playerWon = 0;

let playerLastAction = null;
let sameCount = 0;

http
    .createServer(function (request, response) {
        const parsedUrl = url.parse(request.url);
        if (parsedUrl.pathname == '/favicon.ico') {
            response.writeHead(200);
            response.end();
            return;
        }
        if (parsedUrl.pathname == '/game') {
            const query = querystring.parse(parsedUrl.query);
            const playerAction = query.action;
            if (playerWon >= 3 || sameCount == 9) {
                response.writeHead(500);
                response.end('我再也不和你玩了!');
                return
            }
            if (playerLastAction && playerAction == playerLastAction) {
                sameCount++;
            } else {
                sameCount = 0;
            }
            playerLastAction = playerAction
            if (sameCount >= 3) {
                response.writeHead(400);
                response.end('你作弊!');
                sameCount = 9;
                return 
            }
            // 执行游戏逻辑
            const gameResult = game(playerAction);
            // 先返回头部
            response.writeHead(200);
            // 根据不同的游戏结果返回不同的说明
            if (gameResult == 0) {
                response.end('平局!');
            } else if (gameResult == 1) {
                response.end('你赢了!');
                // 玩家胜利次数统计+1
                playerWon++;
            } else {
                response.end('你输了!');
            }
        }
        // 如果访问的是根路径,则把游戏页面读出来返回出去
        if (parsedUrl.pathname == '/') {
            fs.createReadStream(__dirname + '/index.html').pipe(response);
        }
    })
    .listen(3000)

在cmd窗口中输入node index.js就可以在浏览器的localhost:3000端口中看见这个游戏啦!

有一些node基础的同学们应该看起来很容易,毕竟我也不咋会emm。

那,来看一下效果吧。

没有做丝毫美化,实在是懒欸。

石头剪刀布1.gif

最后

日后想优化一下,挂到自己服务器上,嘿嘿,好歹是自己做的第一个小游戏~

大家有什么好的建议嘛~
相关文章
|
5月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的使命召唤游戏助手附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的使命召唤游戏助手附带文章和源代码部署视频讲解等
57 5
基于ssm+vue.js+uniapp小程序的使命召唤游戏助手附带文章和源代码部署视频讲解等
|
5月前
|
前端开发 JavaScript Java
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
【JavaScript】JavaScript 防抖与节流:以游戏智慧解锁实战奥秘
62 3
|
2月前
|
移动开发 前端开发 JavaScript
原生JavaScript+canvas实现五子棋游戏_值得一看
本文介绍了如何使用原生JavaScript和HTML5的Canvas API实现五子棋游戏,包括棋盘的绘制、棋子的生成和落子、以及判断胜负的逻辑,提供了详细的代码和注释。
34 0
原生JavaScript+canvas实现五子棋游戏_值得一看
|
3月前
|
JavaScript
JS九行代码实现1~10猜数字游戏
JS九行代码实现1~10猜数字游戏
47 0
|
3月前
|
移动开发 前端开发 JavaScript
2D物理引擎 Box2D for javascript Games -- 番外篇-- (为游戏添加皮肤)
2D物理引擎 Box2D for javascript Games -- 番外篇-- (为游戏添加皮肤)
|
5月前
|
JavaScript 前端开发 算法
设计一个简单的JavaScript版“俄罗斯方块”游戏
【6月更文挑战第16天】构建JavaScript版俄罗斯方块涉及初始化游戏环境、生成与控制方块、处理碰撞消除、游戏结束判断及循环管理。伪代码示例展示了游戏核心逻辑,包括初始化、方块生成、移动、锁定、碰撞检测、行消除、游戏结束条件及状态更新。实际实现需考虑更多细节,如方块形状、动画、音效等。
83 9
|
5月前
|
移动开发 JavaScript 前端开发
Phaser和Three.js是两个非常流行的JavaScript游戏框架,它们各自拥有独特的核心功能和使用场景
【6月更文挑战第16天】Phaser是开源的2D游戏引擎,适合HTML5游戏,提供物理引擎、图像渲染和资源管理,适用于2D游戏,如消消乐。Three.js是基于WebGL的3D库,用于创建复杂的3D场景和应用,涵盖从游戏到可视化领域的多种用途。两者分别在2D和3D开发中展现强大功能,选择取决于项目需求。
73 8
|
5月前
|
缓存 编解码 JavaScript
在JavaScript小游戏开发中,优化游戏性能是非常重要的
【6月更文挑战第16天】JavaScript小游戏性能优化涉及动画流畅度和减少重绘:使用requestAnimationFrame替代定时器;减少DOM操作,利用DocumentFragment或虚拟DOM;Canvas/WebGL高效渲染;压缩图像,使用雪碧图;分层渲染与视口裁剪;Web Workers处理后台计算;缓存计算结果;事件委托;定期性能分析。优化是持续过程,需结合具体需求调整。
70 8
|
5月前
|
JavaScript 前端开发 算法
在JavaScript中,AABB矩形碰撞检测常用于2D游戏
【6月更文挑战第16天】在JavaScript中,AABB矩形碰撞检测常用于2D游戏。通过创建`Rectangle`类并定义`collidesWith`方法检查边界交集,简单高效地判断两个矩形是否相撞。
67 5
|
4月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的使命召唤游戏助手附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的使命召唤游戏助手附带文章源码部署视频讲解等
34 0