前端js--剪刀石头布

news2025/1/19 17:01:43

效果图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link
      rel="stylesheet"
      href="https://use.fontawesome.com/releases/v5.11.2/css/all.css"
    />
    <link rel="stylesheet" href="style.css" />
    <title>石头剪刀布</title>
  </head>
  <body>
    <div class="container">
      <header class="header">
        <h1>石头剪刀布</h1>
        <button id="restart" class="restart-btn">
          重新开始
        </button>
        <div id="score" class="score">
          <p>玩家:0</p>
          <p>电脑:0</p>
        </div>
      </header>
      <h2>请做出你的选择</h2>
      <div class="choices">
        <i id="rock" class="choice fas fa-hand-rock fa-10x"></i>
        <i id="paper" class="choice fas fa-hand-paper fa-10x"></i>
        <i id="scissors" class="choice fas fa-hand-scissors fa-10x"></i>
      </div>
    </div>

    <!-- modal -->
    <div class="modal">
      <div id="result" class="modal-content"></div>
    </div>
    <script src="main.js"></script>
  </body>
</html>
:root {
  --primary-color: #003699;
  --dark-color: #333333;
  --light-color: #f4f4f4;
  --lose-color: #dc3545;
  --win-color: #28a745;
  --modal-duration: 1s;
}

* {
  box-sizing: border-box;
  padding: 0;
  margin: 0;
}

body {
  font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
  line-height: 1.6;
  background-color: #fff;
  color: #333;
}

.container {
  max-width: 1100px;
  margin: auto;
  overflow: hidden;
  padding: 0 2rem;
  text-align: center;
}

.restart-btn {
  display: none;
  background: var(--light-color);
  color: #333;
  padding: 0.4rem 1.3rem;
  font-size: 1rem;
  cursor: pointer;
  outline: none;
  border: none;
  margin-bottom: 1rem;
}

.restart-btn:hover {
  background: var(--primary-color);
  color: #fff;
}

.header {
  text-align: center;
  margin: 1rem 0;
}

.header h1 {
  margin-bottom: 1rem;
}

.score {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  font-size: 1.2rem;
  color: #fff;
}

.score p:first-child {
  background: var(--primary-color);
}

.score p:last-child {
  background: var(--dark-color);
}

.choices {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 2rem;
  margin-top: 3rem;
  text-align: center;
}
.choice {
  cursor: pointer;
}

.choice:hover {
  color: var(--primary-color);
}

.text-win {
  color: var(--win-color);
}

.text-lose {
  color: var(--lose-color);
}
/* modal */
.modal {
  display: none;
  position: fixed;
  z-index: 1;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  overflow: auto;
  background: rgba(0, 0, 0, 0.5);
  animation-name: modalopen;
  animation-duration: var(--modal-duration);
}
.modal-content {
  background-color: #fff;
  text-align: center;
  margin: 10% auto;
  width: 350px;
  border-radius: 10px;
  padding: 3rem;
  box-shadow: 0 5px 8px 0 rgba(0, 0, 0, 0.2), 0 7px 20px 0 rgba(0, 0, 0, 0.17);
}

.modal-content h1 {
  margin-bottom: 1rem;
}

.modal-content p {
  font-size: 1.2rem;
  margin-top: 1rem;
}

@keyframes modalopen {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}
/* 媒体查询 */
@media (max-width: 700px) {
  .choice {
    font-size: 110px;
  }
}

@media (max-width: 500px) {
  .choice {
    font-size: 80px;
  }
}
// 获取dom节点
const choices = document.querySelectorAll(".choice");
const score = document.getElementById("score");
const result = document.getElementById("result");
const restart = document.getElementById("restart");
const modal = document.querySelector(".modal");
const scoreboard = {
  player: 0,
  computer: 0
};

// play game
function play(e) {
  // 显示重新开始按钮
  restart.style.display = "inline-block";
  // 获取玩家的选择
  const playerChoice = e.target.id;
  // 获得电脑的选择
  const computerChoice = getComputerChoice();

  //   console.log(playerChoice, computerChoice);
  // 决定胜负
  const winner = getWinner(playerChoice, computerChoice);
  console.log(playerChoice, computerChoice, winner);
  showWinner(winner, computerChoice);
}

// getComputerChoice
function getComputerChoice() {
  const rand = Math.random();
  if (rand < 0.33) {
    return "rock";
  } else if (rand <= 0.67) {
    return "paper";
  } else {
    return "scissors";
  }
}

//  getWinner
function getWinner(p, c) {
  if (p === c) {
    return "draw";
  } else if (p === "rock") {
    if (c === "paper") {
      return "computer";
    } else {
      return "player";
    }
  } else if (p === "paper") {
    if (c === "scissors") {
      return "computer";
    } else {
      return "player";
    }
  } else if (p === "scissors") {
    if (c === "rock") {
      return "computer";
    } else {
      return "player";
    }
  }
}

// show winner
function showWinner(winner, computerChoice) {
  if (winner === "player") {
    scoreboard.player++;
    result.innerHTML = `
        <h1 class="text-win">恭喜你,你赢了</h1>
        <p>电脑的选择为</p>
        <i class="fas fa-hand-${computerChoice} fa-10x"></i>
        `;
  } else if (winner === "computer") {
    scoreboard.computer++;
    result.innerHTML = `
    <h1 class="text-lose">抱歉,你输了</h1>
    <p>电脑的选择为</p>
    <i class="fas fa-hand-${computerChoice} fa-10x"></i>
    `;
  } else {
    result.innerHTML = `
    <h1>双方平局</h1>
    <p>电脑的选择为</p>
    <i class="fas fa-hand-${computerChoice} fa-10x"></i>
    `;
  }
  //   显示分数
  score.innerHTML = `
<p>玩家:${scoreboard.player}</p>
<p>电脑:${scoreboard.computer}</p>
`;

  // 显示modal
  modal.style.display = "block";
}

// clearModal
function clearModal(e) {
  if (e.target == modal) {
    modal.style.display = "none";
  }
}
// restartGame
function restartGame() {
  scoreboard.player = 0;
  scoreboard.computer = 0;
  score.innerHTML = `
    <p>玩家:0</p>
    <p>电脑:0</p>
    `;
}
// 事件监听
choices.forEach(choice => choice.addEventListener("click", play));
window.addEventListener("click", clearModal);
restart.addEventListener("click", restartGame);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/843094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智橙全力打造智慧云端,云PDM和BOM系统强强结合

领略现代制造业的无限魅力&#xff0c;云PDM&#xff08;产品数据管理&#xff09;与BOM系统&#xff08;物料清单&#xff09;于智慧云端融汇贯通&#xff0c;一路飞跃&#xff0c;将信息快速传递达至极致。智橙带您深入了解平台功能&#xff0c;以及智橙是如何如何运用云PDM与…

扒一扒smardaten那些让人欲罢不能的服务~

最近常有新粉问睿睿&#xff0c;除了产品&#xff0c;还提供哪些服务呀&#xff1f; 官网上社区版、专业版、企业版、专有版的服务支持到底区别在哪&#xff1f; 别急&#xff0c;睿睿这就给你一一道来&#xff01; smardaten不同版本的服务内容 上上周&#xff0c;睿睿在给新…

在钡铼技术ARM嵌入式控制器上安装Node-RED的详细步骤

嵌入式ARM控制器BL301/BL302系列是工业级坚固型工业控制器&#xff0c;采用NXP的高性能处理器I.MX6ULL&#xff0c;搭配先进的ARM Cortex-A7构架&#xff0c;运行速度高达800MHz&#xff0c;具有高度的稳定性。本产品最高可提供4路RS485/RS232&#xff0c;1路CAN口&#xff0c;…

SpringBoot+Vue实现物流物流中心信息化管理系统

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

Linux系统编程(线程同步 互斥锁)

文章目录 前言一、什么是线程同步二、不使用线程同步访问共享资源可能出现的问题三、互斥锁概念四、互斥锁使用1.初始化线程锁的方式2.使用代码 五、死锁的产生和解决方法1.什么是死锁2.为什么会产生死锁3.怎么解决死锁问题 总结 前言 本篇文章带大家学习线程的同步。 一、什…

【JavaSE】String类中常用的字符串方法(超全)

目录 1.求字符串的长度 2.判断字符串是否为空 3.String对象的比较 3.1 判断字符串是否相同 3.2 比较字符串大小 3.3 忽略大小写比较 4.字符串查找 5.转化 5.1 数值和字符串转化 5.1.1 数字转字符串 valueof 5.1.2 valueOf的其他用法 5.1.3 字符串转数字 5.2 大小写转…

innodb存储引擎探究(一)

mysql 体系结构和存储引擎 数据库&#xff1a;物理操作系统文件或者其他形式的文件 实例&#xff1a;mysql数据库由一个共享内存区和后台进程组成 启动mysql实例时&#xff0c;会读取配置文件&#xff0c;安装以下顺序 mysql体系结构 mysql插件式的一个存储引擎可以根据业务…

如何设置 Eclipse Git 插件中的默认作者和提交者

1、git提交代码时默认带出Windows的系统用户 2、Window->Preferences->Team->Configuration->Add Entry 3、输入键值对&#xff08;user.name要设置的值&#xff09;&#xff08;user.email要设置的值&#xff09;->应用保存 4、应用后&#xff0c;再次提交代码…

【AI赋能】人工智能在自动驾驶时代的应用

自我介绍 我是秋说&#xff0c;研究 人工智能、大数据 等前沿技术&#xff0c;传递 Java、Python 等语言知识。 &#x1f4ac;主页链接&#xff1a;秋说的博客 &#x1f4c6; 学习专栏推荐&#xff1a; 人工智能&#xff1a;创新无限&#x1f4ab; MySQL进阶之路&#x1f3c6…

大数据Flink(五十八):Flink on Yarn的三种部署方式介绍

文章目录 Flink on Yarn的三种部署方式介绍 一、​​​​​​​Session模式

Elasticsearch 摄取管道 — 检测到管道的死循环

在数据处理和摄取领域&#xff0c;管道在组织和自动化数据从源到目的地的流动方面发挥着至关重要的作用。 管道是数据按顺序通过的一系列处理阶段&#xff0c;每个阶段负责特定任务。 然而&#xff0c;有时&#xff0c;管道可能会遇到一个重大挑战&#xff0c;称为 “Cycle det…

年薪54840美元|中医学应届博士受聘美国宾大博士后职位

E博士的个人规划是博士毕业即出国做博后工作&#xff0c;当其明确毕业时间后&#xff0c;我们就依照计划提前9个月开始了申请操作。最终落实了宾夕法尼亚大学医学院的博后职位&#xff0c;年薪为54840美元&#xff0c;我们为其实现了毕业即出国的愿望。 E博士背景&#xff1a; …

状态模式(C++)

定义 允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。 应用场景 在软件构建过程中&#xff0c;某些对象的状态如果改变&#xff0c;其行为也会随之&#xff0c;而发生变化&#xff0c;比如文档处于只读状态&#xff0c;其支持的行为和读写…

【Spring】Bean的作用域和生命周期

目录 一、引入案例来探讨Bean的作用域 二、Bean的作用域 2.1、Bean的6种作用域 2.2、设置Bean的作用域 三、Spring的执行流程 四、Bean的声明周期 1、生命周期演示 一、引入案例来探讨Bean的作用域 首先我们创建一个User类&#xff0c;定义一个用户信息&#xff0c;在定义…

线程池监控

如何监控线程池 文章目录 如何监控线程池线程池两个点需要监控第一点:线程的变化情况第二点:任务的变化 用来监控线程变化的方法自定义一个带监控的线程池,然后继承ThreadPoolExecutor,重载构造方法 自定义线程池中线程的名称的4种方式Spring 框架提供的 CustomizableThreadFac…

uniapp 微信小程序 上下滚动的公告通知(只取前3条)

效果图&#xff1a; <template><view class"notice" click"policyInformation"><view class"notice-icon"><image mode"aspectFit" class"img" src"/static/img/megaphone.png"></i…

行业追踪,2023-08-07

自动复盘 2023-08-07 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

0807|IO进程线程day9 IPC对象概念及示例(消息队列、共享内存、信号灯集)

0 什么是IPC机制 概念&#xff1a; IPC机制&#xff1a;Inter Process Communication&#xff0c;即进程间通信机制。 进程与进程间的用户空间相互独立&#xff0c;内核空间共享。所以如果要实现进程间的通信&#xff0c;需要使用进程间通信机制。 分类&#xff08;3类…

资深测试总结,Web自动化测试POM设计模式封装框架,看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 线性脚本 import…

Maven分模块-继承-聚合-私服的高级用法

Maven分模块-继承-聚合-私服的高级用法 JavaWeb知识&#xff0c;介绍Maven的高级用法&#xff01;&#xff01;&#xff01; 文章目录 Maven分模块-继承-聚合-私服的高级用法1. 分模块设计与开发1.1 介绍1.2 实践1.2.1 分析1.2.2 实现 1.3 总结 2. 继承与聚合2.1 继承2.1.1 继承…