利用抽象繼承+成員函式指標+樣板可以達到這樣的實作。
2012年3月17日 星期六
2012年2月21日 星期二
強制轉換二維陣列的行列數
有時在寫程式時,陣列會依照不同的演算法需要而改變行列的存取方式。
透過強轉型可以辦到這種要求:
其他維度的轉型方法大同小異。
透過強轉型可以辦到這種要求:
int main(int argc,char *argv[])
{
int row = 4;
int arr[5][5] = {{11,12,13,14,15},
{21,22,23,24,25},
{31,32,33,34,35},
{41,42,43,44,45},
{51,52,53,54,55}};
cout << arr[2][1] << endl;
//存取一個(2,1)的元素
//等效於*(arr + 2*5 + 1) => 32
cout << ((int*)arr)[11] << endl;
//轉換成一個一維的整數陣列
//等效於*(arr + 11) => 32
cout << ((int (*)[row])arr)[2][3] << endl;
//轉換成一個4列的整數陣列
//等效於*(arr + 2*4 + 3) => 32
return 0;
}
其他維度的轉型方法大同小異。
2008年12月15日 星期一
用C語言模擬電路
困難度:★★★
我們在數位邏輯設計之類的課程裡常常會使用到一些數位電路模擬軟體,有時候蠻好奇那些模擬軟體到底是怎麼運作的,所以我們這次的Project將來處理這樣的問題。
程式的功能主要是讀取由使用者提供兩個檔案,其中之一的內容是描述元件和其之間的接線,另一個是儲存輸入腳位的波型;而程式讀入後,會根據接線的狀況和輸入的波型,模擬輸出腳位數值的變化。

剛開始程式會先分析邏輯描述檔案是否有接線上的錯誤。如果沒有錯誤就會進行模擬的階段,根據波形的改變分析邏輯閘輸出的變換。
##CONTINUE##
分析問題之後發現其實如果程式只是處理組合邏輯並不具有挑戰性,組合邏輯只需要把符號轉換成運算式處理就十分的簡單,所以我們的重點將放在時序邏輯和遞迴邏輯(像LATCH)上。
本次Project主要是Stacks and Queues的使用。Queues主要是用在檔案讀入描述式的分析和Functions之間數值串列的傳遞,而Stacks可以對需要處理運算的邏輯閘進行排程。
程式碼再修改一下就能有延遲的作用,如果未來有可能將作為自己在模擬數位電路時能使用的引擎。
Source Code下載(包含說明、模擬檔案等相關資料)
http://sites.google.com/site/hayden0828/blog/Simulator.rar
我們在數位邏輯設計之類的課程裡常常會使用到一些數位電路模擬軟體,有時候蠻好奇那些模擬軟體到底是怎麼運作的,所以我們這次的Project將來處理這樣的問題。
程式的功能主要是讀取由使用者提供兩個檔案,其中之一的內容是描述元件和其之間的接線,另一個是儲存輸入腳位的波型;而程式讀入後,會根據接線的狀況和輸入的波型,模擬輸出腳位數值的變化。

剛開始程式會先分析邏輯描述檔案是否有接線上的錯誤。如果沒有錯誤就會進行模擬的階段,根據波形的改變分析邏輯閘輸出的變換。
##CONTINUE##
分析問題之後發現其實如果程式只是處理組合邏輯並不具有挑戰性,組合邏輯只需要把符號轉換成運算式處理就十分的簡單,所以我們的重點將放在時序邏輯和遞迴邏輯(像LATCH)上。
本次Project主要是Stacks and Queues的使用。Queues主要是用在檔案讀入描述式的分析和Functions之間數值串列的傳遞,而Stacks可以對需要處理運算的邏輯閘進行排程。
程式碼再修改一下就能有延遲的作用,如果未來有可能將作為自己在模擬數位電路時能使用的引擎。
Source Code下載(包含說明、模擬檔案等相關資料)
http://sites.google.com/site/hayden0828/blog/Simulator.rar
2008年10月16日 星期四
適合寫程式使用的字型
2008年6月10日 星期二
RPG遊戲.....真的寫出來了
越來越佩服我自己了.....
幾乎是日以繼夜的寫出來
連名字都想不出來了,應該沒有什麼劇情可言。
##CONTINUE##
在繼續往下看之前,先下載來玩玩看吧。
http://alumni.ee.ccu.edu.tw/~hayden0828/HOH/HOH.rar
這次寫的時候有用到物件化的觀念。
有點像CS的WC這樣的感覺
本來是想用事件化
項世紀帝國的劇情編輯器這樣
控制按鍵
空白鍵 跟地圖上的物件進行互動,選擇鍵。
方向鍵 移動、切換。
Z 檢視技能骰子。
X 檢視點數骰子。
C 檢視個人資訊。
V 設定、存檔和離開。
Shift 加速NPC對話速度。
地圖物件
○ NPC,按空白鍵對話以得到情報。
● 敵人。
◎ 技能師、特殊功能的NPC。
□ 箱子、可移動的障礙物。
★ 告示牌。
╬ 回覆體力的裝置。
╳ 傳送至世界地圖。
※ 傳送至其他區域地圖。
先這樣吧
其實BUG很多
想要原始檔能在這裡下載
把它丟到跟執行檔同一個目錄下就能編譯摟。
別顧著打電動,解剖一下練程式的功力那才是最重要的!
2008年5月6日 星期二
2008年4月29日 星期二
助教:你期末要寫什麼專題? 我:RPG遊戲!!
本來想說只是唬弄一下而已,我說要寫RPG遊戲,以為應該很簡單。不過當我開始打口頭報告時,我後悔了!!因為要寫的東西真的很多,CODE不是一天兩天能寫的完的,BUG也不是一天兩天能DE的完的。本來希望能過著期末趕專題的普通大學生活,看來是無望了!!
稍微介紹一下我要寫什麼(這是從口頭報告節錄下來的)
##CONTINUE##
前言-RPG遊戲
參考D&D(龍與地下城)的遊戲模式,戰鬥中獲取經驗值、道具、技能,透過player強化自己控制的角色,以達成遊戲目標。
世界地圖
玩家可以藉由世界地圖從一個區域地圖移動到另外一個區域地圖。
世界地圖由許多的點(區域地圖)連結而成,用陣列儲存各點的座標,當玩家位於其中一個點上時,只能進入周圍一定距離內的點(區域地圖) 。
區域地圖
由檔案讀取地圖(地皮的顏色,石頭和牆是否會擋住玩家移動) 。
當玩家移動時,地圖會反向移動;當玩家位於的地圖的邊緣時,遊戲會詢問玩家是否回到大地圖。
敵人會在畫面上活動(或許是像神奇寶貝一樣的機率出現)。
當遇到敵人時,進入戰鬥畫面。
技能
戰鬥時玩家會有三個骰子,分別表示技能、攻擊力和加權。
第一顆骰子表示技能,玩家可以把技能配置在骰子上,透過投擲骰子決定攻擊的種類。
第二用來決定攻擊力 。
不同的技能會有不同的加權骰子(大絕有較多的加權,普攻就沒有加權) 。
攻擊力的決定就是攻擊力*攻擊加權。
戰鬥
戰鬥採回合制,玩家投擲骰子產生招式,並進行攻擊,計算雙方損失的血量。
當一方血量歸零,戰鬥結束。
戰鬥結束後,依玩家和敵人損失的血量、玩家解決敵人花費的回合數計算經驗值。
隨著經驗時的提升,玩家可以用經驗值去換取更強大的技能,或增加攻擊力骰子上的點數。
大致上是這樣,詳細要寫什麼我也不知道,寫到一個段落或有一些重要的技巧就會放上來,並且做一些簡單的介紹。
稍微介紹一下我要寫什麼(這是從口頭報告節錄下來的)
##CONTINUE##
前言-RPG遊戲
參考D&D(龍與地下城)的遊戲模式,戰鬥中獲取經驗值、道具、技能,透過player強化自己控制的角色,以達成遊戲目標。
世界地圖
玩家可以藉由世界地圖從一個區域地圖移動到另外一個區域地圖。
世界地圖由許多的點(區域地圖)連結而成,用陣列儲存各點的座標,當玩家位於其中一個點上時,只能進入周圍一定距離內的點(區域地圖) 。
區域地圖
由檔案讀取地圖(地皮的顏色,石頭和牆是否會擋住玩家移動) 。
當玩家移動時,地圖會反向移動;當玩家位於的地圖的邊緣時,遊戲會詢問玩家是否回到大地圖。
敵人會在畫面上活動(或許是像神奇寶貝一樣的機率出現)。
當遇到敵人時,進入戰鬥畫面。
技能
戰鬥時玩家會有三個骰子,分別表示技能、攻擊力和加權。
第一顆骰子表示技能,玩家可以把技能配置在骰子上,透過投擲骰子決定攻擊的種類。
第二用來決定攻擊力 。
不同的技能會有不同的加權骰子(大絕有較多的加權,普攻就沒有加權) 。
攻擊力的決定就是攻擊力*攻擊加權。
戰鬥
戰鬥採回合制,玩家投擲骰子產生招式,並進行攻擊,計算雙方損失的血量。
當一方血量歸零,戰鬥結束。
戰鬥結束後,依玩家和敵人損失的血量、玩家解決敵人花費的回合數計算經驗值。
隨著經驗時的提升,玩家可以用經驗值去換取更強大的技能,或增加攻擊力骰子上的點數。
大致上是這樣,詳細要寫什麼我也不知道,寫到一個段落或有一些重要的技巧就會放上來,並且做一些簡單的介紹。
2008年4月20日 星期日
判斷字元重複字數
困難度:★
把Ascii碼當作索引並把次數存進陣列裡,再印出次數大於0的字元。
把Ascii碼當作索引並把次數存進陣列裡,再印出次數大於0的字元。
#include<stdio.h>
int main()
{
int str_arr[129]={0},i;
char string[100];
scanf("%s",&string);
for(i=0;string[i]!='\0';i++)
str_arr[string[i]]++;
for(i=1;i<=128;i++)
{
if(str_arr[i]!=0)
printf("\n%c 有 %d 個",i,str_arr[i]);
}
}
2008年4月18日 星期五
遞迴小練習
困難度:★
輸入X,Y,Z
A(1)=X
A(2)=Y
A(3)=Z
A(4)=A(1)+A(2)+A(3)
A(5)=A(2)+A(3)+A(4)
.
.
.
A(k)=A(k-3)+A(k-2)+A(k-1)
每一個項數都是前三個項數的和
求出第A(target)的值
按繼續閱讀看CODE
##CONTINUE##
執行結果
輸入X,Y,Z
A(1)=X
A(2)=Y
A(3)=Z
A(4)=A(1)+A(2)+A(3)
A(5)=A(2)+A(3)+A(4)
.
.
.
A(k)=A(k-3)+A(k-2)+A(k-1)
每一個項數都是前三個項數的和
求出第A(target)的值
按繼續閱讀看CODE
##CONTINUE##
#include<stdio.h>
#define target 15
int x,y,z;
int term(int number)
{
switch(number)
{
case 1:
return x;
case 2:
return y;
case 3:
return z;
default:
return term(number-1)+term(number-2)+term(number-3);
}
}
int main()
{
int i;
scanf("%d %d %d",&x,&y,&z);
for(i=1;i<=target;i++)
printf("%d ",term(i));
printf("\n");
}
執行結果
1 2 3
1 2 3 6 11 20 37 68 125 230 423 778 1431 2632 4841
2008年4月16日 星期三
讓程式輸出的更美觀
困難度:★
好的程式要讓人很舒服的看,輸出的部份當然就很重要。
我不是資工系的學生,對我來說演算法、程式的速度、執行的流暢度並不是主要的要求(當然也是十分的重要)。
所以下面我就介紹用一些簡單的方法,讓自己的程式更加美觀。
好的程式要讓人很舒服的看,輸出的部份當然就很重要。
我不是資工系的學生,對我來說演算法、程式的速度、執行的流暢度並不是主要的要求(當然也是十分的重要)。
所以下面我就介紹用一些簡單的方法,讓自己的程式更加美觀。
2008年4月1日 星期二
107:The Cat in the Hat
該死的貓,更該死的帽子
真是該死的題目!!
每次寫這種數值運算的都覺得很難= =
還好還是寫出來了,不過寫的亂七八糟爛到爆。
就是這一題害我在中正多留兩天...
The Cat in the Hat
原文
http://luckycat.kshs.kh.edu.tw/v1/107.html
中譯
http://luckycat.kshs.kh.edu.tw/homework/q107.htm
獻醜了= =....:

其實bug超多,丟上去一定不會AC,不過這只是個作業=,有交有分數ˊ~ˋ。
真是該死的題目!!
每次寫這種數值運算的都覺得很難= =
還好還是寫出來了,不過寫的亂七八糟爛到爆。
就是這一題害我在中正多留兩天...
The Cat in the Hat
原文
http://luckycat.kshs.kh.edu.tw/v1/107.html
中譯
http://luckycat.kshs.kh.edu.tw/homework/q107.htm
獻醜了= =....:

其實bug超多,丟上去一定不會AC,不過這只是個作業=,有交有分數ˊ~ˋ。
2008年3月29日 星期六
亂數填入陣列
怎麼填數字到5*5方陣內,而每一個方格的數字都不一樣
我想了3個方法:(設陣列由[1]或[1][1]開始)
1.
隨機填入法,如果填過了就再抽一個
這個方法簡單而無腦
缺點是當在5*5的陣列中最後五個數字填入時所完成的機率為
5!/25^5次
而且有可能算不出來@@"所以並不實際
2.
索引填入法,在填入之後改變未填入的數字陣列範圍
直接看Code
3.
快速填入法
先在方陣中依序填入1~25
再依序跟其他的元素交換
我想了3個方法:(設陣列由[1]或[1][1]開始)
1.
隨機填入法,如果填過了就再抽一個
這個方法簡單而無腦
缺點是當在5*5的陣列中最後五個數字填入時所完成的機率為
5!/25^5次
而且有可能算不出來@@"所以並不實際
int init_map()
{
int i,j,r,m,a=1,flag;
while(1)
{
m=rand()%(map_size*map_size)+1;
flag=0;
for(i=1;i<=map_size;i++)
{
for(j=1;j<=map_size;j++)
{
if(map[i][j]==m) //如果找到了的話flag=1
flag=1;
}
}
if(flag==1) //找到了的話不填入
continue;
map[(a-1)%map_size+1][(a-1)/map_size+1]=m;
if(a==map_size*map_size) break;
a++;
}
}2.
索引填入法,在填入之後改變未填入的數字陣列範圍
直接看Code
int init_map()
{
int i,j,m,arr[map_size*map_size];
for(i=1;i<=map_size*map_size;i++) //依序填入數字
{
arr[i]=i;
}
for(i=1;i<=map_size*map_size;i++)
{
m=rand()%(map_size*map_size+1-i)+1;
map[(i-1)%map_size+1][(i-1)/map_size+1]=arr[m]; //填入陣列
for(j=m;j<=map_size*map_size-i;j++) //往前遞補
{
arr[j]=arr[j+1];
}
}
}3.
快速填入法
先在方陣中依序填入1~25
再依序跟其他的元素交換
int init_map()
{
int i,j,m,n,tmp;
for(i=1;i<=map_size;i++)
{
for(j=1;j<=map_size;j++)
{
map[i][j]=(i-1)*map_size+j; //依序填入
}
}
for(i=1;i<=map_size;i++)
{
for(j=1;j<=map_size;j++)
{
m=rand()%map_size+1; //亂數抽出一個座標
n=rand()%map_size+1;
tmp=map[i][j]; //交換
map[i][j]=map[m][n];
map[m][n]=tmp;
}
}
}
訂閱:
文章 (Atom)


