




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 南昌航空大學嵌入式報告課程名稱:Android移動應用設計與開設計名稱:貪食蛇游戲學院:信息工程學院 班級: 學號: 姓名:- II - 目 錄§1 系統描述11.1 本設計的目的和意義11.2 設計的主要內容11.4 設計實現功能和目標21.5游戲設計環境3§2 游戲需求分析32.1 游戲處理流程32.2 需求分析42.3 功能模塊設計62.4 類模塊設計72.5 游戲圖形界面的圖形顯示更新功能8§3 游戲的基本實現83.1 GameConstants地圖和移動93.2 Operator類103.3 Block類173.4 GameActivity類183.5
2、 Menu菜單Activity253.6 Welcome歡迎菜單313.7 GameView自定義的View控件333.8 Food 食物類37§4運行結果38§5總結41- 41 - 基于手機android平臺的 “貪吃蛇”的設計和實現內容提要: “貪吃蛇”游戲是一個經典的游戲,它因操作簡單、娛樂性強而廣受歡迎。本文基于Java技術和android開發環境,開發了一個操作簡單、界面美觀、功能較齊全的“貪吃蛇”游戲。整個游戲程序分為三個功能模塊,五個類模塊,實現了游戲的開始、暫停、結束。通過本游戲的開發,達到學習android平臺操作技術和熟悉軟件開發流程的目的。§
3、;1 系統描述1.1 本設計的目的和意義 貪吃蛇游戲是一款非常經典的手機游戲,貪吃蛇游戲的設計比較復雜,它涉及面廣、牽涉方面多,如果不好好考慮和設計,將難以成功開發出這個游戲。在這個游戲的設計中,牽涉到圖形界面的顯示與更新、數據的收集與更新,并且在這個游戲的開發中,還要應用類的繼承機制以及一些設計模式。因此,在設計開發過程中,需要處理好各個類之間間的邏輯依賴關系和數據通信關系。正是因為如此,本次設計的目的在于學習Java程序設計基本技術,學習用android開發Java程序的相關技術,熟悉游戲“貪吃蛇”的需求,熟悉項目開發的完整過程。學會怎樣進行一個項目的需求分析、概要設計、詳細設計等軟件開發
4、過程,熟練地掌握Java程序設計的基本技術和方法,熟練地掌握android環境的使用方法,培養初步的項目分析能力和程序設計能力。 1.2 設計的主要內容貪吃蛇游戲設計與實現,主要分為以下三個模塊:游戲主界面模塊、游戲控制模塊和游戲菜單模塊。在此只實現游戲的游戲主界面模塊、游戲控制模塊和游戲菜單模塊,并且只是實現開始、暫停、退出等最基本簡單的功能。本次設計要達到的目標分別從以下模塊進行闡述:(1)游戲菜單模塊:這個模塊主要是為進入游戲做準備,是進入游戲的第一步,提供“開始游戲”“游戲幫助”“退出游戲”等按鈕,通過幫助按鈕簡單介紹游戲規則。(2)游戲主界面模塊:游戲的主界面是進入游戲后,能夠給玩家
5、第一感官的部分,主要包括游戲圖形區域界面、游戲分數以及關卡的顯示更新界面、提示退出游戲的快捷方式,游戲開始按鈕、暫停游戲按鈕以及退出游戲按鈕。從很大程度上決定了玩家對游戲的興趣問題,因此,游戲的主界面應該力求美觀,爽心悅目。(3)游戲控制模塊:這個模塊是游戲的中心環節,主要完成控制游戲的開始、暫停、退出,移動,加速等功能。為了能夠給玩家一個很好的游戲環境,這部分應該做到易懂、易操作。 1.4 設計實現功能和目標本設計所開發的是基于android手機平臺的一個貪吃蛇游戲軟件,主要實現游戲的開始、暫停、退出等功能,分為: 游戲主界面模塊、游戲控制模塊和游戲菜單三個模塊。性能:本軟件在設計方面本著方
6、便、實用及娛樂性高的宗旨,在對界面進行設計的過程中,始終堅持清晰明了,在性能方面能夠實現效率高,不易出錯等優點。(1)游戲主界面模塊:主要包括游戲圖形區域界面、游戲開始按鈕、暫停游戲按鈕、關閉按鈕。游戲的主界面應該力求美觀,爽心悅目。(2)游戲控制模塊:主要完成控制游戲的開始、暫停、退出等功能,這部分應該做到易懂、易操作而且準確率高,不易出錯。(3)游戲菜單模塊:是進入游戲主界面的第一步,提供“游戲幫助”等功能。這部分使貪吃蛇游戲軟件更加完善。1.5游戲設計環境android模擬器,模擬實現手機上的貪吃蛇游戲開發。軟件包括: android-sdk eclipse jdk-6u10-rc2-b
7、in-b32-windows-i586-p-12_sep_2008§2 游戲需求分析2.1 游戲處理流程 本次游戲設計的處理流程圖如下所示。開始初始化界面和蛇身放置食物蛇開始運動蛇吃到食?蛇長大蛇死亡?繼續續?退出界面NNYNY游戲者按鍵選擇Y2.2 需求分析2.2.1 用戶的特點 游戲開發成功后,最終用戶為各個年齡段的人群,用戶范圍相當廣泛。本游戲友好的用戶界面,簡單易學的按鈕操作以及簡單通俗的游戲規則,使廣大的用戶不需要專門進行培訓,就可以立即學會如何使用。2.2.2 功能需求貪吃蛇是一款經典的手機游戲,一條蛇在封閉圍墻里,通過按鍵盤上下左右四個鍵控制蛇向上下左右四個方向移動,如
8、果蛇頭撞倒食物,則食物被吃掉,蛇身體長一節,同時記1分;若吃到獎勵蘋果,加兩分;若吃到毒蘋果,則減3分。在游戲過程中,如果長按住方向鍵不放,則蛇的移動速度加快,松開方向鍵,恢復原速。如果蛇在移動中撞到墻或障礙物或者蛇頭撞倒自己身體,則游戲結束!(1) 游戲主界面模塊需求游戲界面主框架主要包括游戲圖形區域界面、游戲開始按鈕、游戲暫停按鈕、關閉按鈕。(2) 游戲圖形區域界面的需求游戲畫布區主要應該包括游戲畫布中貪吃蛇隨機出現的位置,貪吃蛇重新出現的位置,事物隨機出現的位置。(3) 游戲菜單模塊的需求游戲菜單模塊主要是為進入游戲主界面做準備,提供“游戲幫助”介紹游戲規則。同時提供進入游戲和退出游戲等
9、功能。2.2.3 屬性需求在可使用性方面,要求各個功能實現簡單,操作方便,系統處理正確;整個系統恢復性能好,連接速度快,以確保系統可使用性好。另外,還要求系統的可擴展性、可維護性、可移植性良好。2.3 功能模塊設計軟件開發過程中的功能模塊設計,主要解決實現該游戲需求的程序模塊設計問題。包括如何把該游戲劃分成若干個模塊、決定各個模塊之間的接口、模塊之間傳遞的信息,以及模塊結構的設計等。2.3.1 游戲功能 本系統主要完成以下幾方面的功能:游戲控制功能包括游戲的開始、暫停、退出界面布局其他輔助功能(如游戲幫助,游戲積分,游戲過關等)2.3.2 總設計模塊的劃分游戲總設計模塊劃分為游戲主要界面模塊、
10、游戲控制模塊和游戲菜單模塊。2.3.3 游戲主界面模塊游戲主界面模塊主要是指游戲的框圖,其包括一下內容:1、游戲界面的邊界,即游戲中的墻;2、游戲中蛇的構成,以及蘋果的構成;3、游戲中障礙物的構成;4、游戲中分數顯示以及關卡顯示。2.3.4 游戲控制模塊(1)游戲開始控制:我們的程序是使用上鍵開始游戲,啟動游戲后會有一個初始菜單界面,我們點擊“開始游戲”,彈出一句話“請按上鍵開始游戲”。游戲開始后蛇向下移動,然后由控制上下左右鍵來控制蛇的移動。 在程序中我們重新建了一個activity來控制游戲的開始,使游戲的開始界面更美觀。(2)游戲暫停控制:我們是使用center鍵來控制游戲的暫停的,這是
11、一項人性化的設計,當玩家在游戲過程中突遇緊急情況時可以按center鍵暫停游戲,等玩家空閑后按center鍵可以繼續游戲。(3)游戲退出控制:在游戲的退出上我們的程序使用了多種方式來應對不同的情況,當玩家正在游戲中時,如想退出可以按“1”鍵,程序會自動跳轉到初始菜單界面,在初始菜單界面點擊“退出游戲”即可退出游戲。如果玩家在游戲中由于碰到墻或者咬到自己或者碰到障礙物而導致游戲結束的,游戲或自動彈出一個界面,里面有提示是繼續游戲還是退出游戲,當點擊“取消”時,游戲就會自動跳轉到初始菜單,再點擊“退出游戲”即可。2.4 類模塊設計src源碼目錄:GameConstants地圖和移動;Operato
12、r為主要的邏輯運算類,判斷移動,吃食物,死亡;Guttler為蛇類;Block為用來標記每一個坐標點上的小方塊,主要記錄方塊在二維數組中的坐標;GameActivity為顯示游戲主Activity,沒找到更好的音效,就沒用增加音效Menu為菜單Activity;Welcome為 歡迎菜單;自己的圖片;GameView為自定義的View控件,顯示并更新游戲畫面2.5 游戲圖形界面的圖形顯示更新功能在初始菜單界面,我們的程序設置了三個功能鍵:“開始游戲”“游戲幫助”“退出游戲”,“開始游戲”是進入游戲的入口,“游戲幫助”是告訴玩家如何玩這個游戲,“退出游戲”是玩家退出游戲的出口。§3 游
13、戲的基本實現 3.1 GameConstants地圖和移動package oneRain.Guttler.constants;import android.app.Activity;import android.content.SharedPreferences;import oneRain.Guttler.logic.Operator;public class GameConstants /設置移動方向public static final int UP = 1;public static final int LEFT = 2;public static final int DOWN = 3
14、;public static final int RIGHT = 4;/設置常量public static final int GREEN_START = 1;public static final int RED_START = 2;public static final int YELLOW_START = 3;/消息類型public static final int MSG_UPDATE = 1;public static final int MSG_GAMEOVER = 2;public static final int MSG_PAUSE = 3;/方塊的大小public stati
15、c int SIZE = 20;/更新頻率public static int UPDATE_RATE = 500;/控制類public static Operator operator = null;/地圖二維數組public static int map;/設置當前方向public static int curOrientation = 3;/設置當前分數public static int score = 0;/設置第一次吃得到的分數public static int eveScore = 10;/SharedPreferencespublic static SharedPreference
16、s sp;/地圖選擇列表public static final String maps = ""2"型的", ""I"型的", ""U"型的"/地圖選擇public static int mapChoice = 4;3.2 Operator為主要的邏輯運算類,判斷移動,吃食物,死亡;package oneRain.Guttler.logic;import java.util.ArrayList;import java.util.List;import java.util.Ra
17、ndom;import oneRain.Guttler.constants.GameConstants;import oneRain.Guttler.model.Block;import oneRain.Guttler.model.Food;import oneRain.Guttler.model.Guttler;public class Operator /貪吃蛇對象private Guttler guttler = null;/食物對象private Food food = null;/地圖二維數組private int map = null;private int xCount, yCo
18、unt;private boolean foodFlag = false;/構造方法:參數部分可以對蛇的大小及位置做修改public Operator(int snakeLength, int xCount, int yCount) this.xCount = xCount;this.yCount = yCount;/初始化地圖initMap(xCount, yCount);/初始化貪吃蛇initSnake(snakeLength);/初始化地圖public void initMap(int xCount, int yCount)map = new intyCountxCount;food =
19、 new Food();/初始化蛇public void initSnake(int snakeLength)Block head = new Block(10, 1);List<Block> body = new ArrayList<Block>();for(int i=0; i<snakeLength; i+)body.add(new Block(9-i, 1);guttler = new Guttler(head, body, snakeLength);/以時間為變化更新地圖public int update(int orientation)/每一層更新都是
20、一次重繪clearTile();buildWall();if(!foodFlag)updateFood();foodFlag = true;buildFood();Block b = new Block();int x = 0;int y = 0;/主要分為移動和吃蘋果兩種情況switch(orientation)case GameConstants.UP:x = guttler.getHead().getX()-1;y = guttler.getHead().getY();break;case GameConstants.LEFT:x = guttler.getHead().getX();y
21、 = guttler.getHead().getY()-1;break;case GameConstants.DOWN:x = guttler.getHead().getX()+1;y = guttler.getHead().getY();break;case GameConstants.RIGHT:x = guttler.getHead().getX();y = guttler.getHead().getY()+1;break;b.setX(x);b.setY(y);/判斷是移動還是吃食物還是死亡if(mapxy = GameConstants.GREEN_START) |(mapxy =
22、GameConstants.YELLOW_START)/死亡return null;else if(mapxy = 0)/移動return move(b);else /吃食物return eat(b);/生成食物private void buildFood() if(foodFlag)setTile(GameConstants.RED_START, food.getFood().getX(), food.getFood().getY();/初始化食物public void updateFood()int x, y;/獲取隨機數doRandom random = new Random();x =
23、 Math.abs(random.nextInt() % (yCount-1);y = Math.abs(random.nextInt() % (xCount-1);/防止第一行或者第一列(左邊和上邊的墻)if(x = 0)x = 1;if(y = 0)y = 1;while(mapxy != 0);setTile(GameConstants.RED_START, x, y);food.setFood(new Block(x, y);/吃食物的情況public int eat(Block block)foodFlag = false;map = move(block);Block tail =
24、 guttler.getBody().get(guttler.getBody().size()-1);guttler.getBody().add(tail);setTile(GameConstants.YELLOW_START, tail.getX(), tail.getY();/根據吃食物的多少來修改刷新的頻率,和積分/延遲變短 GameConstants.UPDATE_RATE = (int) (GameConstants.UPDATE_RATE * 0.95);/得分增加GameConstants.score += GameConstants.eveScore;GameConstants
25、.eveScore = (int) (GameConstants.eveScore * 1.1);return map;/移動的情況public int move(Block block)/為身體賦值for(int i=guttler.getBody().size()-1; i>0; i-)/依次賦值guttler.getBody().set(i, guttler.getBody().get(i-1);/為身體第一個節點賦值賦值guttler.getBody().set(0, guttler.getHead();/為頭賦值guttler.setHead(block);/為蛇頭賦值setT
26、ile(GameConstants.RED_START, guttler.getHead().getX(), guttler.getHead().getY();/為蛇的身體賦值for(int i=0; i<guttler.getBody().size(); i+)Block b = guttler.getBody().get(i);setTile(GameConstants.YELLOW_START, b.getX(), b.getY();return map;/清空操作public void clearTile()for(int x=0; x<yCount; x+)for(int
27、 y=0; y<xCount; y+)setTile(0, x, y);/設置地圖顯示內容public void setTile(int picIndex, int x, int y)mapxy = picIndex;/根據不同的選擇繪制不同的墻public void buildWall()switch(GameConstants.mapChoice)case 0:build2Wall(); /繪制"2"型墻break;case 1:buildIWall(); /繪制"I"型墻break;case 2:buildUWall(); /繪制"
28、U"型墻break;default:buildNormalWall(); /繪制普通墻break;/繪制2型的墻public void build2Wall()buildNormalWall();int i, j;for(j=xCount/4; j<xCount*3/4; j+)setTile(GameConstants.GREEN_START, yCount/6, j);for(i=yCount/6; i<yCount/2; i+)setTile(GameConstants.GREEN_START, i, xCount*3/4);for(j=xCount/4; j<
29、;xCount*3/4+1; j+)setTile(GameConstants.GREEN_START, yCount/2, j);for(i=yCount/2; i<yCount*5/6; i+)setTile(GameConstants.GREEN_START, i, xCount/4);for(j=xCount/4; j<xCount*3/4; j+)setTile(GameConstants.GREEN_START, yCount*5/6, j);/繪制I型的墻public void buildIWall()buildNormalWall();int i, j;for(j=
30、xCount*2/5; j<xCount*3/5+1; j+)setTile(GameConstants.GREEN_START, yCount/4, j);for(i=yCount/4; i<yCount*3/4; i+)setTile(GameConstants.GREEN_START, i, xCount/2);for(j=xCount*2/5; j<xCount*3/5+1; j+)setTile(GameConstants.GREEN_START, yCount*3/4, j);/繪制U型墻public void buildUWall()buildNormalWal
31、l();int i, j;for(i=yCount/4; i<yCount*3/4; i+)setTile(GameConstants.GREEN_START, i, xCount/4);for(j=xCount/4; j<xCount*3/4+1; j+)setTile(GameConstants.GREEN_START, yCount*3/4, j);for(i=yCount/4; i<yCount*3/4; i+)setTile(GameConstants.GREEN_START, i, xCount*3/4);/繪制普通墻public void buildNormal
32、Wall()/左右兩邊for(int x=0; x<yCount; x+)setTile(GameConstants.GREEN_START, x, 0);setTile(GameConstants.GREEN_START, x, xCount-1);/上下兩邊for(int y=0; y<xCount; y+)setTile(GameConstants.GREEN_START, 0, y);setTile(GameConstants.GREEN_START, yCount-1, y);3.3 Block為用來標記每一個坐標點上的小方塊,主要記錄方塊在二維數組中的坐標;packag
33、e oneRain.Guttler.model;public class Block /定義圖片塊得x,y軸坐標private int x;private int y;public Block() super();/構造方法public Block(int x, int y) this.x = x;this.y = y;/Setter,Getter方法public int getX()return x;public void setX(int x) this.x = x;public int getY()return y;public void setY(int y) this.y = y;
34、3.4 GameActivity為顯示游戲主Activity,沒找到更好的音效,就沒用增加音效package oneRain.Guttler.ui;import oneRain.Guttler.R;import oneRain.Guttler.constants.GameConstants;import oneRain.Guttler.view.GameView;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.cont
35、ent.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.KeyEvent;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.LinearLayout;public class GameActivity extends
36、Activity private LinearLayout layout = null;private GameView gameView = null;MyHandler handler = new MyHandler();/音樂播放/private MediaPlayer mp = null;/是否暫停private boolean isPaused = false; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.la
37、yout.main); / initMusic(); initData(); initView(); ut.start(); / public void initMusic()/ / mp = MediaPlayer.create(this, R.raw.becauselove);/ / mp.start();/ public void initData() GameConstants.curOrientation = GameConstants.DOWN; GameConstants.map = null; GameConstants.operator = null; GameConstan
38、ts.UPDATE_RATE = 500; GameConstants.score = 0; GameConstants.eveScore = 10; GameConstants.mapChoice = getIntent().getIntExtra("map", 4); Overrideprotected void onResume() super.onResume();public void initView() layout = (LinearLayout)findViewById(R.id.layout); gameView = new GameView(this)
39、; gameView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); layout.addView(gameView); Overrideprotected void onPause() super.onPause();Overrideprotected void onStop() /GameConstants.mapChoice = 4;super.onStop();Overrideprotected void onDestroy() super.o
40、nDestroy();ut.setFlag(false);/mp.stop();private UpThread ut = new UpThread();/更新數據線程public class UpThread extends Threadprivate boolean flag = true;public void setFlag(boolean flag)this.flag = flag;Overridepublic void run() while(flag)try Thread.sleep(GameConstants.UPDATE_RATE);catch (InterruptedExc
41、eption e) e.printStackTrace();/判斷是否暫停if(!isPaused) /沒暫停的時候update();else /暫停的時候Message msg = new Message();msg.what = GameConstants.MSG_PAUSE;handler.sendMessage(msg);/更新數據public void update()GameConstants.map = GameConstants.operator.update(GameConstants.curOrientation);if(GameConstants.map = null)
42、/死了ut.setFlag(false);Message msg = new Message();msg.what = GameConstants.MSG_GAMEOVER;handler.sendMessage(msg);else /沒死Message msg = new Message();msg.what = GameConstants.MSG_UPDATE;handler.sendMessage(msg);/響應更新信息,更新UIpublic class MyHandler extends HandlerOverridepublic void handleMessage(Message
43、 msg)switch(msg.what)case GameConstants.MSG_UPDATE:gameView.invalidate();break;case GameConstants.MSG_GAMEOVER:/游戲死亡/看看有沒有更新排行榜int first = GameConstants.sp.getInt("first", 0);int second = GameConstants.sp.getInt("second", 0);int third = GameConstants.sp.getInt("third",
44、0);String congratulation = ""if(GameConstants.score < third) /未上榜else if(GameConstants.score > first) /比第一還牛xSharedPreferences.Editor editor = GameConstants.sp.edit();int t = GameConstants.sp.getInt("second", 0);editor.putInt("third", t);int s = GameConstants.sp.g
45、etInt("first", 0);editor.putInt("second", s);editor.putInt("first", GameConstants.score);mit();congratulation = "您一不小心就破了第一的記錄."else if(GameConstants.score > second) /上了榜,但是沒第一多,比第二多SharedPreferences.Editor editor = GameConstants.sp.edit();int t = GameConst
46、ants.sp.getInt("second", 0);editor.putInt("third", t);editor.putInt("second", GameConstants.score);mit();congratulation = "您一不小心就破了第二的記錄."else if(GameConstants.score > third) /上了榜,但是沒第一多,沒第二多,比第三多SharedPreferences.Editor editor = GameConstants.sp.edit();edi
47、tor.putInt("third", GameConstants.score);mit();congratulation = "您一不小心就破了第三的記錄."/彈出對話框AlertDialog.Builder builder = new AlertDialog.Builder(GameActivity.this);builder.setTitle("Game Over");builder.setMessage("你的分數是: " + GameConstants.score + "n"+ con
48、gratulation);builder.setPositiveButton("懂了", new DialogInterface.OnClickListener()public void onClick(DialogInterface dialog, int which) /退出程序Intent i = getIntent();i.putExtra("result", 1);GameActivity.this.setResult(0, i);finish(););builder.setNegativeButton("再玩一次", ne
49、w DialogInterface.OnClickListener()public void onClick(DialogInterface dialog, int which) Intent i = getIntent();i.putExtra("result", 0);GameActivity.this.setResult(0, i);finish(););builder.create().show();/gameView.invalidate();break;case GameConstants.MSG_PAUSE:/調用GameView重繪gameView.invalidate();break;/* * 按鍵監聽 */Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) switch(keyCode)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年公務員任職能力傾向測驗考試試卷及答案
- 現代化產業園區廠房及土地使用權租賃協議
- 采石場經營權轉讓及礦山環境風險評估合同
- 光環系統品牌管理制度
- 路基工程創優工點施工方案
- 宿舍被褥清洗管理制度
- 安全保證體系及保證措施
- 完善活力網格管理制度
- 公司租金付款管理制度
- 區域市場開發管理制度
- 大學生英語四級真題模擬試卷5份
- 2024年江蘇省蘇州市中考生物試卷(含答案)
- DL-T 1071-2023 電力大件運輸規范
- 污水提升泵站沉井施工方案
- 遼寧省沈陽市和平區2023-2024學年七年級下學期期末地理試題
- 山東省淄博市臨淄區2023-2024學年七年級下學期期末地理試題
- 大學《醫學統計學》期末復習章節知識點、考點總結
- 旁通道凍結法技術規程完整
- 2024年中考理化生實驗操作考試安全應急預案
- 琴生不等式1市公開課一等獎省賽課微課金獎課件
- 鼻淵護理常規課件
評論
0/150
提交評論