久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

java實現推箱子小游戲

瀏覽:2日期:2022-09-01 13:14:51

本文實例為大家分享了java實現推箱子游戲的具體代碼,供大家參考,具體內容如下

運行示例:

java實現推箱子小游戲

圖形界面由swing組件構成

生成地圖的算法如下

創建地圖算法(produceMap):先將二維數組全置為1,代表初始狀態全為墻。先隨機產生兩個不重合的點,一個作為人的起點,另一個作為箱子的起點。從起點開始,隨機朝四個方向走一定的步數,若走到的點不是空地,即對應數組元素不為0,則將該點設為空地,即數組元素設為0。將地圖分為左上、左下、右上和右下四個區域,并設置四個變量記錄四個區域已開辟空地的數量。每開辟一塊空地,代表該空地所在區域的變量加1。走完規定的步數后,在四個區域中找到開辟空地數量最小的區域,在該區域內隨機產生一個點,以該點作為起點循環執行上述操作,直到開辟的空地的總數大于地圖總面積的一半,創建完成。

解決地圖算法(solveMap):創建一個狀態類,將箱子的一個位置和在搜索這個箱子的過程中人的一個位置以及箱子走到這個位置的步數表示為一個狀態。建立一個優先隊列,隊列元素為狀態類的對象,步數小的狀態的優先級高。從起點開始按照上下左右的順序進行廣度優先搜索。建立一個HashMap,鍵為狀態類,值為布爾類,用來保存每個狀態的是否被走過,再建立一個HashMap,鍵為點類,值也為點類,保存箱子的每一個位置的前一個位置,用于最后輸出路徑。使用優先隊列可以使推動箱子次數多的狀態推遲出隊,從而保證箱子每個能推動的方向都被訪問到并推動,若直接使用隊列,則無法使每種情況都走到。而當地圖較大的時候,采用HashMap存儲訪問信息可以節省較大的空間。優先隊列每次執行出隊操作的時候記錄出隊狀態的步數,當當前出隊狀態的步數和上一個出隊狀態的步數不同的時候,將保存狀態訪問信息的HashMap清空。另設置一個HashMap鍵為點類,值為整型類,保存每個點箱子訪問過幾次,若超過四次,則不訪問該點。由優先隊列的性質可知,出隊的狀態的步數是隊列中步數最小的狀態,即當當前出隊的狀態的步數和前一個不同的時候,箱子前一步的狀態已全部出隊。這時箱子之前的訪問狀態已經不再需要,及時清空保存訪問狀態的HashMap可以節省很大的內存空間。當廣搜搜到箱子在終點位置的狀態,則搜索結束。若結束狀態的步數小于規定的最小步數,則返回解決失敗,否則返回解決成功。若未搜到箱子在終點位置的狀態并且隊列已空,則返回解決失敗。

記錄路徑算法(recordPath):根據在解決地圖的過程中建立的記錄箱子每個位置前一個位置的一個HashMap,從終點開始,一步步找回起點,并將在這過程中找到的點按順序入棧,然后再將棧中的點逐個出棧并記錄在一個點的數組中,以實現路徑的正序輸出。

Main_Class.java

public class Main_Class { public static void main(String args[]) { PTB_Frame frame=new PTB_Frame('Push The Box'); frame.setBounds(0,0,1200,1200); }}

PTB_Frame.java

import java.awt.*;import java.awt.event.*; import javax.swing.*;@SuppressWarnings('serial') public class PTB_Frame extends JFrame { private Font font = new Font('宋體', Font.PLAIN, 23); private Map_Manager map_manager=new Map_Manager(); private ConsolePanel console = new ConsolePanel(map_manager); private JButton creat_map=new JButton('創建地圖'); private MapPanel map=new MapPanel(map_manager); PTB_Frame(String title) { init(); this.setTitle(title); this.setVisible(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); } void init() { this.setLayout(null); console.setBounds(0, 0, 1200,250); console.add(creat_map); this.add(console); map.setBounds(80, 250, 1200, 800); this.add(map); creat_map.setFont(font); creat_map.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { console.creatMap(); map.setMap(map_manager.getHeight(), map_manager.getWidth(), map_manager.getStepOfMap(), map_manager.getMap()); map.creatMap(); } }); }}

ConsolePanel.java

import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener; @SuppressWarnings('serial')public class ConsolePanel extends JPanel { Font font = new Font('宋體', Font.PLAIN, 23); JTextField t_height = new JTextField(3); JTextField t_width = new JTextField(3); JTextField t_diff = new JTextField(5); JButton get_path = new JButton('查看最短路徑'); JTextArea show_path = new JTextArea(5, 40); int height, width; double diff; Map_Manager map_manager; ConsolePanel(Map_Manager map_manager) { this.map_manager = map_manager; UIManager.put('Label.font', font); this.add(new JLabel('地圖高度:')); t_height.setFont(font); this.add(t_height); this.add(new JLabel('(3~100的整數)')); this.add(new JLabel('地圖寬度:')); t_width.setFont(font); this.add(t_width); this.add(new JLabel('(3~100的整數)')); this.add(new JLabel('地圖難度:')); t_diff.setFont(font); this.add(t_diff); this.add(new JLabel('(1.0~10.0之間的小數)')); this.add(new JLabel('注:地圖高度和寬度以及難度越大,生成地圖時間越長')); get_path.setFont(font); this.add(get_path); show_path.setFont(font); show_path.setLineWrap(true);// 自動換行 show_path.setWrapStyleWord(true);// 換行不斷字 JPanel show_path_panel = new JPanel(); show_path_panel.add(new JScrollPane(show_path));//滾動窗口 this.add(show_path_panel); get_path.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Map_Manager.Point path[] = map_manager.getPath(); if (path != null) { show_path.setText(null); for (int i = 0; i<map_manager.getStepOfMap(); ++i) show_path.append(path[i] + ' '); } } }); } public void creatMap() { try { height = Integer.valueOf(t_height.getText()); width = Integer.valueOf(t_width.getText()); diff = Double.valueOf(t_diff.getText()); if (height < 3 || height > 100 || width < 3 || width > 100 || diff < 1 || diff > 10) throw new NumberFormatException(); map_manager.setMap(height, width, diff); map_manager.creatMap(); show_path.setText(null); } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(getRootPane(), '參數格式不正確'); } }}

MapPanel.java

import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.util.*; @SuppressWarnings('serial')public class MapPanel extends JPanel { private Font font = new Font('宋體', Font.PLAIN, 23); private JPanel map_area; JPanel control_bar = new JPanel(); private JButton drawback, restart,start; private JLabel l_min_step, l_left_step, l_passed_step; private JLabel show_cur_point; private JLabel show_cur_box; private Point person = new Point(); private Point start_of_person = new Point(); private Point start_of_box = new Point(); private Point end = new Point(); private Point box = new Point(); private int width, height; private int map[][] = new int[100][100]; private int di[][] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; private int min_step, passed_step = 0; private Stack<Operation> operation_recorder = new Stack<Operation>(); private JButton block[][] = new JButton[100][100]; private Map_Manager map_manager; private class Point implements Cloneable { int x, y; public boolean equals(Object obj) { if (!(obj instanceof Point)) return false; Point point = (Point) obj; return this.x == point.x && this.y == point.y; } public Object clone() { Point newPoint = null; try { newPoint = (Point) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return newPoint; } public String toString() { return '(' + (this.x + 1) + ',' + (this.y + 1) + ')'; } } public void setMap(int height, int width, int min_step, int map[][]) { this.height = height; this.width = width; this.min_step = min_step; this.map = map; } private class PtbKeyAdapter extends KeyAdapter { public void keyPressed(KeyEvent e) { int keycode = e.getKeyCode(); if (keycode == KeyEvent.VK_UP) { pointMove(0); } else if (keycode == KeyEvent.VK_DOWN) { pointMove(1); } else if (keycode == KeyEvent.VK_LEFT) { pointMove(2); } else if (keycode == KeyEvent.VK_RIGHT) { pointMove(3); } } } private class Operation { int stuff;// 1代表箱子,0代表人 int dir;// 0代表上,1代表下,2代表左,3代表右 Operation(int stuff, int dir) { this.stuff = stuff; this.dir = dir; } } private boolean accessible(Point point) {// point可走則返回true if (point.x < 0 || point.x >= height || point.y < 0 || point.y >= width)// 越界 return false; if (map[point.x][point.y] == 1)// 走到墻上 return false; return true; } private void pointMove(int dir) { if(passed_step>=min_step) return; // 先判斷能否進行交換,若能,則交換兩按鈕顏色值 Point cur_point = new Point(); cur_point.x = person.x + di[dir][0]; cur_point.y = person.y + di[dir][1]; if (!accessible(cur_point))// 當前點不可走 return; if (cur_point.equals(box)) { // 當人前進方向上前一個點是箱子 Point next_box = new Point(); next_box.x = box.x + di[dir][0]; next_box.y = box.y + di[dir][1]; if (!accessible(next_box))// 箱子無法推動 return; // 如果箱子能前進,則人也前進,不能則人不能前進 go(box, dir); ++this.passed_step; updateStep(); operation_recorder.push(new Operation(1, dir)); } go(person, dir); show_cur_point.setText(' '+person.toString()+' '); operation_recorder.push(new Operation(0, dir)); if (box.equals(end)) JOptionPane.showMessageDialog(this.getRootPane(), 'WINNER WINNER CHICKEN DINNER!'); else if(this.passed_step==this.min_step) JOptionPane.showMessageDialog(this.getRootPane(), '江河猶在,命數已盡,悲哉!'); } private void go(Point point, int dir) {// 實現前進部分的代碼 Color color = block[point.x][point.y].getBackground(); if (point.equals(end)) block[point.x][point.y].setBackground(Color.GREEN); else block[point.x][point.y].setBackground(Color.WHITE); point.x += di[dir][0]; point.y += di[dir][1]; block[point.x][point.y].setBackground(color); } private void updateStep() { l_passed_step.setText(Integer.toString(passed_step)); l_left_step.setText(Integer.toString(min_step - passed_step)); show_cur_box.setText(' '+box.toString()+' '); } public void paintMap() { map_area = new JPanel(new GridLayout(this.height, this.width)); for (int i = 0; i < this.height; i++) for (int j = 0; j < this.width; j++) { block[i][j] = new JButton(); if (map[i][j] == 0)// 數組中0為路 block[i][j].setBackground(Color.WHITE); else if (map[i][j] == 1)// 數組中1為墻 block[i][j].setBackground(Color.BLACK); else if (map[i][j] == 2)// 數組中2為箱子位置 { block[i][j].setBackground(Color.BLUE); start_of_box.x = i; start_of_box.y = j; } else if (map[i][j] == 3)// 數組中3為終點 { block[i][j].setBackground(Color.GREEN); end.x = i; end.y = j; } else if (map[i][j] == 4) {// 數組中4為人的位置 block[i][j].setBackground(Color.RED); start_of_person.x = i; start_of_person.y = j; } map_area.add(block[i][j]); } person = (Point) start_of_person.clone(); box = (Point) start_of_box.clone(); l_min_step.setText(Integer.toString(min_step)); show_cur_point.setText(' '+person.toString()+' '); passed_step=0; updateStep(); int map_height=750,map_width=750; if(this.height>this.width) map_width=(750/this.height)*this.width; else if(this.width>this.height) map_height=(750/this.width)*this.height; map_area.setBounds(0, 0, map_width, map_height); this.add(map_area); } public MapPanel(Map_Manager map_manager) { this.map_manager = map_manager; init(); } private void init() { this.setLayout(null); map_manager.setMap(20, 20, 7.0); map_manager.creatMap(); this.height = map_manager.getHeight(); this.width = map_manager.getWidth(); this.min_step = map_manager.getStepOfMap(); this.map = map_manager.getMap(); UIManager.put('Label.font', font); drawback = new JButton('后退一步'); restart = new JButton('重新開始'); start=new JButton('開始'); control_bar.add(new JLabel('當前箱子的位置')); show_cur_box=new JLabel(); control_bar.add(show_cur_box); control_bar.add(new JLabel('當前人的位置')); show_cur_point=new JLabel(); control_bar.add(show_cur_point); control_bar.add(new JLabel('最短步數:')); l_min_step = new JLabel(); l_min_step.setFont(font); control_bar.add(l_min_step); control_bar.add(new JLabel('已走步數:')); l_passed_step = new JLabel(); l_passed_step.setFont(font); control_bar.add(l_passed_step); control_bar.add(new JLabel('剩余步數:')); l_left_step = new JLabel(); l_left_step.setFont(font); control_bar.add(l_left_step); control_bar.add(new JLabel('注:這里的步數是')); control_bar.add(new JLabel('箱子移動的步數')); control_bar.add(new JLabel('紅色代表人')); control_bar.add(new JLabel('藍色代表箱子')); control_bar.add(new JLabel('綠色代表終點')); restart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { block[person.x][person.y].setBackground(Color.WHITE); person = (Point) start_of_person.clone(); block[box.x][box.y].setBackground(Color.WHITE); box = (Point) start_of_box.clone(); block[person.x][person.y].setBackground(Color.RED); block[box.x][box.y].setBackground(Color.BLUE); block[end.x][end.y].setBackground(Color.GREEN); passed_step = 0; show_cur_point.setText(' '+person.toString()+' '); updateStep(); } }); drawback.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (operation_recorder.empty()) return; Operation cur_op = operation_recorder.peek(); operation_recorder.pop(); int dir; switch (cur_op.dir) {// 得到相反方向 case 0: dir = 1; break; case 1: dir = 0; break; case 2: dir = 3; break; default: dir = 2; } // 推箱子的時候,箱子先走,人再走 // 不推箱子的時候直接就是人走,所以棧頂元素始終是人的操作 go(person, dir);// 人相反方向走一步 show_cur_point.setText(' '+person.toString()+' '); if (!operation_recorder.empty()&&operation_recorder.peek().stuff == 1) { // 下一個是箱子,即人從該位置推動的箱子 go(box, dir);// 箱子相反方向走一步 operation_recorder.pop(); --passed_step; updateStep(); } } }); PtbKeyAdapter ptbkeyadapter=new PtbKeyAdapter(); start.addKeyListener(ptbkeyadapter); restart.addKeyListener(ptbkeyadapter); drawback.addKeyListener(ptbkeyadapter); start.setFont(font); restart.setFont(font); drawback.setFont(font); control_bar.add(start); control_bar.add(restart); control_bar.add(drawback); control_bar.setBounds(850, 100, 200, 600); this.paintMap(); this.add(control_bar); } public void creatMap() { this.setLayout(null); this.map_area.removeAll(); this.map_area.setVisible(false); paintMap(); this.revalidate(); this.map_area.setVisible(true); }}

Map_Manager.java

import java.util.*; public class Map_Manager { private PTB_Map ptb_map = new PTB_Map(); private int di[][] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; private double search_limit; private int area[] = new int[4]; private Map<Status, Boolean> visit_of_status = new HashMap<Status, Boolean>(); private Map<Point, Integer> visit_of_box = new HashMap<Point, Integer>(); private PriorityQueue<Status> q = new PriorityQueue<Status>(new Comparator<Status>() { public int compare(Status s1, Status s2) { return s1.step - s2.step; } }); private class PTB_Map { private int width; private int height; private int step_of_map; private int accessible_point; private Point end_p = new Point(); private Status start = new Status(); private int matrix[][] = new int[100][100]; private Map<Point, Point> path_map = new HashMap<Point, Point>(); private Point[] path = new Point[1000]; private double ratio_of_space; private double ratio_of_step; } public class Point implements Cloneable { int x, y; public boolean equals(Object obj) { if (!(obj instanceof Point)) return false; Point point = (Point) obj; return this.x == point.x && this.y == point.y; } public int hashCode() { return this.x * ptb_map.width + this.y; } public Object clone() { Point newPoint = null; try { newPoint = (Point) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return newPoint; } public String toString() { return '(' + (this.x + 1) + ',' + (this.y + 1) + ')'; } } private class Status implements Cloneable { Point box = new Point(); Point person = new Point(); int step; public int hashCode() { return this.box.hashCode() * this.person.hashCode() + this.step; } public boolean equals(Object obj) { if (!(obj instanceof Status)) return false; Status status = (Status) obj; return this.box.equals(status.box) && this.person.equals(status.person) && this.step == status.step; } public Object clone() { Status newStatus = null; try { newStatus = (Status) super.clone(); newStatus.box = (Point) box.clone(); newStatus.person = (Point) person.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return newStatus; } } public void setMap(int height, int width, double degree_of_difficulty) { this.ptb_map.height = height; this.ptb_map.width = width; this.ptb_map.ratio_of_space = 0.5; double ratio = 1; if (height + width < 20) ratio = 0.05 * (height + width); this.ptb_map.ratio_of_step = 0.5 + degree_of_difficulty * 0.05 * ratio; this.search_limit = (this.ptb_map.height * this.ptb_map.width) / 10; } public int getHeight() { return ptb_map.height; } public int getWidth() { return ptb_map.width; } public int getStepOfMap() { return ptb_map.step_of_map; } private boolean accessible(Point point) {// point可走則返回true if (point.x < 0 || point.x >= ptb_map.height || point.y < 0 || point.y >= ptb_map.width)// 越界 return false; if (ptb_map.matrix[point.x][point.y] == 1)// 走到墻上 return false; return true; } private void creatSpace(Point point) { Random random = new Random(); int l = 0; while (l <= search_limit) { int dir = random.nextInt(4); if (point.x + di[dir][0] < 0 || point.x + di[dir][0] >= ptb_map.height || point.y + di[dir][1] < 0 || point.y + di[dir][1] >= ptb_map.width) continue;// 若往該方向走一步越界,則換個方向 point.x += di[dir][0]; point.y += di[dir][1]; if (this.ptb_map.matrix[point.x][point.y] != 0) { if (point.y < ptb_map.width / 2) { if (point.x < ptb_map.height / 2) ++area[0];// 該點在左上方 else ++area[1];// 該點在左下方 } else { if (point.x < ptb_map.height / 2) ++area[2];// 該點在右上方 else ++area[3];// 該點在右下方 } this.ptb_map.matrix[point.x][point.y] = 0; ++this.ptb_map.accessible_point; } ++l; } } private boolean produceMap() {// 返回值為地圖是否創建成功 Random random = new Random(); // 重置地圖的矩陣 for (int i = 0; i < ptb_map.height; ++i) for (int j = 0; j < ptb_map.width; ++j) ptb_map.matrix[i][j] = 1; do// 隨機設置人和箱子的初始位置 { ptb_map.start.box.x = random.nextInt(ptb_map.height); ptb_map.start.box.y = random.nextInt(ptb_map.width); ptb_map.start.person.x = random.nextInt(ptb_map.height); ptb_map.start.person.y = random.nextInt(ptb_map.width); } while (ptb_map.start.box.equals(ptb_map.start.person)); ptb_map.accessible_point = 0; ptb_map.matrix[ptb_map.start.person.x][ptb_map.start.person.x] = 0; // 設置一定的墻 ptb_map.accessible_point = 0; Point start = (Point) ptb_map.start.person.clone();// 最開始走的位置為人的初始位置 area[0] = area[1] = area[2] = area[3] = 0; creatSpace(start); while (ptb_map.accessible_point < (ptb_map.height * ptb_map.width) * ptb_map.ratio_of_space) { int min = 10000, min_area = 0; for (int i = 0; i < 4; ++i) if (area[i] < min) { min = area[i]; min_area = i; } switch (min_area) { case 0:// 左上 start.x = random.nextInt(ptb_map.height / 2); start.y = random.nextInt(ptb_map.width / 2); break; case 1:// 左下 start.x = random.nextInt(ptb_map.height / 2) + ptb_map.height / 2; start.y = random.nextInt(ptb_map.width / 2); break; case 2:// 右上 start.x = random.nextInt(ptb_map.height / 2); start.y = random.nextInt(ptb_map.width / 2) + ptb_map.width / 2; break; case 3:// 右下 start.x = random.nextInt(ptb_map.height / 2) + ptb_map.height / 2; start.y = random.nextInt(ptb_map.width / 2) + ptb_map.width / 2; break; } creatSpace(start); } ptb_map.end_p = (Point) start.clone(); ptb_map.matrix[ptb_map.start.person.x][ptb_map.start.person.y] = 4; ptb_map.matrix[ptb_map.start.box.x][ptb_map.start.box.y] = 2; ptb_map.matrix[ptb_map.end_p.x][ptb_map.end_p.y] = 3; return true; } private boolean solveMap() {// 返回值為當前地圖是否有路徑 q.clear(); visit_of_box.clear(); ptb_map.path_map.clear(); ptb_map.step_of_map = 0; ptb_map.start.step = 0; int pre_step = -1; q.add(ptb_map.start); visit_of_status.put(ptb_map.start, true); while (!q.isEmpty()) { Status pre_Status = (Status) q.peek().clone(); if (pre_Status.step != pre_step) { visit_of_status.clear(); pre_step = pre_Status.step; } for (int i = 0; i < 4; ++i) { Status cur_Status = (Status) pre_Status.clone(); cur_Status.person.x += di[i][0]; cur_Status.person.y += di[i][1]; if (!accessible(cur_Status.person))// 該點不可走 continue; if (visit_of_status.containsKey(cur_Status))// 該點已經走過 continue; // 保存當前點的前一個,用于輸出路徑 if (cur_Status.person.equals(cur_Status.box))// 走到箱子上 { Point next_box = new Point();// 當前人會把箱子推到的位置 next_box.x = cur_Status.box.x + di[i][0]; next_box.y = cur_Status.box.y + di[i][1]; if (!accessible(next_box))// 該點不可走 continue; if (ptb_map.path_map.containsKey(next_box)) continue; if (visit_of_box.containsKey(next_box)) { if (visit_of_box.get(next_box) > 4)// 當前位置箱子已走過四次 continue; } // 箱子可以走到該點,則箱子走一步 ptb_map.path_map.put(next_box, cur_Status.box); cur_Status.box = next_box; ++cur_Status.step; if (!visit_of_box.containsKey(cur_Status.box)) visit_of_box.put(cur_Status.box, 1); else { int t = visit_of_box.get(cur_Status.box); ++t; visit_of_box.put(cur_Status.box, t); } if (cur_Status.box.equals(ptb_map.end_p))// 箱子走到終點 { ptb_map.step_of_map = cur_Status.step; q.clear(); if (ptb_map.step_of_map < (ptb_map.height + ptb_map.width) * ptb_map.ratio_of_step) return false; else return true; } } q.add(cur_Status); visit_of_status.put(cur_Status, true); } pre_Status = null; q.poll(); } return false; } public void recordPath() {// 記錄路徑 Stack<Point> output_path = new Stack<Point>();// 用于輸出路徑 Point cur_point = (Point) ptb_map.end_p.clone();// 從終點開始 int step = -1; while (step != ptb_map.step_of_map) { ++step; output_path.push(cur_point); cur_point = ptb_map.path_map.get(cur_point); if (cur_point == null) break; } int i = 0; while (!output_path.empty())// 將路徑保存在點數組里 { ptb_map.path[i] = output_path.peek(); output_path.pop(); ++i; } } public void creatMap() { int i = 0; do { while (!produceMap()) ; ++i; } while (!solveMap()); recordPath(); printMap();// System.out.println(i);// } public int[][] getMap() { return ptb_map.matrix; } public Point getStartBoxPoint() { return ptb_map.start.box; } public Point getStartPersonPoint() { return ptb_map.start.person; } public Point getEndPoint() { return ptb_map.end_p; } private void printMap() { for (int i = 0; i < ptb_map.height; ++i) { System.out.print(ptb_map.matrix[i][0]); for (int j = 1; j < ptb_map.width; ++j) System.out.print(' ' + ptb_map.matrix[i][j]); System.out.println(); } } public Point[] getPath() { return ptb_map.path; }}

更多精彩游戲,請參考專題《java經典小游戲》

更多有趣的經典小游戲實現專題,分享給大家:

C++經典小游戲匯總

python經典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經典游戲 玩不停

javascript經典小游戲匯總

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 免费a大片| 国产a级大片 | 狠狠视频 | 黄色一级片视频播放 | 精品www| 国产精品1区2区在线观看 | 亚洲福利 | 毛片com| 一区视频| 国产成人免费视频网站高清观看视频 | 亚洲精品一区二区三区四区高清 | 思热99re视热频这里只精品 | 成人视屏在线观看 | 国产综合久久久久久鬼色 | 天天操天天干天天爽 | 欧美精品一区二区在线观看 | 国产成人精品一区一区一区 | 亚洲欧美另类在线观看 | 国产91黄色 | 亚洲免费观看视频 | 色视频网站免费看 | 日日夜夜av | 国产在线拍 | 在线看片日韩 | 亚洲国产高清在线 | 亚洲人成人一区二区在线观看 | 国产成人精品久久二区二区91 | 免费看国产片在线观看 | 夜夜艹| 青青久视频| 99热热热 | 国产精品一区二区无线 | 一区二区在线 | 亚洲午夜精品视频 | 自拍偷拍欧美 | 国产精品一区av | 中国特级毛片 | 人人九九精 | 精品久久久久久亚洲综合网 | 欧美日韩一级二级三级 | 日批免费在线观看 | www亚洲成人 | 日干夜干天天干 | 国产精品成人一区二区 | 国产精品第一国产精品 | 综合在线视频 | 成人欧美一区二区三区黑人孕妇 | 亚洲精品电影在线一区 | 国产成人精品网站 | 色婷婷综合网 | 日韩欧美国产一区二区 | 久久久久中文 | 美女久久久久 | 99re6在线视频精品免费 | 亚洲在线视频 | 国产成人一区二区三区 | 欧美精品片 | 欧美一区视频 | 三a毛片| 成人在线免费观看 | 亚洲国产精品va在线看黑人 | 欧美综合婷婷 | 99re在线观看 | 一区二区三区四区在线播放 | 亚洲国产aⅴ成人精品无吗 一区视频在线 | 91精品国产综合久久久久久丝袜 | 国产午夜精品久久久久久久 | 欧美视频一区二区三区在线观看 | 久久三区 | 国产一区二区在线看 | 国产精品一区电影 | 成人日韩在线观看 | 国产成人综合在线 | 日本精品免费在线观看 | 国产精品视频一区二区三区 | 精品久久久久久久久久久久久久 | 蜜臀91精品国产高清在线观看 | 天天艹综合 | 欧美在线播放 | 久久久国产精品 | 九九热这里都是精品 | 一区二区免费视频 | av解说在线精品 | 国产做a爰片久久毛片a我的朋友 | 国产亚洲女人久久久久毛片 | 日韩第一区| 欧美不卡 | 亚洲欧洲免费视频 | 亚州精品视频 | 一区二区av在线 | 国产精品永久 | 日韩久久一区二区 | 亚洲精品一区二区三区樱花 | 免费一区二区三区 | 91av原创| 日本欧美大片 | 国产精品视频免费观看 | 国产一区二区三区四区五区加勒比 | 嫩草视频在线播放 | 老司机福利在线观看 | 99看片| 亚洲午夜精品一区二区三区他趣 | 国产最新视频 | 欧美国产日韩一区二区 | 国产精品中文字幕在线 | 国产精品极品美女在线观看免费 | 四虎影院网站 | 性色视频在线观看 | 久久女同互慰一区二区三区 | 日批免费视频 | 亚洲aⅴ天堂av在线电影软件 | 欧美日韩精品一区二区三区蜜桃 | 精品成人一区二区 | 天天舔天天干天天操 | 黄色国产| 国产精品91网站 | 国产精品久久免费看 | 国产不卡免费视频 | 亚洲精品国产剧情久久9191 | 国产精品极品美女在线观看免费 | 欧美成人免费视频 | 国产男人的天堂 | 亚洲欧美高清 | 久久久人成影片一区二区三区 | 99精品国产在热久久 | 一级毛片视频 | 欧美a级在线观看 | 久久免费看 | a级在线 | 一级黄色录象片 | 国产欧美日韩精品一区 | 日p视频免费看 | 91在线视频免费观看 | 日韩精品一区二区三区老鸭窝 | 精品久久久久久亚洲综合网 | hd国产人妖ts另类视频 | 91视频在线免费观看 | 国产欧美综合视频 | 操操操小说| 国产婷婷精品 | 激情欧美一区二区三区中文字幕 | 成人免费视频 | 91综合网 | 国产精品一区二区不卡 | 爱爱免费视频网站 | 一区二区中文字幕 | 一级黄色大片在线 | 日日撸 | 黄色影片免费在线观看 | 免费在线观看av | 成人久久久精品国产乱码一区二区 | 亚洲综合中文网 | 久久成 | 337p日本粉嫩噜噜噜 | 亚洲电影免费 | 国产日韩一区二区 | 国产精品精品 | 成人精品免费视频 | 日本a在线 | 蜜桃视频精品 | 国产成人网 | 日韩超级大片免费看国产国产播放器 | 成人免费一区二区三区 | 九九久久影视 | 欧美一级淫片免费视频黄 | 羞羞的视频在线 | 日韩av免费在线观看 | 国产毛片在线看 | 在线国产视频 | 91高清视频在线观看 | 精品国产一区探花在线观看 | 国精日本亚洲欧州国产中文久久 | 日日爱视频 | 久久夜精 | 国精日本亚洲欧州国产中文久久 | 国产福利在线观看视频 | 国产精品无码永久免费888 | 91视频免费看 | 中文字幕一区二区三区在线视频 | 国产一区二区免费 | 亚洲xx视频 | 不卡一二| 精品久久久久久久久久 | 日韩精品一区二区三区在线观看 | 在线a电影 | 午夜精品视频 | 精品一区二区视频 | 国产亚洲欧美在线 | 视频1区2区 | 成人在线观看av | 99精品欧美一区二区三区综合在线 | 精品国产仑片一区二区三区 | 黄色资源在线观看 | 国产精品久久久久9999鸭 | 中文字幕一区二区三区四区 | 欧美性久久 | 丝袜 亚洲 另类 欧美 综合 | 黄色免费在线观看网址 | 黄色毛片免费看 | 日韩毛片在线视频 | 成人免费xxxxx在线观看 | 久久激情网站 | 国产日韩欧美精品一区二区三区 | 久久久久久国产一级毛片高清版 | 国产亚洲欧美一区二区三区 | 国产乱码精品一区二区三区手机版 | 超碰香蕉 | 久久一区二区精品 | 1区在线| 亚洲一区免费观看 | 国产黄色免费视频 | 亚洲精品大片 | 亚洲精品乱码久久久久久久 | 欧美精品一区在线 | 亚洲精品国偷拍自产在线观看 | 亚洲综合99 | 国产精品一区二区三 | 久久久综合色 | 一区二区免费视频 | 亚洲视频区 | 污视频在线观看免费 | 欧美亚洲一区二区三区 | 狠狠夜夜 | 中文字幕亚洲精品 | 日韩一区二区精品 | 日韩一区二区免费视频 | 欧美精产国品一二三区 | 日韩欧美国产精品综合嫩v 久久久久久国产精品高清 国产目拍亚洲精品99久久精品 | 国外成人在线视频 | 另类中文字幕 | 国产成人涩涩涩视频在线观看 | 视频一区二区三区在线播放 | 精品中文字幕在线 | 日韩中文一区二区三区 | 日韩视频在线免费 | 久久久久久九九九 | 欧美不卡视频一区发布 | 日韩精品免费在线视频 | 国产成人精品一区二区三区四区 | 日本精品视频在线观看 | 欧美成年人视频 | 免费视频爱爱太爽了 | 不卡一区 | 色图综合 | 精品久久久久久久久久久久久久 | 欧美精品1区2区3区 免费亚洲婷婷 | 成人免费av | 91一区| 精品国产不卡一区二区三区 | 91精品在线播放 | 欧美自拍三区 | 成年网站视频 | 日韩极品在线 | 欧美国产在线视频 | 亚洲黄色片免费 | 一级片免费在线 | 国产欧美精品区一区二区三区 | 欧美综合久久久 | 日韩蜜桃 | 国产午夜精品久久 | 久久成人精品 | 欧美日韩国产一区 | 亚洲 国产 另类 精品 专区 | 中文字幕一区二区三区乱码图片 | 精品国产一区二区三区久久影院 | www.9191| 日韩成人影视 | 在线成人av观看 | 国产乱视频网站 | 精品亚洲一区二区三区 | 国产精品成av人在线视午夜片 | 欧美一区二区三区在线观看视频 | 九九热这里只有精品在线观看 | 韩国一区二区视频 | 在线观看日韩 | 国产aⅴ一区二区 | 人人澡人人射 | 看一级黄色大片 | 欧美国产一区二区 | 欧美一区久久 | 中文字幕av高清 | 中文字幕一区二区三区乱码在线 | 在线成人国产 | 日韩av免费在线观看 | 欧美国产精品一区二区 | 在线观看欧美一区 | 成人免费xxx在线观看 | 二区在线观看 | 成人欧美一区二区三区视频xxx | www.黄色片视频 | 成人精品视频99在线观看免费 | 欧美一级在线观看视频 | 久草视| 精品国产鲁一鲁一区二区在线观看 | 激情欧美一区二区三区中文字幕 | 有码在线 | 亚洲青涩在线 | 1区2区视频 | 久久久久国产成人精品亚洲午夜 | 亚洲精品乱码 | 国外成人在线视频 | 国产在线中文字幕 | 91成人在线免费视频 | 午夜窝窝 | 成人精品 | 久久精品亚洲精品 | 玖玖操 | 成人国产精品视频 | 亚洲国产成人精品女人久久久 | 欧美日韩亚洲国产 | 中文字幕在线视频精品 | 日日操天天操 | 精品国产欧美一区二区三区成人 | 欧美亚洲激情 | 九九免费视频 | 日韩中文字幕在线 | 久久av网| 亚洲成人精品视频 | 国产精品一区二区三区99 | av网站推荐 | 国产成人久久 | 成人久久久久久久 | 国产精品国产三级国产aⅴ中文 | 亚洲精品在线成人 | 日本一区二区三区免费观看 | 久久99精品视频 | 久久综合一区二区三区 | 青青草免费在线 | 黄色一级大片在线免费看产 | 久久不卡日韩美女 | 免费成人小视频 | 日日骚视频 | 夜夜草天天干 | 黄色国产在线看 | 黄色影片网址 | 99亚洲国产精品 | 精品久久久久久久久久久久久久久久久久 | 欧美一级视频免费 | 日韩欧美中文字幕在线视频 | 精品成人 | 欧美色欧美亚洲另类七区 | 日韩精品视频三区 | 日韩一区二区三区精品 | 亚洲va中文字幕 | 黄色网页大全 | 国产噜噜噜噜噜久久久久久久久 | 中文成人无字幕乱码精品 | 日韩欧美一区二区视频 | 欧美视频三区 | 欧美日韩在线精品 | 在线视频不卡一区 | 高清视频一区二区三区 | 国产剧情一区二区 | www.中文字幕 | 久草热8精品视频在线观看 欧美全黄 | 国产99精品在线 | 中文字幕在线免费视频 | 午夜一区二区三区 | 天堂影院一区二区 | 久久伊人一区二区 | 免费av在线 | 久久a国产| 欧美一级免费看 | 国产特一级黄色片 | 欧美性猛xxx| 日韩高清成人 | 日韩欧美一区二区三区四区 | 亚洲精彩视频 | 五月婷婷综合激情网 | 在线观看免费黄色小视频 | 国产福利91精品一区二区三区 | 一区二区三区免费看 | 亚洲人成网站999久久久综合 | 黄色三及毛片 | 国产精品免费看 | 成人在线免费 | 在线精品一区二区 | 欧美女优在线视频 | 91久久久久久 | 日本一级毛片视频 | 国产成人午夜视频 | 日韩www| 精品网站www | 国产精品久久久久久一级毛片 | 日韩欧美一区二区三区久久婷婷 | 99国产精品99久久久久久 | 国产日韩欧美视频 | 欧美日韩视频 | 国产精品99久久久久久动医院 | 精品日韩一区二区 | 亚洲中午字幕在线观看 | 国产一级视频在线观看 | 亚洲国产一区二区三区四区 | 国产三级日本三级美三级 | 九九99 | 中文字幕在线免费视频 | 精品一区二区在线观看 | 在线观看精品自拍私拍 | 中文字幕一区二区三区四区不卡 | 97色在线视频 | 国产一区二区精品在线观看 | 久久草在线视频 | 欧美午夜精品久久久 | 亚洲网站在线免费观看 | 在线国产视频 | 狠狠91 | 黄色大片视频 | 久久精品毛片 | 亚洲精品福利网站 | 久久爱电影| 亚洲一区二区免费视频 | 成人国产精品一级毛片视频 | 日日爱视频 | 一区二区三区四区在线 | 欧美日韩中文字幕在线 | 久久精品久久久久久久久久久久久 | 亚洲在线视频 | 国产一区av在线 | 亚洲成人精品在线观看 | 一级久久久久 | 一区二区三区四区在线 | 中文字幕在线观看www | 欧美视频在线免费 | 国产一区不卡视频 | 影视一区 | 久久在线视频 | 天天看天天做 | 中文字幕视频在线 | 欧美一区二区在线看 | 国产一级毛片国语一级 | 日本在线播放 | 久久av在线 | 天天操天天干天天爽 | 国产精品毛片无码 | 黄色国产大片 | 久久人体视频 | 国产性网 | 亚洲一区二区中文字幕 | 日韩福利在线观看 | 自拍视频网站 | www.99久| 亚洲中字在线 | 日韩日b视频 | 欧美日韩一区二区在线播放 | 日韩3级在线观看 | 欧美在线网站 | 日韩在线资源 | 99久久婷婷国产综合精品电影 | 国产日韩欧美激情 | 999国产一区二区三区四区 | 久久精品国产99 | 国产欧美日本 | 成人免费视频 | 亚洲片在线观看 | av中文字幕在线播放 | 午夜精品久久久久久久久久久久 | 日韩在线一区二区 | 成人在线视频网站 | 9999国产精品欧美久久久久久 | 久久久亚洲精品中文字幕 | 欧美日韩国产一区二区三区不卡 | 日韩精品一区在线 | 成人一区电影 | 一区二区亚洲 | 亚洲欧美在线视频 | 国产专区一区二区三区 | 久久av一区二区三区亚洲 | 久久精品在线 | 久久国产精品视频 | 亚洲一区二区视频 | 久久久久国产一区二区三区 | 国产精品久久久久久久久免费 | 99爱视频 | 成人综合在线观看 | 日本一二三区视频 | 成人在线观 | 国产美女啪啪 | 四虎在线视频 | 伊人久久国产 | 欧美成人午夜视频 | 久久久久久91 | 国产精品99久久 | 中文字幕一区二区三区乱码图片 | 国产高清在线精品 | 亚洲视频1区 | 亚洲h网站| 欧美一区在线视频 | av午夜电影| 国产乱码精品一区二区三区忘忧草 | 国产精品乱码人人做人人爱 | 成人av网站在线观看 | 精品久久99 | 一级网站在线观看 | 看欧美黄色录像 | 国产亚洲一区二区精品 | 久久久精品网站 | 午夜在线 | 亚洲一区二区在线播放 | 色视频在线播放 | 999在线观看精品免费不卡网站 | 欧美一级特黄aaaaaaa色戒 | 午夜播影院 | 美女精品视频在线 | 美女福利网站 | 日本黄色大片免费观看 | 色天天久久 | 黄色国产一级视频 | 国产精品一区二区久久久 | 亚洲电影免费 | 欧美日韩欧美日韩 | 精品三级在线观看 | 91av免费| 一区二区不卡 | 日韩精品专区 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 国产日韩精品一区 | 久久欧美精品一区 | 中国大陆高清aⅴ毛片 | 欧美激情一区二区三区 | 亚洲精品久久久 | 精品国产髙清在线看国产毛片 | 亚洲国产精品99久久久久久久久 | 一区二区三区四区在线播放 | 亚洲精品久久久久久久久久久久久 | 一级做a爰片毛片 | 黄色国产大片 | 国产一区 | 99热这里有精品 | 狠狠狠色丁香婷婷综合久久五月 | 国产精品久久久久久久久久久久久久 | 中文字幕一区二区三区乱码图片 | 久久精品久久久 | 免费不卡视频 | 欧美二区视频 | 欧美八区 | av网站免费看 | 伊人狠狠干| 日韩素人一区二区三区 | 欧美白人做受xxxx视频 | 国产区91| 国产精品久久久久久久久久久久久 | 久热中文在线 | 亚洲在线视频 | 国产精品日韩一区二区 | 涩涩片影院 | 一级毛片免费完整视频 | 成人午夜毛片 | www免费网站在线观看 | 国产一区二区三区视频 | 亚洲一区二区三区在线播放 | 国产超碰人人模人人爽人人添 | 日韩专区一区二区三区 | 久久精品欧美 | 中文 日韩 欧美 | 精品久久久久久久久久久久久久久久久久久 | 成人亚洲| 成人片免费看 | 欧美一区二区在线免费观看 | 婷婷激情综合 | 中国大陆高清aⅴ毛片 | 欧美精品一区二区视频 | 国产精品久久久久久影院8一贰佰 | 色婷婷综合久久久中文字幕 | 久草视频在线观 | 久久com| 狠狠躁夜夜躁人人爽天天高潮 | 亚洲三区电影 | 成人国产精品一级毛片视频 | 国产精品视频一区二区三区 | 色综合成人 | 99re久久 | 黄色a三级 | 日韩一级大片 | 日韩视频在线观看视频 | 日韩成人小视频 | 欧美成人午夜视频 | 国产成人免费视频网站高清观看视频 | 成人网电影 | 久久久精品国产 | 成人国产综合 | 久久亚洲天堂 | 亚洲一区二区三区免费 | 亚洲午夜在线 | 欧美久久成人 | 久久久久久久99精品免费观看 | 91亚洲国产成人久久精品网站 | 中文字幕亚洲欧美日韩在线不卡 | 久久免费福利视频 | 国产精品伦理 | 91视频在线 | 中文字幕在线观看亚洲 | 精品国产视频 | 国产一区二区在线免费 | 国产精品成人观看视频国产奇米 | 日本成人午夜影院 | 亚洲精品二区三区 | 国产aⅴ一区二区 | 中文字幕在线免费看 | 日韩电影中文字幕 | 伊人网一区 | 91福利视频导航 | 亚洲国产精品免费 | 国产羞羞视频在线观看 | 欧美日韩国产一区二区三区 | 日韩欧美一区二区三区视频 | 欧美最猛性xxxxx亚洲精品 | 久久精品国产亚洲一区二区三区 | 成人午夜免费网站 | 亚洲最新中文字幕 | 一区二区免费视频 | 精品国产乱码久久久久久密桃99 | 久久精品无码一区二区日韩av | 岛国av一区 | 午夜免费观看视频 | 日韩一区二区视频 |