114培訓網(wǎng)歡迎您來到游戲設計交流中心!

400-850-8622

全國統(tǒng)一學習專線 9:00-21:00

如何做跑酷游戲的關卡設計

著作權歸作者所有。
商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
作者:文森
鏈接: 同難度下,不同關卡要素交替舉個栗子(手機碼字,沒圖請見諒),比如你通過RLD這套方法發(fā)現(xiàn),同樣難度為1的時候,有跳躍障礙、左轉、右轉3種操作,那么在你需要給玩家設計1難度時,就可以用這3種交替來進行2. 整體難度變化設計普遍認為,在同一難度下的反復練習,會導致難度降低,從而使人逐漸厭倦。關卡設計的內(nèi)在不是調(diào)節(jié)難度,而使調(diào)節(jié)玩家的體驗感受,難度只是你調(diào)節(jié)感受的手段之一罷了(燈光、場景、音樂、情節(jié),等等等等,不展開,容易拐遠了,哈哈)。好的難度設計,應該是讓玩家在“學習-挑戰(zhàn)-釋放”這個循環(huán)下,不斷向更高難度挑戰(zhàn)!

跑酷游戲如何制作有意思的關卡?

? ? ?看了這個問題,然后去玩了一下這個Big Trouble,的確有點意思。不過這個游戲的設計,我個人猜測,可能沒有你想象中的那么復雜,也許并不需要“畫關卡”。

Big Trouble里面,我大概拆分成以下五種元素:
1.行人。行人被騷擾后會追擊你??拷欢尉嚯x后會撲向你,如果這個時候你沒有換線,就會被撲倒(game over)。這個是游戲累積難度的一個重點。玩到后面看著黑壓壓的一片追著你真的很有成就感,但你被迫換線的頻率也在不斷提升。

2.死亡障礙。玩家碰到了就是死,比如電話亭和下水道

3.“功能障礙”。其實這個命名不是很準確。本來我是想將消防栓、水果攤等等集合成一個類。這些東西大多能降低玩家的速度,類似神廟逃亡的小坎。但是它們往往也可以降低行人的速度,甚至水果攤的香蕉被你撒到地上后會讓身后的敵人摔倒??傊畬儆诳蓚麛骋部蓚旱碾p刃劍式的東東。

4.載具。比如自行車,碰到后玩家就會騎上自行車,獲得加速。這也是雙刃劍,一方面后面的行人將很難追上你,另一方面太快的速度很可能會導致你碰到不想碰到的東西,比如電話亭。

5.金幣


? ? ?目前我大概觀察到這些,不知道后面還有沒有不同的。

那么具體的關卡就是,隨機。。。。。。。你沒看錯,我覺得就是隨機出現(xiàn)這些東西就好。

但是?。ㄈf惡的“但是”)

但是如果你真的完全隨機了,這個游戲的體驗上絕壁就是個坑了,因為你無法保證有可能會出現(xiàn)一排電話亭加一排下水道這種可能,所以你需要讓這些隨機出現(xiàn)的東西,滿足一些限定條件。

這些限定條件可能包括這種(以下是我自己隨便掰的,請根據(jù)自己的需要和思考來決定怎么設計):

出現(xiàn)某個死亡障礙之后10米內(nèi)不能再出現(xiàn)第二個死亡障礙。

解釋:這種類型的限制是避免在隨機出現(xiàn)障礙物中出現(xiàn)“無解”的情況。又或者某兩種元素組合在一起會很詭異,這個時候你希望避免某兩種元素同時出現(xiàn)。反過來,如果你希望某兩種元素同時出現(xiàn),也可以設定“出現(xiàn)A后多少米內(nèi)必定出現(xiàn)B”。(當然更靠譜的做法是把A+B定位一個新的元素X)


? ? ?總之,你希望拆分什么,或者你希望組合什么,都可以按這種思路去做。但是要注意別犯“A2米后一定出現(xiàn)B,B2米后一定出現(xiàn)C,但是A5米內(nèi)不準出現(xiàn)C”這種低級錯誤。

PS.難度控制上,可以將前面提到的幾個元素自行組合,然后將自己能提煉出的有效組合給出難度評級,越困難的組合會隨著玩家跑的距離而出現(xiàn)的頻率越高。


以上純屬個人猜測的做法,自己還從來沒參與做過跑酷類游戲,希望有做過這類游戲的人指正!

Java 編寫貪吃蛇游戲的大體思路是什么?

樓主沒有看到蛇移動的本質(zhì),蛇雖然是分成很多塊,但他們還是一個整體,每一塊的移動都和上一塊有關,所以不需要對每一塊都進行判斷。x0dx0a原理:x0dx0a把蛇身體的每一塊看成一個對象(對象存儲該塊的坐標和相關信息),作為節(jié)點存儲在線性鏈表中,再設置一個變量標志蛇的方向(通過按鍵可以改變)。一般人都是讓每一個節(jié)點等于他指向的下一個節(jié)點,并讓頭節(jié)點改變位置來實現(xiàn)轉彎和移動,這個算法復雜度太高(O(n)),實際上只要做兩步操作,插入一個頭節(jié)點,刪除一個尾節(jié)點就可以了,新插入的頭節(jié)點位置根據(jù)蛇當前的方向決定 用一個數(shù)組將蛇頭的行徑記錄下來,然后第二段的下一個方格設置為蛇頭走過的方格,這樣子蛇走過的路徑都是前一段走過的,*將跟著蛇頭走了,比如x0dx0a蛇身的路徑x0dx0a for(int i=-1;i>0;i--){x0dx0arows[i]=rows[i-1];//依次將蛇前面一段走過行的路段賦值給蛇的下一段x0dx0acols[i]=cols[i-1];//依次將蛇前面一段走過列的路段賦值給蛇的下一段x0dx0a}x0dx0afor(int i=1;i

求解答以下的java源代碼,詳細點,說明這個程序的設計思路,還有比如運用了多線程的話運用了多線程的什么

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.Timer;
public class PinBall
{
private final int TABLE_WIDTH = 300;//桌面寬度
private final int TABLE_HEIGHT = 400;//桌面高度
private final int RACKET_Y = 340;//球拍的垂直位置
private final int RACKET_HEIGHT = 20;//球拍高度
private final int RACKET_WIDTH = 60;//球拍寬度
private final int BALL_SIZE = 16;//球的大小
private Frame f = new Frame("彈球游戲");//實例化一個窗口
Random rand = new Random();//實例化一個隨機數(shù)生成器
private int ySpeed = 10;//小球的縱向運動數(shù)度、
private double xyRate = rand.() - 0.5;//返回一個-0.5到0.5之間的比率用控制小球運動方向
private int xSpeed = (int)(ySpeed*xyRate*2);//這個橫向速度在-10到10之間,產(chǎn)生左右擺動運動效果
private int ballX = rand.nextInt(200)+20;//小球開始的橫坐標位置,200表示產(chǎn)生0到100之間的隨機數(shù)
private int ballY = rand.nextInt(10)+20;//小球開始的縱坐標位置
private int racketX = rand.nextInt(200);//球拍開始時的橫坐標位置
private MyCanvas tableArea = new MyCanvas();//實力化一個畫布工具,集成Canvas類
private String shape = "";//保存需要繪制圖形的字符串屬性
Timer timer;//聲明一個時間變量
private boolean isLose = false;//表示游戲是否結束
public void init()
{
tableArea.(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));//定義畫布大小
f.add(tableArea);//添加畫布到窗口
= new ()//實例化一個鍵盤監(jiān)聽事件適配器
{
public void (KeyEvent ke)//重寫適配器里面的按下某鍵盤方法
{
if(ke.()==KeyEvent.VK_LEFT)//按下鍵盤左鍵時
{
if(racketX > 0)//球拍左邊框不能出畫布的左邊框
racketX -=10;//按一左鍵次向左移動10個像素
}
if(ke.()==KeyEvent.VK_RIGHT)//按下鍵盤右鍵時
{
if(racketX < TABLE_WIDTH - RACKET_WIDTH)//球拍右邊框不能出畫布的右邊框
racketX +=10;//按一次右鍵移動向右移動10個像素
}
}
};
f.();//給窗口添加鍵盤監(jiān)聽器
tableArea.();//給畫布添加鍵盤監(jiān)聽器
= new ()//這里是實例化了一個監(jiān)聽接口,這個接口里面只有一個方法
{
public void ( evt)//重寫這個接口里面的方法,判斷小球的位置
{
if(ballX<=0 || ballX>=TABLE_WIDTH-BALL_SIZE)//保證小球橫向上在畫布之內(nèi)運動
{
xSpeed = -xSpeed;//觸發(fā)反方向運動
}
if(ballY>=RACKET_Y-BALL_SIZE&&(ballX<racketX||ballX>racketX+RACKET_WIDTH))//出了球拍的可擊打范圍
{
timer.stop();//停止對監(jiān)聽器的觸發(fā)
isLose=true;//將標志isLose變量置為true
tableArea.repaint();//調(diào)用畫布的重繪方法
}
else if(ballY<=0||(ballY>=RACKET_Y-BALL_SIZE&&ballY>racketX&&ballX<=racketX+RACKET_WIDTH))//小球在球拍之內(nèi),而其到達球拍的高度
{
ySpeed=-ySpeed;//上下方向改變,小球反彈
}
ballY+=ySpeed;//小球的坐標在縱向上增加
ballX+=xSpeed;//小球的坐標在橫向上的增加
tableArea.repaint();//調(diào)用畫布的重繪方法3
}
};
timer = new Timer(100,);//每隔0.1秒運行一次監(jiān)聽器
timer.start();//計時器開始運行
f.(new ());//關閉窗口事件
f.pack();//設置窗口*大小
f.(true);//顯示窗口
}
class extends //關閉窗口的類
{
public void ( e)
{
System.exit(0);
}
}
public static void main(String[] args)//程序入口
{
new PinBall().init();//調(diào)用PinBall類里面的init()方法
}
class MyCanvas extends Canvas//建一個集成Canvas類的類
{
public void paint(Graphics g)//重寫父類的繪圖方法
{
if(isLose)//如果isLose為真,則在畫布里打印“游戲已結束”
{
g.setColor(new Color(255,0,0));//當前顏色
g.setFont(new Font("黑體",Font.BOLD,30));//字體名稱,樣式,大小
g.("游戲已結束!",50,200);//按坐標繪制文字圖形
}
else//負責
{
g.setColor(new Color(240,240,80));//當前顏色
g.fillOval(ballX,ballY,BALL_SIZE,BALL_SIZE);//填充顏色,根據(jù)坐標和長寬填充圓形
g.setColor(new Color(80,80,200));//當前顏色
g.fillRect(racketX,RACKET_Y,RACKET_WIDTH,RACKET_HEIGHT);//填充顏色,根據(jù)坐標和長寬填充矩形
}
}
}
}

scratch怎么做跑酷游戲

Scratch是一款免費的編程工具,它提供了很多有趣和富有挑戰(zhàn)的項目和游戲開發(fā)任務。跑酷游戲是一種有趣和富有挑戰(zhàn)的游戲類型,它允許玩家通過克服障礙來獲得分數(shù),并盡可能遠地跑。

我們可以使用Scratch來創(chuàng)建跑酷游戲,以下是步驟:

1. 創(chuàng)建項目: 打開Scratch 2.0或Scratch 3.0, 選擇 "新建項目"。

2. 設計場景: 我們需要創(chuàng)建一個適合跑酷游戲的場景,例如一條街道、一個森林或沙漠。然后我們需要向場景中添加一些跑酷障礙物。

3. 添加角色: 我們需要添加一個跑步的角色,例如一個忍者或是一個奔跑的人。然后為他加上動作腳本。

4. 添加音效:學者個電腦以及計算機的一些深度知識在此沒必要完全展現(xiàn)。我們可以添加跑步音、點擊聲、障礙物攻擊聲等各種音效來增強游戲的真實性。

5. 添加障礙:這是一個非常重要的步驟,我們需要為跑步的角色添加多個障礙物。例如:樹、河流、洞穴等等。

6. 添加分數(shù):當角色跑過障礙物時,我們需要給玩家一些分數(shù),所以需要添加積分腳本。

7. 添加時間限制:為了使游戲更加流暢并增加難度,我們可以設置一個時間限制,如果角色沒有在時間內(nèi)跑出屏幕,則游戲結束。

通過以上步驟,我們就可以創(chuàng)建一個簡單但有趣的Scratch跑酷游戲。當然,想要創(chuàng)建一個更加高級和有趣的游戲需要我們更加深入地學習Scratch的操作方法及代碼語言的應用,全新的挑戰(zhàn)等著開發(fā)者去搶先抵達!

做一個安卓的,類似跑酷的游戲需要用到什么技術,,還有就是做一個類似超級瑪麗的安卓游戲,要用到的技術

一般來說,安卓用的程序可以用JAVA來編譯;

你可以用?Eclipse 作開發(fā);

ECLIPSE是開源的;

有手機開發(fā)插件;

Eclipse

Eclipse 3.2, 3.3 (Europa)

Android Tools plugin (optional)

Other or IDEs

JDK 5 or JDK 6 (JRE alone is not )

Not with Gnu Compiler for Java (gcj)

Apache Ant 1.6.5 or later for Linux and Mac, 1.7 or later for Windows


下載后,

請用電腦管家查一下軟件是否綁定木馬;

就可以開發(fā)了;

騰訊電腦管家企業(yè)平臺: 求Java課程設計—小游戲(含源代碼)

//hi./srxboys/item/

Tank——坦克大戰(zhàn)(簡潔版)源代碼-------(此文檔是自己在韓順平教程總結而來)
*功能:1.防止敵人的坦克重疊運動

*(決定把判斷是否碰撞的函數(shù)寫到EnemyTank類)

*2.可以分關

*2.1(做一個開始的Panel,它是一個空的)

*2.2開始字體閃爍

*3.可以在玩游戲的時候,暫停和繼續(xù)

*3.1當用戶點擊暫停時,子彈的速度和坦克速度設為0,并讓坦克的方向

*不要發(fā)生變化。

*4.可以記錄玩家的成績

*4.1用文件流的方式(小游戲)[大游戲是用的數(shù)據(jù)庫<cs,bs>結構,三國]

*4.2單寫一個記錄類,完成對玩家的記錄

*4.3先完成保存共擊毀了多少輛敵人坦克的功能

*4.4存盤退出游戲,可以記錄當時的敵人的坦克坐標,并可以恢復

*5.java如何操作聲音文件

*/
② JAVA課程設計,求個能用eclipse實現(xiàn)小游戲或小程序的源代碼。感激不盡

你自己來去下自載吧,這里面都有 //oschina/project/java

③ 用JAVA編寫一個小游戲

前天寫的猜數(shù)字游戲,yongi控制猜測次數(shù),有詳細解析,用黑窗口可以直接運行,

我試驗過了,沒問題
import javax.swing.Icon;
import javax.swing.;
public class {
/**
* @param args
*/
public static void main(String[] args) {
Icon icon = null;
boolean bl = false;
int put = 0;
int c = (int) (((Math.random())*100)+1); //獲取一個1-100的隨機數(shù)
System.out.println("你獲取的隨機數(shù)是:"+c); //打印你的隨機數(shù)字

String str1 = (String) .(null,"請輸入你的猜測數(shù)字(1-100): ","猜數(shù)字游戲",.PLAIN_MESSAGE,icon,null,"在這輸入"); //*次輸入你的猜測數(shù)字

if(str1==null){
.(null, "你已經(jīng)取消了本次游戲"); //如果你點取消那么本次游戲結束
}else{
bl = num(str1); //判斷是輸入的是不是數(shù)字或者是整數(shù)
if(true==bl){ //如果是數(shù)字的話進入與隨機數(shù)比較的程序
System.out.println("你輸入的數(shù)字是:"+str1); //打印你輸入的數(shù)字
put = Integer.valueOf(str1);

for(int i = 4;i > 0;i--){ //i是你可以猜測的次數(shù)
if(put==c){
.(null, "恭喜你猜對了,正確答案是:"+c+"。"); //如果你猜對了就直接結束循環(huán)
break;
}else if(put>c){ //如果輸大了就讓你再次從新輸入
str1 = (String) .(null,"你的輸入過大。你還有"+i+"次機會,請重新輸入: ","猜數(shù)字游戲",.PLAIN_MESSAGE,icon,null,"在這輸入");
if(str1==null){
.(null, "你已經(jīng)取消了本次輸入");
break;
}else{
bl =num(str1);
if(true==bl){
put = Integer.valueOf(str1);
}else{
.(null, "你的輸入不正確,請重新輸入");
}
}
}else if(put<c){ //如果你輸小了也讓你從新輸入
str1 = (String) .(null,"你的輸入過小。你還有"+i+"次機會,請重新輸入: ","猜數(shù)字游戲",.PLAIN_MESSAGE,icon,null,"在這輸入");
if(str1==null){
.(null, "你已經(jīng)取消了本次輸入");
break;
}else{
bl =num(str1);
if(true==bl){
put = Integer.valueOf(str1);
}else{
.(null, "你的輸入不正確,請重新輸入");
}
}
}
}
}else if(bl==false){ //這個 是你*次如果填寫的不是數(shù)字的話也會結束本次游戲
.(null, "請您下次按要求填寫。本次游戲結束");
}
if(true==bl && c!=put){ //如果你i次都沒猜對,那么就直接告訴你這個數(shù)十什么
.(null, "很遺憾你沒能猜對,這個數(shù)字是:"+c+".");
}

}

}

public static boolean num(String value){ //一個靜態(tài)方法,判斷你輸入的是不是數(shù)字
try {
Integer.parseInt(value);
return true;
} catch (Exception e) {
return false;
}

}
}
④ 用java制作一個小游戲 教學

static Scanner in =new Scanner(System.in);

public static int aaa(){

int c = 0;
while(true){

try {
if(c>999&&c<10000){
break;
}else{
// System.out.println("請輸入4位整數(shù)");
c= in.nextInt();
if(c>999&&c<10000){
break;
}else{
System.out.println("輸入有誤,請重新輸入4位整數(shù)");
}
}
} catch (Exception e) {
System.out.println("請輸入整數(shù)");
c= in.nextInt();
}
}
//in.close();
return c;
}
public static void cai(){
//Scanner sa =new Scanner(System.in);
int haoma=(int)(Math.random()*10000);

if(haoma<999)
{
haoma = Integer.parseInt(String.valueOf(haoma)+"0");
}
System.out.println(haoma);
System.out.println("請輸入一位4位整數(shù)");
int aa = 0;
while(true){
aa= aaa();
String pd=String.valueOf(aa);
if(pd.length()!=4){
aa = aaa();
}else{
break;
}
}
while(true){
if(aa==haoma){
System.out.println("你猜對了,可以去買彩票了");
}else{
System.out.println("抱歉 , 你猜錯了");
}
System.out.println("是否繼續(xù)1繼續(xù) 其他結束");
try {
int ss = in.nextInt();
if(ss==1){
cai();
}else{
break;
}
} catch (Exception e) {
in.close();
break;
}
}
}
public static void main(String[] args) {
System.out.println("歡迎來到猜號小游戲");
cai();
System.out.println("over");
}

⑤ 想做一個java小游戲 誰能給幾個創(chuàng)意啊 注意 是創(chuàng)意?。。。?! 不是已有的有創(chuàng)意的小游戲

比如有東西扔過來,選擇吃掉或者躲開,考反應吧。

⑥ 急求java課程設計,內(nèi)容可以是小游戲的,如(迷宮,計算器,停車場之戀的),要能運行,謝謝

俄羅斯方塊,貪吃蛇。推箱子。

⑦ 求JAVA期末課程設計,要那種開發(fā)的小項目軟件。可以是像記事本那種,也可以是小游戲那種。

網(wǎng)上搜不到的一般是不可共享的資源,建議去圖書館找本專門針對課程設計的書,里面的資料很豐富,你可以照著做一下,并作功能上適當?shù)脑鰷p,這樣網(wǎng)上就很難找到了

用JAVA設計游戲:貪吃蛇游戲

用MVC方式實現(xiàn)的貪吃蛇游戲,共有4個類。運行運行即可。主要是觀察者模式的使用,我已經(jīng)添加了很多注釋了。
1、
/*
* 程序名稱:貪食蛇
* 原作者:BigF
* 修改者:algo
* 說明:我以前也用C寫過這個程序,現(xiàn)在看到BigF用Java寫的這個,發(fā)現(xiàn)雖然作者自稱是Java的初學者,
* 但是明顯編寫程序的素養(yǎng)不錯,程序結構寫得很清晰,有些細微得地方也寫得很簡潔,一時興起之
* 下,我認真解讀了這個程序,發(fā)現(xiàn)數(shù)據(jù)和表現(xiàn)分開得很好,而我近日正在學習MVC設計模式,
* 因此嘗試把程序得結構改了一下,用MVC模式來實現(xiàn),對源程序得改動不多。
* 我同時也為程序增加了一些自己理解得注釋,希望對大家閱讀有幫助。
*/
package mvcTest;
/**
* @author WangYu
* @version 1.0
* :
* </pre>
* Create on :Date :2005-6-13 Time:15:57:16
* :
* History:
*/
public class {
public static void main(String[] args) {
model = new (20,30);
control = new (model);
SnakeView view = new SnakeView(model,control);
//添加一個觀察者,讓view成為model的觀察者
model.(view);

(new Thread(model)).start();
}
}
-------------------------------------------------------------
2、
package mvcTest;
//.java
import java.awt.event.KeyEvent;
import java.awt.event.;
/**
* MVC中的Controler,負責接收用戶的操作,并把用戶操作通知Model
*/
public class {
model;
public ( model){
this.model = model;
}
public void (KeyEvent e) {
int keyCode = e.();
if (model.running){ // 運行狀態(tài)下,處理的按鍵
switch (keyCode) {
case KeyEvent.VK_UP:
model.(.UP);
break;
case KeyEvent.VK_DOWN:
model.(.DOWN);
break;
case KeyEvent.VK_LEFT:
model.(.LEFT);
break;
case KeyEvent.VK_RIGHT:
model.(.RIGHT);
break;
case KeyEvent.VK_ADD:
case KeyEvent.VK_PAGE_UP:
model.speedUp();
break;
case KeyEvent.VK_SUBTRACT:
case KeyEvent.VK_PAGE_DOWN:
model.speedDown();
break;
case KeyEvent.VK_SPACE:
case KeyEvent.VK_P:
model.();
break;
default:
}
}
// 任何情況下處理的按鍵,按鍵導致重新啟動游戲
if (keyCode == KeyEvent.VK_R ||
keyCode == KeyEvent.VK_S ||
keyCode == KeyEvent.VK_ENTER) {
model.reset();
}
}
public void (KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
}
-------------------------------------------------------------
3、
/*
*
*/
package mvcTest;
/**
* 游戲的Model類,負責所有游戲相關數(shù)據(jù)及運行
* @author WangYu
* @version 1.0
* :
* </pre>
* Create on :Date :2005-6-13 Time:15:58:33
* :
* History:
*/
//.java
import javax.swing.*;
import java.util.Arrays;
import java.util.;
import java.util.;
import java.util.Random;
/**
* 游戲的Model類,負責所有游戲相關數(shù)據(jù)及運行
*/
class extends Runnable {
boolean[][] matrix; // 指示位置上有沒蛇體或食物
nodeArray = new (); // 蛇體
Node food;
int maxX;
int maxY;
int direction = 2; // 蛇運行的方向
boolean running = false; // 運行狀態(tài)
int = 200; // 時間間隔,毫秒
double = 0.75; // 每次得速度變化率
boolean paused = false; // 暫停標志
int score = 0; // 得分
int countMove = 0; // 吃到食物前移動的次數(shù)
// UP and DOWN should be even
// RIGHT and LEFT should be odd
public static final int UP = 2;
public static final int DOWN = 4;
public static final int LEFT = 1;
public static final int RIGHT = 3;
public ( int maxX, int maxY) {
this.maxX = maxX;
this.maxY = maxY;
reset();
}
public void reset(){
direction = .UP; // 蛇運行的方向
= 200; // 時間間隔,毫秒
paused = false; // 暫停標志
score = 0; // 得分
countMove = 0; // 吃到食物前移動的次數(shù)
// initial matirx, 全部清0
matrix = new boolean[maxX][];
for (int i = 0; i < maxX; ++i) {
matrix[i] = new boolean[maxY];
Arrays.fill(matrix[i], false);
}
// initial the snake
// 初始化蛇體,如果橫向位置超過20個,長度為10,否則為橫向位置的一半
int = maxX > 20 ? 10 : maxX / 2;
nodeArray.clear();
for (int i = 0; i < ; ++i) {
int x = maxX / 2 + i;//maxX被初始化為20
int y = maxY / 2; //maxY被初始化為30
//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]
//默認的運行方向向上,所以游戲一開始nodeArray就變?yōu)椋?br> // [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]
nodeArray.addLast(new Node(x, y));
matrix[x][y] = true;
}
// 創(chuàng)建食物
food = ();
matrix[food.x][food.y] = true;
}
public void (int ) {
// 改變的方向不能與原來方向同向或反向
if (direction % 2 != % 2) {
direction = ;
}
}
/**
* 運行一次
* @return
*/
public boolean moveOn() {
Node n = (Node) nodeArray.getFirst();
int x = n.x;
int y = n.y;
// 根據(jù)方向增減坐標值
switch (direction) {
case UP:
y--;
break;
case DOWN:
y++;
break;
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
}
// 如果新坐標落在有效范圍內(nèi),則進行處理
if ((0 <= x && x < maxX) && (0 <= y && y < maxY)) {

if (matrix[x][y]) { // 如果新坐標的點上有東西(蛇體或者食物)
if (x == food.x && y == food.y) { // 吃到食物,成功
nodeArray.addFirst(food); // 從蛇頭贈長
// 分數(shù)規(guī)則,與移動改變方向的次數(shù)和速度兩個元素有關
int scoreGet = (10000 - 200 * countMove) / ;
score += scoreGet > 0 ? scoreGet : 10;
countMove = 0;
food = (); // 創(chuàng)建新的食物
matrix[food.x][food.y] = true; // 設置食物所在位置
return true;
} else // 吃到蛇體自身,失敗
return false;

} else { // 如果新坐標的點上沒有東西(蛇體),移動蛇體
nodeArray.addFirst(new Node(x, y));
matrix[x][y] = true;
n = (Node) nodeArray.();
matrix[n.x][n.y] = false;
countMove++;
return true;
}
}
return false; // 觸到邊線,失敗
}
public void run() {
running = true;
while (running) {
try {
Thread.sleep();
} catch (Exception e) {
break;
}
if (!paused) {
if (moveOn()) {
(); // Model通知View數(shù)據(jù)已經(jīng)更新
();
} else {
.(null,
"you failed",
"Game Over",
._MESSAGE);
break;
}
}
}
running = false;
}
private Node () {
int x = 0;
int y = 0;
// 隨機獲取一個有效區(qū)域內(nèi)的與蛇體和食物不重疊的位置
do {
Random r = new Random();
x = r.nextInt(maxX);
y = r.nextInt(maxY);
} while (matrix[x][y]);
return new Node(x, y);
}
public void speedUp() {
*= ;
}
public void speedDown() {
/= ;
}
public void () {
paused = !paused;
}
public String toString() {
String result = "";
for (int i = 0; i < nodeArray.size(); ++i) {
Node n = (Node) nodeArray.get(i);
result += "[" + n.x + "," + n.y + "]";
}
return result;
}
}
class Node {
int x;
int y;
Node(int x, int y) {
this.x = x;
this.y = y;
}
}
------------------------------------------------------------
4、
package mvcTest;
//SnakeView.java
import javax.swing.*;
import java.awt.*;
import java.util.Iterator;
import java.util.;
import java.util.;
import java.util.Observer;
/**
* MVC模式中得Viewer,只負責對數(shù)據(jù)的顯示,而不用理會游戲的控制邏輯
*/
public class SnakeView Observer {
control = null;
model = null;
JFrame mainFrame;
Canvas ;
JLabel ;
public static final int = 200;
public static final int = 300;
public static final int nodeWidth = 10;
public static final int = 10;
public SnakeView( model, control) {
this.model = model;
this.control = control;
mainFrame = new JFrame("");
Container cp = mainFrame.();
// 創(chuàng)建頂部的分數(shù)顯示
= new JLabel("Score:");
cp.add(, .NORTH);
// 創(chuàng)建中間的游戲顯示區(qū)域
= new Canvas();
.setSize( + 1, + 1);
.(control);
cp.add(, .CENTER);
// 創(chuàng)建底下的幫助欄
JPanel = new JPanel();
.setLayout(new ());
JLabel labelHelp;
labelHelp = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);
.add(labelHelp, .NORTH);
labelHelp = new JLabel("ENTER or R or S for start;", JLabel.CENTER);
.add(labelHelp, .CENTER);
labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER);
.add(labelHelp, .SOUTH);
cp.add(, .SOUTH);
mainFrame.(control);
mainFrame.pack();
mainFrame.(false);
mainFrame.(JFrame.EXIT_ON_CLOSE);
mainFrame.(true);
}
void repaint() {
Graphics g = .();
//draw
g.setColor(Color.WHITE);
g.fillRect(0, 0, , );
// draw the snake
g.setColor(Color.BLACK);
na = model.nodeArray;
Iterator it = na.iterator();
while (it.hasNext()) {
Node n = (Node) it.next();
drawNode(g, n);
}
// draw the food
g.setColor(Color.RED);
Node n = model.food;
drawNode(g, n);
();
}
private void drawNode(Graphics g, Node n) {
g.fillRect(n.x * nodeWidth,
n.y * ,
nodeWidth - 1,
- 1);
}
public void () {
String s = "Score: " + model.score;
.setText(s);
}
public void update( o, Object arg) {
repaint();
}
}
-------------------------------------------------------------

溫馨提示:為不影響您的學業(yè),來校區(qū)前請先電話咨詢,方便我校安排相關的專業(yè)老師為您解答
相關資料
姓名不能為空
手機號格式錯誤