angular舒尔特方格

说明:我计划用angular实现舒尔特方格的功能,必须是动态的,比如33,55,9*9,而且无论是什么样式的,都必须保持正方形,然后还有时间监听,计算用户完成方格的时间,

另外,我还需要优化ui样式,让它变得好看,增加背景,圆角和悬停效果,还可以加一点小动画,让它看起来更加美观,下面给出完整代码
效果图:
在这里插入图片描述

step1: C:\Users\Administrator\WebstormProjects\untitled4\src\app\schulte\schulte.component.ts

import { Component ,OnDestroy,OnInit} from '@angular/core';
import {NgForOf, NgIf} from '@angular/common';

@Component({
  selector: 'app-schulte',
  imports: [NgForOf, NgIf],
  templateUrl: './schulte.component.html',
  styleUrl: './schulte.component.css'
})
export class SchulteComponent  implements OnDestroy,OnInit{

  gridSize = 4;
  numbers: number[] = [];
  currentNumber = 1;
  timeUsed = 0;
  isStarted = false;
  private timer: number | undefined;
  gridStyle = {};

  ngOnInit() {
    this.initializeGame();
    this.updateGridStyle();
  }

  private initializeGame() {
    const size =this.gridSize ** 2;
    this.numbers = Array.from({ length: size }, (_, i) => i + 1);

    // Fisher-Yates shuffle
    for (let i = this.numbers.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      [this.numbers[i], this.numbers[j]] = [this.numbers[j], this.numbers[i]];
    }
  }

  updateGridStyle() {
    const cellSizePercentage = 100 / this.gridSize;
    const fontSize = Math.min(4 / this.gridSize, 1.2);

    this.gridStyle = {
      'gridTemplateColumns': `repeat(${this.gridSize}, 1fr)`,
      'fontSize': `${fontSize}rem`
    };
  }

  startGame() {
    this.clearTimer();
    this.isStarted = true;
    this.currentNumber = 1;
    this.timeUsed = 0;

    this.timer = window.setInterval(() => {
      this.timeUsed++;
    }, 1000);
  }

  handleClick(num: number) {
    if (!this.isStarted) return;

    if (num === this.currentNumber) {
      this.currentNumber++;
      if (this.currentNumber > this.gridSize ** 2) {
        this.gameComplete();
      }
    } else {
      this.handleError();
    }
  }

  private gameComplete() {
    this.clearTimer();
    alert(`🎉 完成时间: ${this.timeUsed}`);
    this.isStarted = false;
    this.initializeGame();
  }

  private handleError() {
    this.clearTimer();
    this.isStarted = false;
    alert('❌ 点错数字,重新开始!');
    this.initializeGame();
  }

  private clearTimer() {
    if (this.timer) {
      clearInterval(this.timer);
      this.timer = undefined;
    }
  }

  ngOnDestroy() {
    this.clearTimer();
  }


}

step2: C:\Users\Administrator\WebstormProjects\untitled4\src\app\schulte\schulte.component.html

<div class="game-container">
  <button *ngIf="!isStarted"
          class="start-btn"
          (click)="startGame()">
    🚀 开始挑战
  </button>

  <div class="status-box">
    <div class="status-item">
      <span class="label">当前数字</span>
      <span class="value">{{ currentNumber }}</span>
    </div>
    <div class="status-item">
      <span class="label">用时</span>
      <span class="value">{{ timeUsed }}s</span>
    </div>
  </div>

  <div class="grid" [style]="gridStyle">
    <button
      *ngFor="let num of numbers"
      (click)="handleClick(num)"
      [disabled]="!isStarted"
      class="grid-btn"
      [class.active]="num === currentNumber"
    >
      {{ num }}
    </button>
  </div>
</div>

step3: C:\Users\Administrator\WebstormProjects\untitled4\src\app\schulte\schulte.component.css

.game-container {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.5rem;
  padding: 2rem;
  background: #f8f9fa;
  border-radius: 1.5rem;
  box-shadow: 0 8px 30px rgba(0,0,0,0.1);
  max-width: 95vw;
  margin: 2rem auto;
}

.start-btn {
  padding: 1rem 2.5rem;
  font-size: 1.2rem;
  background: linear-gradient(135deg, #6366f1, #8b5cf6);
  color: white;
  border: none;
  border-radius: 0.75rem;
  cursor: pointer;
  transition: transform 0.2s, box-shadow 0.2s;
}

.start-btn:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 15px rgba(99, 102, 241, 0.3);
}

.status-box {
  display: flex;
  gap: 2rem;
  padding: 0.8rem 1.5rem;
  background: white;
  border-radius: 0.75rem;
  box-shadow: 0 2px 8px rgba(0,0,0,0.05);
}

.status-item {
  display: flex;
  flex-direction: column;
  align-items: center;
}

.label {
  font-size: 0.9rem;
  color: #6b7280;
}

.value {
  font-size: 1.2rem;
  font-weight: 600;
  color: #1f2937;
}

.grid {
  display: grid;
  gap: 0.5rem;
  width: 80vmin;
  height: 80vmin;
  max-width: 600px;
  max-height: 600px;
  padding: 1rem;
  background: white;
  border-radius: 1rem;
  box-shadow: inset 0 2px 8px rgba(0,0,0,0.05);
}

.grid-btn {
  aspect-ratio: 1;
  border: none;
  border-radius: 0.5rem;
  background: linear-gradient(145deg, #f3f4f6, #e5e7eb);
  color: #1f2937;
  font-weight: 600;
  cursor: pointer;
  transition: all 0.2s;
}

.grid-btn:hover:not(:disabled) {
  background: linear-gradient(145deg, #e5e7eb, #d1d5db);
  transform: scale(1.03);
  box-shadow: 0 2px 6px rgba(0,0,0,0.1);
}

.grid-btn.active {
  background: linear-gradient(145deg, #c7d2fe, #a5b4fc);
  color: #4338ca;
  transform: scale(0.98);
}

.grid-btn:disabled {
  opacity: 0.7;
  cursor: not-allowed;
}

end

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升数据洞察力:五款报表软件助力企业智能决策

概述 随着数据量的激增和企业对决策支持需求的提升&#xff0c;报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告&#xff0c;并将数据可视化&#xff0c;从而推动更智能的决策过程。 1. 山海鲸报表 概述&#xff1a; 山海鲸报表…

DistilQwen2.5发布:通义千问蒸馏小模型再升级

01 引言 因高计算成本和复杂性&#xff0c;在例如移动设备和边缘计算场景等资源有限的环境中&#xff0c;限制了大语言模型的普及。如何在保留模型性能的同时提高计算效率并降低部署成本&#xff0c;已成为研究和工业界必须面对的关键挑战。 在此背景下&#xff0c;我们正式…

VS2022配置FFMPEG库基础教程

1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年&#xff0c;由法国工程师Fabrice Bellard主导开发&#xff0c;其名称源自"Fast Forward MPEG"&#xff0c;初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护&#xff0c;逐步发展成为包含音视频采…

【前端基础】Day 1 HTML

总结&#xff1a; 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

Android Realm数据库使用与集成指南

本地存储storage集成创建Realm数据模型插入和更新数据模型数据查询统计数据分页查询处理表数据删除操作总结Realm 是一款专为移动端和嵌入式场景设计的高性能、跨平台的 对象数据库(NoSQL),由 MongoDB 团队维护。它的核心思想是将数据模型直接映射到对象(如 Java/Kotlin、S…

(九)趣学设计模式 之 桥接模式!

目录 一、 啥是桥接模式&#xff1f;二、 为什么要用桥接模式&#xff1f;三、 桥接模式的实现方式四、 桥接模式的优缺点五、 桥接模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

Day8 蓝桥杯acw讲解

首先先给大家看一道这个题&#xff0c; 我真的是太喜欢y总了&#xff0c;如果大家也是最近在准备蓝桥杯或者计算机相关的比赛&#xff0c;但是得加一个前提就是必须最好基础真的很好&#xff0c;要不然其实买了课&#xff0c;也没啥太大的用处&#xff0c;其实就可以以我本人举…

谷云科技iPaaS×DeepSeek:构建企业智能集成的核心底座

2025年&#xff0c;DeepSeek大模型的爆发式普及&#xff0c;正引领软件行业实现 “智能跃迁”。从代码生成到系统集成&#xff0c;从企业级应用到消费级产品&#xff0c;自然语言交互能力已成为新一代软件的核心竞争力。据行业分析&#xff0c;超60%的软件企业已启动大模型适配…

java面试项目介绍,详细说明

金三银四少走弯路,Java岗面试冲刺,你与大厂只差这篇文章包括面试准备,帮助大家少走弯路,成功入职大厂,并快速成长落地。 祝大家拿到满意的offer!(把许愿的offer发在评论区,一定会实现的) 主要从四大方面:掌握的主要知识、算法、项目、简历 掌握的主要知识 下面是我看过的资料和…

计算机毕业设计SpringBoot+Vue.js墙绘产品展示交易平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

springboot005学生心理咨询评估系统(源码+数据库+文档)

源码地址&#xff1a;学生心理咨询评估系统 文章目录 1.项目简介2.部分数据库结构与测试用例3.系统功能结构4.包含的文件列表&#xff08;含论文&#xff09;后台运行截图 1.项目简介 ​ 使用旧方法对学生心理咨询评估信息进行系统化管理已经不再让人们信赖了&#xff0c;把现…

Linux红帽:RHCSA认证知识讲解(二)配置网络与登录本地远程Linux主机

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;二&#xff09;配置网络与登录本地远程Linux主机 前言一、使用命令行&#xff08;nmcli 命令&#xff09;配置网络&#xff0c;配置主机名第一步第二步修改主机名称 二、使用图形化界面&#xff08;nmtui 命令&#xff09;配…

【运维】内网服务器借助通过某台可上外网的服务器实现公网访问

背景&#xff1a; 内网服务器无法连接公网,但是办公电脑可以连接内网服务器又可以连接公网。 安装软件 1、frp 2、ccproxy 配置 1、内网服务器 # 内网服务器启动frp服务配置文件参考vi frps.ini# frps.ini [common] bind_port 7000# 备注: bind_port端口可以随意配置。配置完…

Pytorch实现论文:基于多尺度融合生成对抗网络的水下图像增强

简介 简介:提出了一种新型的水下图像增强算法,基于多尺度融合生成对抗网络,名为UMSGAN,以解决低对比度和颜色失真的问题。首先经过亮度的处理,将处理后的图像输入设计的MFFEM模块和RM模块生成图像。该算法旨在适应各种水下场景,提供颜色校正和细节增强。 论文题目:Und…

基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知

写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 &#x1f603;,生活加油 我站在人潮中央&#xff0c;思考这日日重复的生活。我突然想&#xff0c…

ShenNiusModularity项目源码学习(12:ShenNius.Common项目分析)

ShenNius.Common项目中主要定义功能性的辅助函数类及通用类&#xff0c;供MVC模式、前后端分离模式下的后台服务使用&#xff0c;以提高编程效率。   ApiResult文件内的ApiResult和ApiResult类定义了通用的数据返回格式&#xff0c;包括状态码、返回消息、返回数据等&#x…

【Python量化金融实战】-第1章:Python量化金融概述:1.1量化金融的定义与发展历程

本小节学习建议&#xff1a;掌握Python编程、统计学&#xff08;时间序列分析&#xff09;、金融学基础&#xff08;资产定价理论&#xff09;三者结合&#xff0c;是进入量化领域的核心路径。 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章目录 1.1 量化金…

STM32的HAL库开发---单通道ADC采集(DMA读取)实验

一、实验简介 正常单通道ADC采集顺序是先开启ADC采集&#xff0c;然后等待ADC转换完成&#xff0c;也就是判断EOC位置1&#xff0c;然后再读取数据寄存器的值。 如果配置了DMA功能&#xff0c;在EOC位被硬件置1后&#xff0c;自动产生DMA请求&#xff0c;然后DMA进行数据搬运…

eclogy后台运维笔记(写的很乱,只限个人观看)

组织权限&#xff1a; 矩阵管理 这个很重要&#xff0c;比如进行流程操作者的选择时&#xff0c;我们进行需要选择财务部的出纳&#xff0c;会计&#xff0c;总经理。我们不能去直接选定一个人&#xff0c;万一这个人离职了&#xff0c;那所有的流程都要手动修改&#xff0c;…

【网络编程】几个常用命令:ping / netstat / xargs / pidof / watch

ping&#xff1a;检测网络联通 1. ping 的基本功能2. ping 的工作原理3. ping 的常见用法4. ping 的输出解释5. ping 的应用场景6. 注意事项 netstat&#xff1a;查看网络状态 1. netstat 的基本功能2. 常见用法3. 示例4. 输出字段解释5. netstat 的替代工具6. 注意事项 xargs&…