সর্বাধিক মান ছাড়িয়ে আমি কীভাবে একটি পরিবর্তনশীল বৃদ্ধি করতে পারি?


89

আমি স্কুলের জন্য একটি সাধারণ ভিডিও গেম প্রোগ্রামে কাজ করছি এবং আমি এমন একটি পদ্ধতি তৈরি করেছি যেখানে প্লেয়ারটি যদি সেই পদ্ধতিটি বলা হয় তবে 15 স্বাস্থ্য পয়েন্ট পায়। আমাকে স্বাস্থ্যকে সর্বোচ্চ ১০০ এ রাখতে হবে এবং আমার সীমিত প্রোগ্রামিং সক্ষমতা নিয়ে আমি এ জাতীয় কিছু করছি like

public void getHealed(){
    if(health <= 85)
        health += 15;
    else if(health == 86)
        health += 14;
    else if(health == 87)
    health += 13; 
}// this would continue so that I would never go over 100

আমি বুঝতে পারি যে আমার সিনট্যাক্সটি নিখুঁত নয় তবে আমার প্রশ্ন হ'ল এটি করার আরও ভাল উপায় কী হতে পারে, কারণ আমাকে ক্ষতির পয়েন্টগুলির সাথেও একই রকম কাজ করতে হবে এবং 0 এর নিচে যেতে হবে না।

একে স্যাচুরেশন পাটিগণিত বলা হয় ।


7
পার্শ্ব নোট হিসাবে, আমি এই পদ্ধতির জন্য একটি আলাদা নাম চয়ন করব। জাভা মান অনুসারে (এবং বেশিরভাগ অন্যান্য ভাষা আমি জানি), "get" দিয়ে শুরু হওয়া কোনও পদ্ধতির নামটির একটি মান ফেরত দেওয়া উচিত, এবং কোনও কিছুই পরিবর্তন করা উচিত নয়। তেমনিভাবে "সেট" দিয়ে শুরু হওয়া নামের নামগুলির একটি মান পরিবর্তন করা উচিত এবং সাধারণত কোনও কিছুই ফেরত দেওয়া উচিত নয়।
ড্যারাল হফম্যান

উত্তর:


227

আমি শুধু এটি করতে হবে। এটি মূলত সর্বনিম্ন 100 (সর্বাধিক স্বাস্থ্য) এবং 15 অতিরিক্ত পয়েন্ট সহ স্বাস্থ্য কী হবে তা গ্রহণ করে। এটি নিশ্চিত করে যে ব্যবহারকারীর স্বাস্থ্য 100 এর বেশি হবে না।

public void getHealed() {
    health = Math.min(health + 15, 100);
}

তা নিশ্চিত করতে hitpoints শূন্যের নিচে ফেলে দিও না, আপনি একটি অনুরূপ ফাংশন ব্যবহার করতে পারেন: Math.max

public void takeDamage(int damage) {
    if(damage > 0) {
        health = Math.max(health - damage, 0);
    }
}

71

স্বাস্থ্যের জন্য কেবল 15 যোগ করুন, তাই:

health += 15;
if(health > 100){
    health = 100;
}

যাইহোক, মাতাল হিসাবে উল্লেখ করা হয়েছে, কখনও কখনও মাল্টি-থ্রেডিং (একসাথে একাধিক কোড কার্যকরকারী কোডগুলি) স্বাস্থ্য যে কোনও সময়ে 100 এর উপরে চলে গেলে সমস্যা হতে পারে এবং একাধিকবার স্বাস্থ্য সম্পত্তি পরিবর্তন করাও খারাপ হতে পারে। সেক্ষেত্রে অন্যান্য উত্তরে উল্লিখিত হিসাবে আপনি এটি করতে পারতেন।

if(health + 15 > 100) {
    health = 100;
} else {
    health += 15;
}

9
এটি কখনই অতিক্রম করার অনুমতি দেওয়া উচিত নয়, এটি এমন একটি নতুন সমস্যা যেমন রেসের শর্ত হিসাবে পরিচয় করিয়ে দিতে পারে যেখানে চরিত্রের স্বাস্থ্য সর্বাধিক সংজ্ঞায়িত স্বাস্থ্য সর্বাধিক (100) হিসাবে ধরে নেওয়া হয়। এই স্তরের প্রকল্পের পক্ষে অসম্ভব নয় যে আমি অনুমান করি তবে তাড়াতাড়ি ভাল অনুশীলনগুলি প্রয়োগ করা উচিত।
মুর্তি

6
@ ব্ল্যান্ড যদি কেউ এই পদ্ধতিকে ব্যবহার করে তবে এই জাতীয় জাতি পরিস্থিতি এড়ানোর একটি উপায় হ'ল নতুন স্বাস্থ্য মান সংরক্ষণের জন্য একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করা এবং তারপরে প্রয়োজনে সিঙ্ক্রোনাইজেশন সহ এই নতুন স্বাস্থ্য মানকে স্বাস্থ্য এক জায়গায় স্থাপন করা।
বব

13
@ ব্ল্যান্ড: মাল্টি থ্রেডিংয়ের সময় কেবল রেসের অবস্থা প্রাসঙ্গিক। এবং যদি তিনি মাল্টি-থ্রেডিং করছেন (যা আমি অত্যন্ত সন্দেহ করি) তবে সমাধানটি হ'ল সমস্ত অ্যাক্সেস লক করা healthবা এটি নিশ্চিত করা healthযে কেবল একটি থ্রেড থেকে অ্যাক্সেস করা হয়েছে। বাধ্যতা "স্বাস্থ্য 100 ওভার যেতে দেব না উচিত" একটি বাস্তবসম্মত নয়।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

@ ব্লুরাজা-ড্যানি ফ্লুঘুফুট আমি বলেছি যে এই প্রকল্পের পক্ষে এটি অসম্ভাব্য। সাধারণভাবে লকগুলি সর্বদা ব্যবহৃত হয় না এবং আপনার যদি সর্বোচ্চ মূল্য থাকে তবে এটি গেমিং বা অন্যথায় কঠোরভাবে অনুসরণ করা উচিত। উদাহরণ: যদি কোনও ইভেন্ট কোনও সম্পত্তির পরিবর্তনের সাথে সংযুক্ত থাকে এবং শতাংশ ব্যবহার করে তবে আপনি এখন সেই প্রক্রিয়াটিকে প্রচুর পরিমাণে ত্রুটিযুক্ত করেছেন, পাশাপাশি এটি দুটিবার আহ্বান করেছেন। আমি এখানে সাধারণ থাকার চেষ্টা করছি এবং ওপি শিখতে নিশ্চিত করে নিচ্ছি - আমি এই উত্তরটি অনুভব করি যদিও এটি কাজ করে তবে একজন শিক্ষার্থীর পক্ষে খুব সংকীর্ণ এবং সুনির্দিষ্ট কারণ এটি তাকে বড় চিত্রটির কথা চিন্তা না করার জন্য চাপিয়ে দেয়।
মুর্তি

@ Bob আমি মনে করি এই সাধারণ কিছুর জন্য অপ্রয়োজনীয় unnecessary
ম্যাথ চিলার

45

intউপরের প্রত্যেকটির জন্য আপনার আলাদা কেসের দরকার নেই 85। একটি মাত্র আছে else, যাতে স্বাস্থ্য যদি ইতিমধ্যে 86বা তার চেয়ে বেশি হয় তবে কেবল এটিকে সরাসরি সেট করুন 100

if(health <= 85)
    health += 15;
else
    health = 100;

25
আমার জন্য কিছুটা বেশি ম্যাজিক সংখ্যা (এমনকি 100 টি অনুমোদিত হিসাবে বিবেচনা করা হচ্ছে) - 15 থেকে 16 পরিবর্তন করার সময় 85 এডজাস্ট করা দরকার। কমপক্ষে 100 - 15(বা 100 -HEALED_HEALTH) 85 এ পরিবর্তন করা কি কোনও উন্নতি হবে না?
ম্যাকিয়েজ পাইচোটকা

37

আমি মনে করি এই কাজ করার একটি কথ্য, অবজেক্ট ওরিয়েন্টেড উপায় আছে হয় setHealthউপর Characterবর্গ। এই পদ্ধতির প্রয়োগটি দেখতে এরকম হবে:

public void setHealth(int newValue) {
    health = Math.max(0, Math.min(100, newValue))
}

এটি স্বাস্থ্যকে আপনি যেটি সেট করেছেন তা বিবেচনা না করেই 0 এর নীচে বা 100 এরও বেশি যেতে বাধা দেয়।


আপনার getHealed()বাস্তবায়ন কেবল এটি হতে পারে:

public void getHealed() {
    setHealth(getHealth() + 15);
}

হোক জন্য জ্ঞান করে তোলে Characterআছে-একটি থেকে getHealed()পদ্ধতি একটি ব্যায়াম আপ পাঠক ছেড়ে দেওয়া হয় :)


4
+1: কোনও অবজেক্ট-ভিত্তিক পদ্ধতিতে এটি করার একটি দুর্দান্ত উপায়! আমি প্রস্তাব করতে পারি কেবলমাত্র (এবং এটি সম্ভবত পাঠকের কাছে ছেড়ে দেওয়া হবে) হ'ল সম্ভবত দুটি পদ্ধতি ( heal(int hp)এবং damage(int hp)) থাকা উচিত যা প্রত্যেকে আপনার setHealth(int newValue)পদ্ধতিটিকে কল করে ।
ক্রিস ফরেনেন্স

18
লাইব্রেরির ফাংশনগুলিতে কল করার ক্ষেত্রে কী ভুল? নামযুক্ত ফাংশন হিসাবে, তারা শর্তাধীন যুক্তিগুলির একগুচ্ছের চেয়ে আরও স্পষ্টভাবে অভিপ্রায় প্রকাশ করে।
ইরিকসন

4
এছাড়াও অনেকগুলি লাইব্রেরি ফাংশন (এবং সম্ভবত এটিগুলি সম্ভবত) অন্তর্নির্মিত এবং কোনও কলই করবে না।
ক্রিস

4
@ মাত্তিও ভুল উত্তর - সম্ভবত লাইব্রেরির কাজটি অভ্যন্তরীণভাবে ঠিক একই কাজ করে, তবে কেন নিজেকে পুনরাবৃত্তি করুন এবং আপনার কোডকে কলুষিত করবেন? লাইব্রেরির ফাংশন ব্যবহার না করা ডিআরওয়ির মূল নীতি অনুসরণ করে না।
নিকজি

4
@ মাত্তিও এটি একটি এড়ানোর জন্য নয় if। এটি নিজেকে পায়ে গুলি করতে সক্ষম হওয়া থেকে বিরত রাখতে। যদি এটি খুব ভার্জোজ হয় তবে কেবল স্থিতিশীল আমদানি ব্যবহার করুন। তারপরে এটি দেখতে দেখতে এমনটি দেখা যায় : health = max(0, min(100, newValue)) যদি এটি এখনও আপনার কাছে অপঠনযোগ্য হয় তবে এটি নামধারী কোনও পদ্ধতিতে এটি সন্ধান করুন clampযাতে লাইনটি দেখতে এই রকম হয়:health = clamp(0, 100, newValue)
ড্যানিয়েল কাপলান

14

আমি কেবল কোডের আরও পুনরায় ব্যবহারযোগ্য টুকরা অফার করতে যাচ্ছি এটি এটি সবচেয়ে ছোট নয় তবে আপনি এটি কোনও পরিমাণে ব্যবহার করতে পারেন তাই এটি এখনও বলার যোগ্য worthy

health += amountToHeal;
if (health >= 100) 
{ 
    health = 100;
}

আপনি যদি নিজের তৈরির গেমের পরিসংখ্যান যুক্ত করতে চান তবে আপনি 100 টি একটি সর্বোচ্চ হেলথ পরিবর্তনশীলতেও পরিবর্তন করতে পারেন, সুতরাং পুরো পদ্ধতিটি এরকম কিছু হতে পারে

private int maxHealth = 100;
public void heal(int amountToHeal)
{
    health += amountToHeal;
    if (health >= maxHealth) 
    { 
        health = maxHealth;
    }
}

সম্পাদনা

অতিরিক্ত তথ্যের জন্য

প্লেয়ারটি ক্ষতিগ্রস্ত হওয়ার জন্য আপনি একই কাজ করতে পারেন, তবে আপনার কোনও মিনিহেলথের প্রয়োজন হবে না কারণ এটি 0 হবে। এটি এভাবে করা আপনি একই কোড দিয়ে কোনও পরিমাণ ক্ষতি করতে এবং নিরাময় করতে সক্ষম হবেন।


4
minHealthনেতিবাচক হতে পারে, উদাহরণস্বরূপ, ডি অ্যান্ড ডি তে ... :)
জেলটন

4
এখন পর্যন্ত এখানে সেরা উত্তর।
গ্লাচ ডিজায়ার

@ জেলটন, হ্যাঁ আপনি কেবল বিবৃতিতে (স্বাস্থ্য <= 0) বলতে চাইবেন। আপনি এটি চান তবে আপনি এটি পরিচালনা করতে পারেন, আপনি যদি তাদের জীবন পেতে চান তবে লাইফকাউন্ট থেকে আপনার বিয়োগ 1 বা তারা যদি হেরে যায় তবে তা হ্যান্ডেল করতে পারে। আপনি যদি চান তবে তাদের তাদের -HP পরিমাণ দিয়ে তাদের নতুন জীবন শুরু করতে পারেন। আপনি এই কোডটি বেশ কয়েকটি জায়গায় পেস্ট করতে পারেন এবং এটি কাজটি ঠিকঠাকভাবে করবে, এটি ছিল এই উত্তরের মূল বিষয়।
5 তাতার-কাস্টার


4

আমি একটি সহায়ক ক্লাসে একটি স্ট্যাটিক পদ্ধতি তৈরি করব। এইভাবে, প্রতিটি মানের জন্য কোডটি পুনরাবৃত্তি করার পরিবর্তে যা কিছু সীমানার মধ্যে ফিট করতে পারে, আপনার কাছে সমস্ত উদ্দেশ্য পদ্ধতি থাকতে পারে। এটি ন্যূনতম এবং সর্বাধিক সংজ্ঞা দেওয়া দুটি মান গ্রহণ করবে এবং তৃতীয় মানটি এই ব্যাপ্তির মধ্যে আবদ্ধ হবে।

class HelperClass
{
    // Some other methods

    public static int clamp( int min, int max, int value )
    {
        if( value > max )
            return max;
        else if( value < min )
            return min;
        else
            return value;
    }
}

আপনার ক্ষেত্রে, আপনি কোথাও আপনার সর্বনিম্ন এবং সর্বাধিক স্বাস্থ্য ঘোষণা করবেন।

final int HealthMin = 0;
final int HealthMax = 100;

তারপরে আপনার ন্যূনতম, সর্বাধিক এবং সামঞ্জস্য করা স্বাস্থ্যের মধ্যে ফাংশনটি কল করুন।

health = HelperClass.clamp( HealthMin, HealthMax, health + 15 );

3

আমি জানি এটি একটি স্কুল প্রকল্প, তবে আপনি যদি পরে আপনার গেমটি প্রসারিত করতে এবং আপনার নিরাময়ের শক্তিটিকে আপগ্রেড করতে সক্ষম করতে চান তবে ফাংশনটি এভাবে লিখুন:

public void getHealed(healthPWR) {
    health = Math.min(health + healthPWR, 100);
}

এবং ফাংশনটি কল করুন:

getHealed(15);
getHealed(25);

... ইত্যাদি ...

তবুও আপনি কোনও ভেরিয়েবল তৈরি করে আপনার সর্বোচ্চ এইচপি তৈরি করতে পারেন যা ফাংশনের স্থানীয় নয়। যেহেতু আপনি কোন ভাষাটি ব্যবহার করছেন তা আমি জানি না, তাই আমি উদাহরণ দেখাব না কারণ এটির ভুল বাক্য গঠন থাকতে পারে।


2

হয়তো এই?

public void getHealed()
{
  if (health <= 85)
  {
    health += 15;
  } else
  {
    health = 100;
  }
}

2

আপনি যদি কৌতুকপূর্ণ হয়ে নিজের কোডটি এক লাইনে ফিট করতে চান তবে আপনি কোনও টার্নারি অপারেটর ব্যবহার করতে পারেন :

health += (health <= 85) ? 15 : (100 - health);

দ্রষ্টব্য যে কিছু লোক খারাপ পাঠযোগ্যতার কারণে এই বাক্য গঠনটি ভ্রান্ত করবে!


4
আমি health = (health <= 85)?(health+15):100আরও পঠনযোগ্য খুঁজে পেয়েছি (আপনি যদি সত্যিই কোনও টার্নারি অপারেটর ব্যবহার করতে চান)
মাত্তিও

1

আমি বিশ্বাস করি এটি করবে

if (health >= 85) health = 100;
else health += 15;

ব্যাখ্যা:

  • নিরাময়ের ব্যবধানটি 15 বা তার চেয়ে কম হলে স্বাস্থ্য 100 হয়ে যাবে।

  • অন্যথায় যদি ব্যবধানটি 15 এর চেয়ে বড় হয় তবে এটি স্বাস্থ্যের 15 টি যোগ করবে।

সুতরাং উদাহরণস্বরূপ: স্বাস্থ্য যদি 83 হয় তবে এটি 98 হয়ে উঠবে তবে 100 নয়।


এটি কীভাবে অনুরোধকারীর প্রশ্নের সমাধান করতে কাজ করে তা প্রসারিত করতে পারেন?
রো ইয়ো মি

নিরাময়ের জন্য ব্যবধানটি 15 বা তার চেয়ে কম হলে স্বাস্থ্য আরও 100 হয়ে উঠবে যদি ব্যবধানটি 15 এর চেয়ে বড় হয় তবে এটি স্বাস্থ্যের সাথে 15 যোগ করবে। সুতরাং উদাহরণস্বরূপ স্বাস্থ্য 83 হয়ে উঠবে 98 কিন্তু 100 নয় any যদি কোনও নির্দিষ্ট উদ্বেগ থাকে তবে আমাকে জানান, মন্তব্যের জন্য আপনাকে ধন্যবাদ।
MarmiK

&& health < 100শর্ত অপ্রয়োজনীয়। যদি এটি 100 হয় তবে এটি 100 এ সেট করা হবে, কোনও পরিবর্তন হবে না। আপনার কেবলমাত্র এটির প্রয়োজন ছিল যদি এটি সম্ভব হয় যে কোনওভাবে> ১০০ পাওয়া সম্ভব এবং আমরা
নিরাময়টি

@ ড্যারেলহফম্যান আমি মনে করি আপনি যদি ঠিক করেন যে গেমটি অতিরিক্ত স্বাস্থ্য প্রদান করে না 100+ তবে আপনি ঠিক বলেছেন, আমি আমার উত্তর সংশোধন করেছি :) আপনাকে ধন্যবাদ
মার্মিক

1

আমি যদি থ্রেড নিরাপদ থাকতে চাইতাম তবে এটি একটি সিঙ্ক্রোনাইজড ব্লক ব্যবহার না করে এইভাবে করব do

পারমাণবিক তুলনাআন্ডসেট ওভারহেড ছাড়াই সিঙ্ক্রোনাইজ করা একই ফলাফল অর্জন করে।

AtomicInteger health = new AtomicInteger();

public void addHealth(int value)
{
    int original = 0;
    int newValue = 0;
    do
    {
        original = health.get();
        newValue = Math.min(100, original + value);
    }
    while (!health.compareAndSet(original, newValue));
}

1

মডুলাস অপারেটর ব্যবহার করে সবচেয়ে সহজ উপায়।

স্বাস্থ্য = (স্বাস্থ্য + 50)% 100;

স্বাস্থ্য কখনই সমান বা 100 এর বেশি হবে না।


তবে আপনি যদি এই অপারেশনটি health100 বছর বয়সে করেন তবে আপনার 50 স্বাস্থ্য শেষ হবে।
পার্জিফাল

0
   private int health;
    public void Heal()
    {
        if (health > 85)
            health = 100;
        else
            health += 15;
    }
    public void Damage()
    {
        if (health < 15)
            health = 0;
        else
            health -= 15;
    }

আপনি যদি ফাংশন করতে চলেছেন, আপনার কমপক্ষে 15 টিকে প্যারামিটার করা উচিত :)
জর্দান

@ জর্দান: আমি কোডটি লিখছি তা নির্ভর করে। :-)
আমার বগলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.