JAVA程式設計

Download Report

Transcript JAVA程式設計

JAVA程式設計
以[大富翁]為例
V1:認識類別及物件
屬性設定
大富翁主方法(大富翁.java)
class 玩家
{
String 名字;
int 錢 = 2000;
int 位置 = 0;
}
class 大富翁
{
public static void main(String [] args)
{
玩家 P = new 玩家();
P.名字 = "喜羊羊";
P[i].位置 += ((int)(Math.random()*11) + 2);
System.out.println(P.名字 + " 在 " + P.位置);
class 土地
{
String 地名;
}
}
}
v2:利用陣列宣告多個物件
大富翁主方法(大富翁.java)
class 玩家
{
String 名字;
int 錢 = 2000;
int 位置 = 0;
}
class 土地
{
String 地名;
}
class 大富翁
{
public static void main(String [] args)
{
玩家 P [] = new 玩家[4];
for (int i = 0; i < P.length; i++)
{
P[i] = new 玩家();
}
P[0].名字 = "喜羊羊";
P[1].名字 = "美羊羊";
P[2].名字 = "小灰灰";
P[3].名字 = "灰太狼";
for(int i = 0; i < P.length; i++)
{
P[i].位置 += ((int)(Math.random()*11) + 2);
System.out.println(P[i].名字 + " 在 " + P[i].位置);
}
}
}
Homework#1
寫一個程式,讓4個玩家輪流前進10輪
V3:讓4位玩家輪流玩,共玩10輪
新增土地類別及40塊土地
class 玩家
{
String 名字;
int 錢 = 2000;
int 位置 = 0;
}
class 土地
{
String 地名;
}
class 大富翁
{
public static void main(String [] args)
{
String [] 土地名 = {"中華民國", "日本", "韓國", "菲律賓", "馬來西亞",
"越南", "泰國", "印度", "伊拉克", "伊朗",
"沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭",
"德國", "奧地利", "瑞士", "法國", "比利時",
"荷蘭", "英國", "芬蘭", "瑞典", "丹麥",
"希臘", "義大利", "西班牙", "葡萄牙", "埃及",
"摩洛哥", "南非", "加拿大", "美國", "墨西哥",
"宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ;
土地 L [] = new 土地[40];
for (int i = 0; i < L.length; i++)
{ L[i] = new 土地();
L[i].地名 = 土地名[i];
System.out.println(L[i].地名);
}
玩家 P [] = new 玩家[4];
for (int i = 0; i < P.length; i++)
{ P[i] = new 玩家();
}
P[0].名字 = "喜羊羊";
P[1].名字 = "美羊羊";
P[2].名字 = "小灰灰";
P[3].名字 = "灰太狼";
for(int j = 1; j <= 10; j++)
{ for(int i = 0; i < P.length; i++)
{ P[i].位置 += ((int)(Math.random()*11) + 2);
if (P[i].位置 >= 40)
P[i].位置 -= 40;
System.out.println(P[i].名字 + “ 在 ” + L[P[i].位置].地名);
}
}
}
}
Homework #2
將程式中每一個class都各自成立
一個檔案(讓程式減輕),並且編譯
及執行
V4:新增玩家類別中一個方法前進
( ),且經過起點時獲得1000元
教學目標:1.學習如何製作類別中的方法
2.不要再將所有動作完全放在
main()中
類別:土地
class 土地
{
String 地名;
}
類別:玩家
class 玩家
{
String 名字;
int 錢 = 2000;
int 位置 = 0;
void 前進()
{
位置 += ((int)(Math.random()*11) + 2);
if (位置 >= 40)
{
位置 -= 40;
錢 += 1000;
}
return;
}
}
類別:大富翁
class 大富翁
{
public static void main(String [] args)
{
String [] 土地名 = {"中華民國", "日本", "韓國", "菲律賓", "馬來西亞",
"越南", "泰國", "印度", "伊拉克", "伊朗",
"沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭",
"德國", "奧地利", "瑞士", "法國", "比利時",
"荷蘭", "英國", "芬蘭", "瑞典", "丹麥",
"希臘", "義大利", "西班牙", "葡萄牙", "埃及",
"摩洛哥", "南非", "加拿大", "美國", "墨西哥",
"宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ;
土地 L [] = new 土地[40];
for (int i = 0; i < L.length; i++)
{
L[i] = new 土地();
L[i].地名 = 土地名[i];
System.out.println(L[i].地名);
}
玩家 P [] = new 玩家[4];
for (int i = 0; i < P.length; i++)
{
P[i] = new 玩家();
}
P[0].名字 = "喜羊羊";
P[1].名字 = "美羊羊";
P[2].名字 = "小灰灰";
P[3].名字 = "灰太狼";
for(int j = 1; j <= 10; j++)
{
for(int i = 0; i < P.length; i++)
{
P[i].前進();
System.out.println(P[i].名字 + "
在 " + L[(P[i].位置)].地名 + ", 錢
="+P[i].錢 );
}
}
}
}
HW#3


為每一塊地加上屬性過路費,地主,地價
當玩家到一個土地時,如果,土地尚未賣出,
而且錢夠,則可以買地;如果土地已經賣出,
則要付過路費給地主
V5:新增土地類別中一個方法登記
土地所有人()及新增玩家類別中
一個方法付過路費()
教學目標:
1.學習如何在方法中作傳址呼叫
2.學習如何呼叫物件中的屬性 方法
class 玩家
{
String 名字;
int 錢 = 2000;
int 位置 = 0;
void 前進()
{
位置 += ((int)(Math.random()*11) + 2);
if (位置 >= 40)
{
位置 -= 40;
錢 += 1000;
}
return;
}
void 付過路費(土地 路過此地)
{
錢 -= 路過此地.過路費;
路過此地.地主.錢 += 路過此地.過路費;
System.out.println(名字 + " 要付給 " + 路過此地.地名 + " 的地主 " + 路過此地.地主.名字 + " " + 路過
此地.過路費 + " 元 ");
}
}
class 土地
{
String 地名;
int 過路費 = 20;
int 地價 = 500;
玩家 地主;
void 登記土地所有權人(玩家 買地人)
{
if(買地人.錢 >= 地價)
{ //有錢可以買地
買地人.錢 -= 地價;
地主 = 買地人;
System.out.println(買地人.名字 + "買了" + 地名);
}
else
System.out.println(買地人.名字 + "沒有買地");
return;
}
}
class 大富翁
{
public static void main(String [] args)
{
String [] 土地名 = {"中華民國", "日本", "韓國", "菲律賓", "馬來西亞",
"越南", "泰國", "印度", "伊拉克", "伊朗",
"沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭",
"德國", "奧地利", "瑞士", "法國", "比利時",
"荷蘭", "英國", "芬蘭", "瑞典", "丹麥",
"希臘", "義大利", "西班牙", "葡萄牙", "埃及",
"摩洛哥", "南非", "加拿大", "美國", "墨西哥",
"宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ;
土地 L [] = new 土地[40];
for (int i = 0; i < L.length; i++)
{
L[i] = new 土地();
L[i].地名 = 土地名[i];
// System.out.println(L[i].地名 + " 地主是 " + L[i].地主.名字);
}
玩家 P [] = new 玩家[4];
for (int i = 0; i < P.length; i++)
{
P[i] = new 玩家();
}
P[0].名字 = "喜羊羊";
P[1].名字 = "美羊羊";
P[2].名字 = "小灰灰";
P[3].名字 = "灰太狼";
for(int j = 1; j <= 10; j++)
{
System.out.println("第 " + j + " 輪 ");
System.out.println("目前土地狀態");
for (int k = 0; k < L.length; k++)
{
if( L[k].地主 != null)
System.out.println(L[k].地名 + " 地主是 " + L[k].地主.名字);
else
System.out.println(L[k].地名);
}
for(int i = 0; i < P.length; i++)
{
P[i].前進();
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
if(L[P[i].位置].地主 == null)
{ //買地
System.out.println(L[P[i].位置].地名 + "目前尚未售出");
L[P[i].位置].登記土地所有權人(P[i]);
}
else
{ //付過路費
if (L[P[i].位置].地主 != P[i])
{
P[i].付過路費(L[P[i].位置]);
}
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
}
}
}
}
}
HW#4


練習繪製記憶體中各個物件的關係圖
了解新增的方法程式碼
V6:建構子及多載(overloading)
教學目標:
1.學習何謂建構子及其功能
2.學習何謂多載(以建構子為例)
class 玩家
{ String 名字;
int 錢 = 2000;
int 位置 = 0;
玩家(String name)
{ 名字 = name;
}
void 前進()
{ 位置 += ((int)(Math.random()*11) + 2);
if (位置 >= 40)
{ 位置 -= 40;
錢 += 1000;
}
return;
}
void 付過路費(土地 路過此地)
{ 錢 -= 路過此地.過路費;
路過此地.地主.錢 += 路過此地.過路費;
System.out.println(名字 + "要付給 " + 路過此地.地名 + " 的地主 " +路過此地.地主.名字 + " " + 路過
此地.過路費 + " 元");
}
}
class 土地
{ String 地名;
int 過路費 = 20;
int 地價;
玩家 地主;
//建構子及多載
土地(String 地名)
{ this.地名 = 地名;
}
土地(String name, int price)
{ 地名 = name;
地價 = price;
}
void 登記土地所有權人(玩家 買地人)
{ if(買地人.錢 >= 地價)
{ //有錢可以買地
買地人.錢 -= 地價;
地主 = 買地人;
System.out.println(買地人.名字 + "買了" + 地名);
}
else
System.out.println(買地人.名字 + "沒有買地");
return;
}
}
class 大富翁
{
public static void main(String [] args)
{
String [] 土地名 = {"中華民國", "日本", "韓國", "菲律賓", "馬來西亞",
"越南", "泰國", "印度", "伊拉克", "伊朗",
"沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭",
"德國", "奧地利", "瑞士", "法國", "比利時",
"荷蘭", "英國", "芬蘭", "瑞典", "丹麥",
"希臘", "義大利", "西班牙", "葡萄牙", "埃及",
"摩洛哥", "南非", "加拿大", "美國", "墨西哥",
"宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ;
String [] PN = {"喜羊羊", "美羊羊", "小灰灰", "灰太狼"};
土地 L [] = new 土地[40];
for (int i = 0; i < L.length; i++)
{
if(i/2 * 2 == i)
L[i] = new 土地(土地名[i], i*20);
else
L[i] = new 土地(土地名[i]);
// L[i].地名 = 土地名[i];
System.out.println(L[i].地名 + " 地價是 " + L[i].地價);
}
玩家 P [] = new 玩家[4];
for (int i = 0; i < P.length; i++)
{
P[i] = new 玩家(PN[i]);
}
//P[0].名字 = "喜羊羊";
//P[1].名字 = "美羊羊";
//P[2].名字 = "小灰灰";
//P[3].名字 = "灰太狼";
for(int j = 1; j <= 1; j++)
{
System.out.println("第 " + j + " 輪 ");
/*
System.out.println("目前土地狀態");
for (int k = 0; k < L.length; k++)
{
if( L[k].地主 != null)
System.out.println(L[k].地名 + " 地主是 " + L[k].地主.名字);
else
System.out.println(L[k].地名);
}
*/
for(int i = 0; i < P.length; i++)
{
P[i].前進();
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
if(L[P[i].位置].地主 == null)
{ //買地
System.out.println(L[P[i].位置].地名 + "目前尚未售出");
L[P[i].位置].登記土地所有權人(P[i]);
}
else
{ //付過路費
if (L[P[i].位置].地主 != P[i])
{
P[i].付過路費(L[P[i].位置]);
}
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
}
}
}
}
}
V7:繼承
1.
2.
學習繼承概論
學習繼承語法
//完全沒有更動,保持原狀
class 土地
{ String 地名;
int 過路費 = 20;
int 地價;
玩家 地主;
土地(String 地名)
{ this.地名 = 地名;
}
土地(String name, int price)
{ 地名 = name;
地價 = price;
}
void 登記土地所有權人(玩家 買地人)
{ if(買地人.錢 >= 地價)
{ //有錢可以買地
買地人.錢 -= 地價;
地主 = 買地人;
System.out.println(買地人.名字 + "買了" + 地名);
}
else
System.out.println(買地人.名字 + "沒有買地");
return;
}
}
//土地2繼承土地, 承接所有原來在土地類別中所有的屬性及方法
class 土地2 extends 土地
{
int [] 過路費 = new int[6];
int 房子數 = 0;
土地2(String 地名)
{
super(地名);
for(int i = 0; i < 過路費.length; i++)
過路費[i] = 20 + i*10;
}
土地2(String name, int price)
{
super(name);
地價 = price;
for(int i = 0; i < 過路費.length; i++)
過路費[i] = 20 + i*10;
}
}
//如同課堂上所說, 如果當初付過費的方法是放在類別土地中, 則玩家就不會因為有新的土地2類別,而要
更動
class 玩家
{ String 名字;
int 錢 = 2000;
int 位置 = 0;
玩家(String name)
{ 名字 = name;
}
void 前進()
{ 位置 += ((int)(Math.random()*11) + 2);
if (位置 >= 40)
{ 位置 -= 40;
錢 += 1000;
}
return;
}
void 付過路費(土地2 路過此地)
{
錢 -= 路過此地.過路費[路過此地.房子數];
路過此地.地主.錢 += 路過此地.過路費[路過此地.房子數];
System.out.println(名字 + "要付給 " + 路過此地.地名 + " 的地主 " +路過此地.地主.名字 + " " + 路過
此地.過路費[路過此地.房子數] + " 元");
}
}
//在主程式中,修正原來宣告是舊的土地類別改為宣告新的土地2類別
class 大富翁
{
public static void main(String [] args)
{
String [] 土地名 = {"中華民國", "日本", "韓國", "菲律賓", "馬來西亞",
"越南", "泰國", "印度", "伊拉克", "伊朗",
"沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭",
"德國", "奧地利", "瑞士", "法國", "比利時",
"荷蘭", "英國", "芬蘭", "瑞典", "丹麥",
"希臘", "義大利", "西班牙", "葡萄牙", "埃及",
"摩洛哥", "南非", "加拿大", "美國", "墨西哥",
"宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ;
String [] PN = {"喜羊羊", "美羊羊", "小灰灰", "灰太狼"};
土地2 L [] = new 土地2[40];
for (int i = 0; i < L.length; i++)
{
if(i/2 * 2 == i)
L[i] = new 土地2(土地名[i], i*20);
else
L[i] = new 土地2(土地名[i]);
// L[i].地名 = 土地名[i];
System.out.println(L[i].地名 + " 地價是 " + L[i].地價);
}
玩家 P [] = new 玩家[4];
for (int i = 0; i < P.length; i++)
{
P[i] = new 玩家(PN[i]);
}
//P[0].名字 = "喜羊羊";
//P[1].名字 = "美羊羊";
//P[2].名字 = "小灰灰";
//P[3].名字 = "灰太狼";
for(int j = 1; j <= 5; j++)
{
System.out.println("第 " + j + " 輪 ");
/*
System.out.println("目前土地狀態");
for (int k = 0; k < L.length; k++)
{
if( L[k].地主 != null)
System.out.println(L[k].地名 + " 地主是 " + L[k].地主.名字);
else
System.out.println(L[k].地名);
}
*/
for(int i = 0; i < P.length; i++)
{
P[i].前進();
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
if(L[P[i].位置].地主 == null)
{ //買地
System.out.println(L[P[i].位置].地名 + "目前尚未售出");
L[P[i].位置].登記土地所有權人(P[i]);
}
else
{ //付過路費
if (L[P[i].位置].地主 != P[i])
{
P[i].付過路費(L[P[i].位置]);
}
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
}
}
}
}
}
V8:抽象類別
-以玩家可以有不同個性為
例
1.
2.
3.
學習抽象類別
學習抽象方法
學習異質集合
//土地類別沒有更動
class 土地
{ String 地名;
int 過路費 = 20;
int 地價;
玩家 地主;
土地(String 地名)
{ this.地名 = 地名;
}
土地(String name, int price)
{ 地名 = name;
地價 = price;
}
void 登記土地所有權人(玩家 買地人)
{ if(買地人.錢 >= 地價)
{ //有錢可以買地
買地人.錢 -= 地價;
地主 = 買地人;
System.out.println(買地人.名字 + "買了" + 地名);
}
else
System.out.println(買地人.名字 + "沒有買地");
return;
}
}
//土地2多加一個[登記土地所有權人]的方法,只是為了連結到父類別的[登記土地所有權
人]方法
class 土地2 extends 土地
{ int [] 過路費 = new int[6];
int 房子數 = 0;
土地2(String 地名)
{ super(地名);
for(int i = 0; i < 過路費.length; i++)
過路費[i] = 20 + i*10;
}
土地2(String name, int price)
{ super(name);
地價 = price;
for(int i = 0; i < 過路費.length; i++)
過路費[i] = 20 + i*10;
}
void 登記土地所有權人(玩家 買地人)
{ super.登記土地所有權人(買地人);
}
}
//將原來的類別改成抽象類別,並加上抽象方法[購地策略]
abstract class 玩家
{ String 名字;
int 錢 = 2000;
int 位置 = 0;
玩家(String name)
{ 名字 = name;
}
void 前進()
{ 位置 += ((int)(Math.random()*11) + 2);
if (位置 >= 40)
{ 位置 -= 40;
錢 += 1000;
}
return;
}
void 付過路費(土地2 路過此地)
{ 錢 -= 路過此地.過路費[路過此地.房子數];
路過此地.地主.錢 += 路過此地.過路費[路過此地.房子數];
System.out.println(名字 + "要付給 " + 路過此地.地名 + " 的地主 " +路過此地.地主.名字 + " " + 路過
此地.過路費[路過此地.房子數] + " 元");
}
abstract void 購地策略(土地2 l);
}
//建立兩個子類別,並實作父類別的抽象方法[購地策略]
class 我就是要買 extends 玩家
{ 我就是要買(String name)
{
super(name);
}
void 購地策略(土地2 l)
{ l.登記土地所有權人(this);
}
}
class 打死不買 extends 玩家
{ 打死不買(String name)
{
super(name);
}
void 購地策略(土地2 l)
{ System.out.println(名字 + "是打死不買,所以不買就是不買");
}
}
//在主程式的部份,利用異質陣列,只需在配置空間時,宣告為[打死不買]和[我就是要
買]的不同類別物件
class 大富翁
{ public static void main(String [] args)
{String [] 土地名 = {"中華民國", "日本", "韓國", "菲律賓", "馬來西亞",
"越南", "泰國", "印度", "伊拉克", "伊朗",
"沙烏地阿拉伯", "土耳其", "以色列", "蘇俄", "波蘭",
"德國", "奧地利", "瑞士", "法國", "比利時",
"荷蘭", "英國", "芬蘭", "瑞典", "丹麥",
"希臘", "義大利", "西班牙", "葡萄牙", "埃及",
"摩洛哥", "南非", "加拿大", "美國", "墨西哥",
"宏都拉斯", "尼加拉瓜", "古巴", "巴拿馬", "巴西"} ;
String [] PN = {"喜羊羊", "美羊羊", "小灰灰", "灰太狼"};
土地2 L [] = new 土地2[40];
for (int i = 0; i < L.length; i++)
{
if(i/2 * 2 == i)
L[i] = new 土地2(土地名[i], i*20);
else
L[i] = new 土地2(土地名[i]);
// L[i].地名 = 土地名[i];
System.out.println(L[i].地名 + " 地價是 " + L[i].地價);
}
//異質陣列
玩家 P [] = new 玩家[4];
for (int i = 0; i < P.length-2; i++)
{
P[i] = new 打死不買(PN[i]);
}
for(int i = 2; i < P.length; i++)
{
P[i] = new 我就是要買(PN[i]);
}
//P[0].名字 = "喜羊羊";
//P[1].名字 = "美羊羊";
//P[2].名字 = "小灰灰";
//P[3].名字 = "灰太狼";
for(int j = 1; j <= 5; j++)
{
System.out.println("第 " + j + " 輪 ");
/*
System.out.println("目前土地狀態");
for (int k = 0; k < L.length; k++)
{
if( L[k].地主 != null)
System.out.println(L[k].地名 + " 地主是 " + L[k].地主.名字);
else
System.out.println(L[k].地名);
}
*/
for(int i = 0; i < P.length; i++)
{
P[i].前進();
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
if(L[P[i].位置].地主 == null)
{ //買地
P[i].購地策略(L[P[i].位置]);
// System.out.println(L[P[i].位置].地名 + "目前尚未售出");
// L[P[i].位置].登記土地所有權人(P[i]);
}
else
{ //付過路費
if (L[P[i].位置].地主 != P[i])
{
P[i].付過路費(L[P[i].位置]);
}
System.out.println(P[i].名字 + " 在 " + L[(P[i].位置)].地名 + ", 現在有錢" +P[i].錢);
}
}
}
}
}