Advertisement
Guest User

Untitled

a guest
May 29th, 2025
8
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.02 KB | None | 0 0
  1. import React, { useState, useEffect } from 'react';
  2. import { Heart, Utensils, Gamepad2, Bath, Moon, Sun } from 'lucide-react';
  3.  
  4. const VirtualPet = () => {
  5. const [pet, setPet] = useState({
  6. name: 'Buddy',
  7. happiness: 50,
  8. hunger: 50,
  9. cleanliness: 50,
  10. energy: 50,
  11. age: 0,
  12. isAsleep: false
  13. });
  14.  
  15. const [message, setMessage] = useState('Hi! I\'m your new pet!');
  16. const [coins, setCoins] = useState(100);
  17.  
  18. // Pet aging and stat decay
  19. useEffect(() => {
  20. const interval = setInterval(() => {
  21. setPet(prev => {
  22. if (prev.isAsleep) return prev;
  23.  
  24. return {
  25. ...prev,
  26. hunger: Math.max(0, prev.hunger - 1),
  27. cleanliness: Math.max(0, prev.cleanliness - 0.5),
  28. energy: Math.max(0, prev.energy - 0.5),
  29. happiness: Math.max(0, prev.happiness - 0.3),
  30. age: prev.age + 0.01
  31. };
  32. });
  33. }, 3000);
  34.  
  35. return () => clearInterval(interval);
  36. }, []);
  37.  
  38. // Update message based on pet status
  39. useEffect(() => {
  40. if (pet.hunger < 20) {
  41. setMessage("I'm really hungry! 🍽️");
  42. } else if (pet.cleanliness < 20) {
  43. setMessage("I need a bath! 🛁");
  44. } else if (pet.energy < 20) {
  45. setMessage("I'm so tired... 😴");
  46. } else if (pet.happiness < 30) {
  47. setMessage("I'm feeling sad... 😢");
  48. } else if (pet.happiness > 80) {
  49. setMessage("I'm so happy! 😄");
  50. } else {
  51. setMessage("I'm doing well! 😊");
  52. }
  53. }, [pet]);
  54.  
  55. const feedPet = () => {
  56. if (coins >= 10 && pet.hunger < 100) {
  57. setPet(prev => ({
  58. ...prev,
  59. hunger: Math.min(100, prev.hunger + 30),
  60. happiness: Math.min(100, prev.happiness + 10)
  61. }));
  62. setCoins(prev => prev - 10);
  63. setMessage("Yummy! Thank you! 😋");
  64. }
  65. };
  66.  
  67. const playWithPet = () => {
  68. if (pet.energy > 20) {
  69. setPet(prev => ({
  70. ...prev,
  71. happiness: Math.min(100, prev.happiness + 25),
  72. energy: Math.max(0, prev.energy - 15)
  73. }));
  74. setCoins(prev => prev + 5);
  75. setMessage("That was fun! 🎾");
  76. } else {
  77. setMessage("I'm too tired to play... 😴");
  78. }
  79. };
  80.  
  81. const cleanPet = () => {
  82. if (coins >= 15) {
  83. setPet(prev => ({
  84. ...prev,
  85. cleanliness: Math.min(100, prev.cleanliness + 40),
  86. happiness: Math.min(100, prev.happiness + 15)
  87. }));
  88. setCoins(prev => prev - 15);
  89. setMessage("I feel so fresh and clean! ✨");
  90. }
  91. };
  92.  
  93. const sleepPet = () => {
  94. setPet(prev => ({
  95. ...prev,
  96. isAsleep: !prev.isAsleep,
  97. energy: prev.isAsleep ? prev.energy : Math.min(100, prev.energy + 50)
  98. }));
  99. setMessage(pet.isAsleep ? "Good morning! 🌅" : "Good night! 🌙");
  100. };
  101.  
  102. const getStatColor = (value) => {
  103. if (value > 70) return 'bg-green-500';
  104. if (value > 40) return 'bg-yellow-500';
  105. return 'bg-red-500';
  106. };
  107.  
  108. const getPetEmoji = () => {
  109. if (pet.isAsleep) return '😴';
  110. if (pet.happiness > 80) return '😄';
  111. if (pet.happiness > 60) return '😊';
  112. if (pet.happiness > 40) return '😐';
  113. if (pet.happiness > 20) return '😔';
  114. return '😢';
  115. };
  116.  
  117. return (
  118. <div className="max-w-md mx-auto bg-gradient-to-b from-blue-100 to-green-100 min-h-screen p-6">
  119. {/* Header */}
  120. <div className="text-center mb-6">
  121. <h1 className="text-3xl font-bold text-purple-800 mb-2">Virtual Pet</h1>
  122. <p className="text-lg text-gray-700">Coins: 💰 {coins}</p>
  123. </div>
  124.  
  125. {/* Pet Display */}
  126. <div className="bg-white rounded-3xl p-6 mb-6 shadow-lg text-center">
  127. <div className="text-8xl mb-4">{getPetEmoji()}</div>
  128. <h2 className="text-2xl font-bold text-purple-700 mb-2">{pet.name}</h2>
  129. <p className="text-gray-600 mb-4">Age: {Math.floor(pet.age)} days old</p>
  130. <div className="bg-blue-50 rounded-lg p-3">
  131. <p className="text-lg">{message}</p>
  132. </div>
  133. </div>
  134.  
  135. {/* Stats */}
  136. <div className="bg-white rounded-2xl p-4 mb-6 shadow-lg">
  137. <h3 className="text-lg font-semibold mb-4 text-center text-gray-800">Pet Stats</h3>
  138.  
  139. {[
  140. { name: 'Happiness', value: pet.happiness, icon: '😊' },
  141. { name: 'Hunger', value: pet.hunger, icon: '🍽️' },
  142. { name: 'Cleanliness', value: pet.cleanliness, icon: '🛁' },
  143. { name: 'Energy', value: pet.energy, icon: '⚡' }
  144. ].map((stat) => (
  145. <div key={stat.name} className="mb-3">
  146. <div className="flex justify-between items-center mb-1">
  147. <span className="text-sm font-medium">{stat.icon} {stat.name}</span>
  148. <span className="text-sm text-gray-600">{Math.round(stat.value)}/100</span>
  149. </div>
  150. <div className="w-full bg-gray-200 rounded-full h-3">
  151. <div
  152. className={`h-3 rounded-full transition-all duration-300 ${getStatColor(stat.value)}`}
  153. style={{ width: `${stat.value}%` }}
  154. ></div>
  155. </div>
  156. </div>
  157. ))}
  158. </div>
  159.  
  160. {/* Action Buttons */}
  161. <div className="grid grid-cols-2 gap-3">
  162. <button
  163. onClick={feedPet}
  164. disabled={coins < 10 || pet.hunger >= 100}
  165. className="bg-orange-500 hover:bg-orange-600 disabled:bg-gray-400 disabled:cursor-not-allowed text-white font-semibold py-3 px-4 rounded-xl flex items-center justify-center gap-2 transition-colors"
  166. >
  167. <Utensils size={20} />
  168. Feed (10💰)
  169. </button>
  170.  
  171. <button
  172. onClick={playWithPet}
  173. disabled={pet.energy <= 20}
  174. className="bg-green-500 hover:bg-green-600 disabled:bg-gray-400 disabled:cursor-not-allowed text-white font-semibold py-3 px-4 rounded-xl flex items-center justify-center gap-2 transition-colors"
  175. >
  176. <Gamepad2 size={20} />
  177. Play (+5💰)
  178. </button>
  179.  
  180. <button
  181. onClick={cleanPet}
  182. disabled={coins < 15}
  183. className="bg-blue-500 hover:bg-blue-600 disabled:bg-gray-400 disabled:cursor-not-allowed text-white font-semibold py-3 px-4 rounded-xl flex items-center justify-center gap-2 transition-colors"
  184. >
  185. <Bath size={20} />
  186. Clean (15💰)
  187. </button>
  188.  
  189. <button
  190. onClick={sleepPet}
  191. className="bg-purple-500 hover:bg-purple-600 text-white font-semibold py-3 px-4 rounded-xl flex items-center justify-center gap-2 transition-colors"
  192. >
  193. {pet.isAsleep ? <Sun size={20} /> : <Moon size={20} />}
  194. {pet.isAsleep ? 'Wake Up' : 'Sleep'}
  195. </button>
  196. </div>
  197.  
  198. {/* Tips */}
  199. <div className="mt-6 bg-yellow-50 border border-yellow-200 rounded-lg p-3">
  200. <p className="text-sm text-yellow-800">
  201. 💡 <strong>Tip:</strong> Playing with your pet earns coins! Keep all stats high to keep your pet happy.
  202. </p>
  203. </div>
  204. </div>
  205. );
  206. };
  207.  
  208. export default VirtualPet;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement