<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Cách tạo kẻ thù trong game Python</title>
<meta name="description" content="Cách tạo kẻ thù trong game Python - Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;cach-tao-ke-thu-trong-game-python-7201.html">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Cách tạo kẻ thù trong game Python">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;cach-tao-ke-thu-trong-game-python-7201.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ke-thu-trong-game-python-7201.html">
<link rel="shortcut icon" href="https://nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ke-thu-trong-game-python-7201.html">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://nguoicodonvn2008.info/">https://nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Cách tạo kẻ thù trong game Python</h1>
		<ul class="list-inline">
			<li>Thứ sáu - 23/06/2023 00:40</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="Cách tạo kẻ thù trong game Python" src="https://st.quantrimang.com/photos/image/2023/06/22/tao-ke-thu-game-python2.jpg" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<p style="text-align: justify;">Kẻ thù đóng vai trò quan trọng trong việc tạo ra một game thử thách hấp dẫn.&nbsp;<strong>Thư viện Arcade của Python&nbsp;</strong>mang tới cho bạn cách đơn giản để đưa kẻ thù vào trong game.</p>

<p style="text-align: justify;"><img alt="Tạo kẻ thù trong game Python" data-i="0" data-src="https://st.quantrimang.com/photos/image/2023/06/22/python-game-ke-thu-7.jpg" data-was-processed="true" height="340" src="https://st.quantrimang.com/photos/image/2023/06/22/python-game-ke-thu-7.jpg" width="650" /></p>

<h2 style="text-align: justify;">Tạo một game đơn giản</h2>

<p style="text-align: justify;">Trước khi bắt đầu, đảm bảo đã cài pip trên thiết bị. Dùng lệnh này để cài thư viện arcade:</p>

<pre id="pre0" style="text-align: justify;">
pip install arcade</pre>

<p style="text-align: justify;">Sau đó, bắt đầu bằng cách tạo một game đơn giản tại nơi người chơi có thể di chuyển sang trái và phải bằng các phím mũi tên.</p>

<pre id="pre1">
<code>import arcade

# Kích thước cửa sổ
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# Thuộc tính người chơi
PLAYER_RADIUS = 25
PLAYER_SPEED = 5

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.player_x = width // 2

    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x, PLAYER_RADIUS, PLAYER_RADIUS, arcade.color.BLUE)

    def on_key_press(self, key, modifiers):
        if key == arcade.key.LEFT:
            self.player_x -= PLAYER_SPEED
        elif key == arcade.key.RIGHT:
            self.player_x += PLAYER_SPEED

    def update(self, delta_time):
        pass

def main():
    window = GameWindow(SCREEN_WIDTH, SCREEN_HEIGHT)
    arcade.run()

if __name__ == &quot;__main__&quot;:
    main()</code></pre>

<h2 style="text-align: justify;">Tạo kẻ thù đơn giản</h2>

<p style="text-align: justify;">Để tạo một kẻ thù giết người chơi khi va chạm, tạo hình tròn khác trên màn hình. Trong hàm&nbsp;<strong>on_draw&nbsp;</strong>này, bạn có thể vẽ hình tròn kẻ thù và kiểm tra va chạm trong phương thức update. Bạn cũng có thể dùng sprite cho kẻ thù.</p>

<pre id="pre2" style="text-align: justify;">
# Thêm class GameWindow 

class GameWindow(arcade.Window):
    # ...

    def __init__(self, width, height):
        # ...

        # Enemy attributes
        self.enemy_x = width // 2
        self.enemy_y = height - PLAYER_RADIUS
        self.enemy_radius = 20

    def on_draw(self):
        # ...
        arcade.draw_circle_filled(self.enemy_x, self.enemy_y, self.enemy_radius, arcade.color.RED)

    def update(self, delta_time):
        if self.is_collision(self.player_x, self.player_y, self.enemy_x, self.enemy_y, PLAYER_RADIUS, self.enemy_radius):
            print(&quot;Game Over!&quot;)
    def is_collision(self, x1, y1, x2, y2, radius1, radius2):
        distance_squared = (x1 - x2) ** 2 + (y1 - y2) ** 2
        radius_sum_squared = (radius1 + radius2) ** 2
        return distance_squared &lt;= radius_sum_squared</pre>

<h2 style="text-align: justify;">Làm kẻ thù theo người chơi</h2>

<p style="text-align: justify;">Trong một số game, kẻ thù có thể đuổi theo người chơi, thêm kẻ thù năng động vào gameplay. Để tạo một kẻ thù đuổi theo người chơi, bạn cần update vị trí của nó theo vị trí của người chơi. Bất cứ khi nào người chơi di chuyển, kẻ thù sẽ di chuyển theo cùng hướng. Bạn có thể đạt được điều này bằng cách chỉnh sửa phương thức update. Tạo file mới tên&nbsp;<strong>enemy-follow-player.py</strong>&nbsp;và thêm code với các bản cập nhật bên dưới:</p>

<pre id="pre3" style="text-align: justify;">
# Thêm class GameWindow 

class GameWindow(arcade.Window):
    # ...

    def update(self, delta_time):
        if self.player_x &lt; self.enemy_x:
            self.enemy_x -= PLAYER_SPEED
        elif self.player_x &gt; self.enemy_x:
            self.enemy_x += PLAYER_SPEED

        if self.is_collision(self.player_x, self.player_y,
                            self.enemy_x, self.enemy_y,
                            PLAYER_RADIUS, ENEMY_RADIUS):
           print(&quot;Game Over!&quot;)
    def is_collision(self, x1, y1, x2, y2, radius1, radius2):
        distance_squared = (x1 - x2) ** 2 + (y1 - y2) ** 2
        radius_sum_squared = (radius1 + radius2) ** 2
        return distance_squared &lt;= radius_sum_squared</pre>

<p style="text-align: justify;">Dưới đây là kết quả:</p>

<p style="text-align: justify;"><img alt="Tạo kẻ thù chơi game Python" data-i="1" data-src="https://st.quantrimang.com/photos/image/2023/06/22/tao-ke-thu-game-python1.jpg" data-was-processed="true" height="390" src="https://st.quantrimang.com/photos/image/2023/06/22/tao-ke-thu-game-python1.jpg" width="650" /></p>

<h2 style="text-align: justify;">Thêm đạn của kẻ thù</h2>

<p style="text-align: justify;">Để tạo kẻ thù bắn đạn, tạo class Bullet và một danh sách để theo dõi các đạn hoạt động. Kẻ thù sẽ định kỳ tạo một viên đạn mới và update vị trí của nó. Tạo file mới tên bullets.py và thêm code với bản update bên dưới:</p>

<pre id="pre4">
<code># Thêm class GameWindow 

class Bullet:
def __init__(self, x, y, radius, speed):
self.x = x
self.y = y
self.radius = radius
self.speed = speed

def update(self):
self.y -= self.speed

class GameWindow(arcade.Window):
# ...

def __init__(self, width, height):
# ...

# Thuộc tính kẻ thù
self.bullets = &#91;&#93;
self.bullet_radius = 5
self.bullet_speed = 3
self.bullet_cooldown = 60 # Số khung giữa các lần bắn đạn
self.bullet_timer = 0

def on_draw(self):
# ...
for bullet in self.bullets:
arcade.draw_circle_filled(bullet.x, bullet.y,
self.bullet_radius, arcade.color.BLACK)

def update(self, delta_time):
# ...

self.bullet_timer += 1
if self.bullet_timer &gt;= self.bullet_cooldown:
self.bullets.append(Bullet(self.enemy_x, self.enemy_y - self.enemy_radius,
self.bullet_radius, self.bullet_speed))
self.bullet_timer = 0

for bullet in self.bullets:
bullet.update()
if self.is_collision(self.player_x, self.player_y, self.enemy_x,
self.enemy_y, PLAYER_RADIUS, ENEMY_RADIUS):
print(&quot;Game Over!&quot;)

def is_collision(self, x1, y1, x2, y2, radius1, radius2):
distance_squared = (x1 - x2) ** 2 + (y1 - y2) ** 2
radius_sum_squared = (radius1 + radius2) ** 2
return distance_squared &lt;= radius_sum_squared</code></pre>

<p style="text-align: justify;">Kết quả:</p>

<p style="text-align: justify;"><img alt="Kẻ thù bắn đạn" data-i="2" data-src="https://st.quantrimang.com/photos/image/2023/06/22/tao-ke-thu-game-python2.jpg" data-was-processed="true" height="390" src="https://st.quantrimang.com/photos/image/2023/06/22/tao-ke-thu-game-python2.jpg" width="650" /></p>

<h2 style="text-align: justify;">Thêm chỉ số máu cho kẻ thù</h2>

<p style="text-align: justify;">Trong nhiều game, kẻ thù còn có chỉ số máu (HP) cho phép chúng chịu nhiều đòn đánh trước khi bị đánh bại. Thêm chỉ số này có thể giới thiệu các thành phần gameplay chiến lược, đồng thời mang lại cảm giác tiến bộ và thử thách. Tạo một file mới tên health-point.py và thêm code này với các update bên dưới:</p>

<pre id="pre5" style="text-align: justify;">
# Kích thước cửa sổ
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600

# Thuộc tính người chơi
PLAYER_RADIUS = 25
PLAYER_SPEED = 5

# Thuộc tính kẻ thù
ENEMY_RADIUS = 20
ENEMY_HEALTH = 100

class GameWindow(arcade.Window):
    def __init__(self, width, height):
        super().__init__(width, height)
        arcade.set_background_color(arcade.color.WHITE)
        self.player_x = width // 2
        self.player_y = height // 2
        self.enemy_x = width // 2
        self.enemy_y = height - PLAYER_RADIUS
        self.enemy_health = ENEMY_HEALTH
        print(self.enemy_health)
    def on_draw(self):
        arcade.start_render()
        arcade.draw_circle_filled(self.player_x,
                                  self.player_y,
                                  PLAYER_RADIUS,
                                  arcade.color.BLUE)
        if self.enemy_health &gt; 0:
            arcade.draw_circle_filled(self.enemy_x,
                                      self.enemy_y,
                                      ENEMY_RADIUS,
                                      arcade.color.RED)

    def update(self, delta_time):
        if self.is_collision(self.player_x, self.player_y,
                             self.enemy_x, self.enemy_y,
                             PLAYER_RADIUS, ENEMY_RADIUS):
            self.enemy_health -= 10
            print(self.enemy_health)</pre>

<p style="text-align: justify;">Hằng số&nbsp;<strong>ENEMY_HEALTH&nbsp;</strong>có giá trị 100 để biểu thị điểm máu ban đầu của kẻ thù. Khi người chơi va chạm với kẻ thù, họ có thể bị trừ một số điểm dựa trên chỉ số máu của địch. Để cập nhật chỉ số máu, bạn có thể in một đối tượng văn bản&nbsp;<strong>self.health_text</strong>&nbsp;hiện sức khỏe hiện tại của kẻ thù.</p>

<p style="text-align: justify;">Bằng cách kết hợp chỉ số sức khỏe của địch, bạn có thể giới thiệu một cấp thử thách và chiến thuật cho người chơi. Giá trị máu được hiện cung cấp phản hồi trực quan và cho phép người chơi theo dõi máu còn lại của địch.</p>

<p style="text-align: justify;">Ngoài ra, bạn có thể mở rộng code bằng cách thêm logic và hình ảnh, như hiện thanh máu hoặc các điều kiện đánh bại khi máu của địch bằng 0.</p>

<p style="text-align: justify;">Thêm kẻ thù vào game có thể nâng cao đáng kể trải nghiệm gameplay với những thử thách khó và thôi thúc cảm giác chinh phục của người chơi. Hi vọng hướng dẫn này giúp bạn phát triển game thú vị hơn bằng&nbsp;Python.</p>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ke-thu-trong-game-python-7201.html" title="Cách tạo kẻ thù trong game Python">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-tao-ke-thu-trong-game-python-7201.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<script src="https://nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://nguoicodonvn2008.info",
            "logo": "https://nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>