坦克大戰第一節——畫出自己的坦克(新手篇)

来源:https://www.cnblogs.com/HHHY/archive/2018/11/10/9939659.html
-Advertisement-
Play Games

剛剛開始學習Java,對Java不是很熟悉,但是自己的興趣挺喜歡Java。現在自己在自學Java做一個小游戲,坦克大戰。 自己現在完成了畫出自己的坦克和坦克的移動方向。希望各位大神指導一下我這個剛剛學Java的新手小白。 我會每完成一個階段,就更新一下博客,跟進一下自己的學習進度。 在做這個坦克大戰 ...


      剛剛開始學習Java,對Java不是很熟悉,但是自己的興趣挺喜歡Java。現在自己在自學Java做一個小游戲,坦克大戰。

     自己現在完成了畫出自己的坦克和坦克的移動方向。希望各位大神指導一下我這個剛剛學Java的新手小白。

     我會每完成一個階段,就更新一下博客,跟進一下自己的學習進度。

    在做這個坦克大戰的時候,不知道從哪裡開始做起,再來自己就覺得先畫出自己的坦克吧。

    下麵是創建坦克類(方便以後能創建更加多的坦克),再創建自己的坦克繼承坦克類。

package tankgames;

import java.awt.*;

//創建坦克類
public class Tank {
    int x,y,w,h;
    int speed;
    int direct;
    Color c1,c2,c3;
    
    public Tank(){
        x=230;
        y=300;
        w=5;
        h=60;
        speed=10;
        direct=0;
    
    }

    public Tank(int x, int y, int w, int h, int speed, int direct) {
        super();
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
        this.speed = speed;
        this.direct = direct;
    }
}


//創建我的坦克子類
class MyTank extends Tank{
    //創建顏色對象,並設置顏色
    public MyTank(){
        this.c1 = new Color(128,128,128);
        this.c2 = new Color(0,255,0);
        this.c3 = new Color(0,0,255);
    }
    
    public MyTank(int x, int y, int w, int h, int speed, int direct) {
        super(x, y, w, h, speed, direct);
        this.c1 = new Color(128,128,128);
        this.c2 = new Color(0,255,0);
        this.c3 = new Color(0,0,255);
    }
}

 

      創建完自己的坦克,要寫個主函數來畫出自己的坦克,以下是畫出自己的坦克:

package tankgames;

import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class TankGame extends JFrame{
    private static final long serialVersionUID = 1L;
    
    MyPanel mp;

    public static void main(String[] args) {
        new TankGame().setVisible(true);

    }
    
    public TankGame(){
        this.setTitle("坦克大戰");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setBounds(100, 100, 600, 500);
        
        //創建我的面板對象,並添加到我的窗體裡面
        mp = new MyPanel();
        this.getContentPane().add(mp);
        
        //註冊鍵盤事件監聽
        this.addKeyListener(mp);
    }

}

//創建我的面板子類
class MyPanel extends JPanel implements KeyListener{
    MyTank myTank;
    private static final long serialVersionUID = 1L;
    
    public MyPanel(){
        this.setLayout(null);
        myTank = new MyTank();
    }
    
    //面板容器的設置和組件在面板容器里顯示
    public void paint(Graphics g){
        super.paint(g);
        g.setColor(new Color(255,255,221));
        g.fill3DRect(0, 0, 500, 400, false);
        drawTank(myTank,g);
    }
    
    //畫坦克
    public void drawTank(Tank t,Graphics g){
        int x = t.x, y = t.y, w = t.w, h = t.h;
        //畫出向上的坦克
        if(t.direct == 0){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, w, h, false);
            g.fill3DRect(x+7*w, y, w, h, false);
            g.setColor(t.c2);
            g.fill3DRect(x+w, y+2*w, 6*w, 8*w, false);
            g.fillOval(x+2*w, y+4*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x+4*w, y, x+4*w, y+6*w);
        }
        //畫出向下的坦克
        else if(t.direct == 2){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, w, h, false);
            g.fill3DRect(x+7*w, y, w, h, false);
            g.setColor(t.c2);
            g.fill3DRect(x+w, y+2*w, 6*w, 8*w, false);
            g.fillOval(x+2*w, y+4*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x+4*w, y+6*w, x+4*w, y+12*w);
        }
        //畫出向左的坦克
        else if(t.direct == 3){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, h, w, false);
            g.fill3DRect(x, y+7*w, h, w, false);
            g.setColor(t.c2);
            g.fill3DRect(x+2*w, y+w, 8*w, 6*w, false);
            g.fillOval(x+4*w, y+2*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x, y+4*w, x+6*w, y+4*w);
        }
        //畫出向右的坦克
        else if(t.direct ==1){
            Graphics2D g2d = (Graphics2D)g;
            g.setColor(t.c1);
            g.fill3DRect(x, y, h, w, false);
            g.fill3DRect(x, y+7*w, h, w, false);
            g.setColor(t.c2);
            g.fill3DRect(x+2*w, y+w, 8*w, 6*w, false);
            g.fillOval(x+4*w, y+2*w, 4*w, 4*w);
            g2d.setColor(t.c3);
            g2d.setStroke(new BasicStroke(5.0f));
            g2d.drawLine(x+6*w, y+4*w, x+12*w, y+4*w);
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
        
    }
    //我的坦克移動
    @Override
    public void keyPressed(KeyEvent e) {
        //向左移動
        if(e.getKeyCode() == KeyEvent.VK_LEFT || e.getKeyCode() == KeyEvent.VK_A){
            myTank.x -= myTank.speed;
            myTank.direct = 3;
        }
        //向右移動
        else if(e.getKeyCode() == KeyEvent.VK_RIGHT || e.getKeyCode() == KeyEvent.VK_D){
            myTank.x += myTank.speed;
            myTank.direct = 1;
        }
        //向上移動
        else if(e.getKeyCode() == KeyEvent.VK_UP || e.getKeyCode() == KeyEvent.VK_W){
            myTank.y -= myTank.speed;
            myTank.direct =0;
        }
        //向下移動
        else if(e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_S){
            myTank.y += myTank.speed;
            myTank.direct = 2;
        }
        //關閉游戲
        else if(e.getKeyCode() == KeyEvent.VK_ESCAPE){
            System.exit(0);
        }
        //刷新圖形
        this.repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
        
    }

}

     我畫自己的坦克只是計算好位置,畫出圖形。

    再來自己到最後,有一個疑惑,自己不懂。

   坦克每次改變方向移動時,能不能有更加方便的方法來封裝上面畫圖形時自己手動改變位置?若畫其他坦克,是不是還要自己手動改變坦克的位置?這裡自己覺得處理不是很好,現在還在想怎麼能更加完美,更加方便。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HashMap的put操作源碼解析 [toc] 1、官方文檔 1.1、繼承結構 1.2、類型參數: 2、put(key, value) HashMap是一種以鍵——值對的形式來存儲數據的數據結構。HashMap允許使用 null 值和 null 鍵,它並不能保證你存放數據和取出的順序是一致的。 接下 ...
  • 本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麼實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論的話題又是充滿爭議:有的論壇帖子說Java只有值傳遞,有的博客說兩者皆有;這讓人有點摸不著頭腦,下 ...
  • 1.Python變數 比C語言,Java語言更加簡潔,不需要加int等等類型定義,直接變數名 = 值,Python里甚至不需要分號。有些特定的不能當做變數名,變數只能由字母、數字和下劃線組成,下劃線可以放在開頭,甚至可以有很多(只是很少有人會這麼做),數字不能作為開頭。 2.Python註釋 # 代 ...
  • 一.hashMap與hashTable與ConcurrentHashMap: 1.HashMap是繼承自AbstractMap類,而HashTable是繼承自Dictionary類。不過它們都同時實現了map、Cloneable(可複製)、Serializable(可序列化)這三個介面。<Dicti ...
  • 話不多說,先乾再說..... 打開pycharm,創建一個關於flask的項目 2.創建一個App的文件包 3.把staic和templates文件包拖進App里 4.把app.py文件改為manager.py文件 5.這裡先停一下,點擊下方Terminal,把我們所需要第三方庫準備好分別是:pip ...
  • 表達式 lambda argument_list: expression argument_list 是參數列表,類似於函數中的參數列表,表現形式多種多樣: a, b a=1, b=2 *args **kwargs a, b=1, *args 空 ...... a, b a=1, b=2 *args ...
  • 前兩篇代碼寫了初始化與查詢,知道了S函數,初始權重矩陣。以及神經網路的計算原理,總這一篇起就是最重要的神經網路的訓練了。 神經網路的訓練簡單點來講就是讓輸出的東西更加接近我們的預期。比如我們輸出的想要是1,但是輸出了-0.5,明顯不是 我們想要的。 誤差=(期望的數值)-(實際輸出),那麼我們的誤差 ...
  • 使用python實現設計模式中的單例模式。單例模式是一種比較常用的設計模式,其實現和使用場景判定都是相對容易的。本文將簡要介紹一下python中實現單例模式的幾種常見方式和原理。一方面可以加深對python的理解,另一方面可以更加深入的瞭解該模式,以便實際工作中能更加靈活的使用單例設計模式。 本文將 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...