第一組
標頭檔
//以下是快手輸字母的函式定義
void printmenu();
void input();
void guess1();
void outside();
//以下是猜數字的函式定義
struct data
{
int guess;
int A;
int B;
};
typedef struct data D;
int run();
void guess1();
void compare();
void printData();
void compu();
void dot();
//以下是點點逃走中的函式庫/定義
#define M 10
void dot();
void move(int input,int kind);
void buildTable();
int chooseLevel();
int check();
void menu();
void randMove();
void print(int count, int level);
void randgive();
void gameover(int count);
#include#include #include"遊戲目錄func.h" int main() { int select; while(1) { system("CLS"); printmenu(); scanf_s("%d",&select); if (select == 0) { return 0; } switch(select) { case 1: { input(); break; } case 2: { guess1(); break; } case 3: { dot(); break; } default: { printf("輸入錯誤! 請按Enter再次輸入!\n"); break; } } } system("pause"); }
#include#include #include #include #include"遊戲目錄func.h" int i; int guess,ans,a,b,c,d,e,f,g,h; D data[10]; void printmenu()//輸出主畫面選項 { printf("===============Mainmenu===============\n"); printf("\n"); printf("1. 快手輸字母\n"); printf("\n"); printf("2. 猜數字\n"); printf("\n"); printf("3. 點點逃跑中\n"); printf("\n"); printf("0. 離開程式\n"); printf("\n"); printf("======================================\n"); printf("\n"); printf("請輸入代號: "); } void input()//遊戲1.快手輸字母 { int t; int i,score,a,count,n; system("CLS"); printf("這是一個考驗你手腦協調的小遊戲.\n"); printf("\n"); printf("遊戲規則:\n"); printf("\n"); printf("畫面中會隨機出現英文字母\n"); printf("\n"); printf("請你照著畫面上的英文字母輸入\n"); printf("\n"); printf("大小寫都可以喔!\n"); printf("\n"); printf("速度越快,分數越高!\n"); printf("\n"); printf("我們會計算你的正確率,並且記錄你的分數\n"); printf("\n"); printf("準備好了嗎?我們開始吧!\n"); printf("\n"); system("pause"); system("CLS"); //刷新畫面 printf("可以自己選擇要玩多久喔!想玩多久呢?\n"); printf("\n"); printf("(輸入0回主選單)\n"); printf("\n"); printf("你想挑戰幾秒: "); scanf_s("%d",&n); //輸入挑戰時間,若輸入0則離開遊戲 if (n == 0) { return; } system("CLS"); //刷新畫面 printf("請按ENTER開始遊戲\n"); printf("\n"); //給玩家準備時間 system("pause"); t=time(NULL); score=0; count=0; while(time(NULL)-t < n)//當時間未到,遊戲不會結束 { system("CLS"); printf("剩餘時間: %d\n",n-time(NULL)+t); printf("\n"); printf("分數: %d\n",score); printf("\n"); printf("你已經輸入%d次了\n",count); printf("\n"); i=(rand()%25)+65; printf("%c",i); a=_getch(); if(a==i||a==i+32)//設定答案為無論大小寫都可以接受 { score++; } count++; } system("CLS"); //刷新螢幕 printf("\n"); printf("GAME OVER!\n\n"); printf("\n"); printf("成績: %d\n",score); printf("\n"); printf("答題正確率:%3.1f %%\n",(float)score/count*100); printf("\n"); system("pause"); } void guess1()//猜數字遊戲說明 { int select; int ans; int a; int b; int c; int d; while(1) { system("CLS"); //刷新螢幕 printf("遊戲規則:\n"); printf("\n"); printf("接下來會由外界輸入或隨機產生4個數字\n"); printf("\n"); printf("玩家必須猜出是哪四位數字才能勝出\n"); printf("\n"); printf("而遊戲中也會給予玩家提示\n"); printf("\n"); printf("當玩家猜測的數字與位置均正確時\n"); printf("\n"); printf("系統會記錄為A\n"); printf("\n"); printf("當玩家猜測的數字正確,但位置錯誤時\n"); printf("\n"); printf("系統會記錄為B\n"); printf("\n"); printf("例如:答案是1234,若玩家輸入答案1678,則因第一位數字猜對,其他均錯,記錄為1A0b\n"); printf("\n"); printf("若玩家輸入6178,則記錄為0A1B\n"); printf("\n"); printf("得到4A(答案全對)即通關\n"); printf("\n"); system("pause"); system("CLS"); printf("請選擇答案來源:\n"); printf("\n"); printf("1.答案由外界輸入\n"); printf("\n"); printf("2.答案由電腦產生\n"); printf("\n"); printf("0.回主選單\n"); scanf_s("%d",&select); if (select == 0) { break; } if(select!=1&&select!=2) { printf("輸入錯誤! 請重新輸入!\n"); printf("\n"); system("pause"); } else { switch(select) { case 1: system("CLS"); //刷新螢幕 printf("你選擇了答案由外界輸入!\n"); outside(); break; case 2: system("CLS"); //刷新螢幕 printf("你選擇了答案由電腦產生!\n"); compu(); break; default: printf("不好意思,輸入錯誤!\n"); break; } } } system("pause"); } void outside()//從外界輸入數字 { i=0; ans=0; guess=99999; while(1) { printf("請輸入4個0~9的相異數字作為答案: "); printf("\n"); scanf_s("%d",&ans); d=ans%10; c=((ans-d)/10)%10; b=((ans-d-10*c)/100)%10; a=((ans-d-10*c-100*b)/1000)%10; if(ans!=1000*a+100*b+10*c+d||a==b||a==c||a==d||b==c||b==d||c==d) printf("輸入錯誤! 請重新輸入!\n"); else break; } system("CLS"); while(i < 10&&guess!=ans) { run(); } if(guess==ans) { printf("\n"); printf("Bingo!!!!!!!\n"); printf("\n"); system("pause"); } else { printf("\n"); printf("GAME OVER!!!!\n"); printf("\n"); system("pause"); } } void compu()//由電腦產生數字 { i=0; ans=0; guess=99999; while(a==b||a==c||a==d||b==c||b==d||c==d) { a=rand()%10; b=rand()%10; c=rand()%10; d=rand()%10; ans=a*1000+b*100+c*10+d; } while(i < 10&&guess!=ans) { run(); } if(guess==ans) { printf("\n"); printf("Bingo!!!!!!!\n"); system("pause"); } else { printf("\n"); printf("GAME OVER!!!!\n"); system("pause"); } } int run()//遊戲主程式 { while(1) { printf("請輸入猜測: "); scanf_s("%d",&guess); if(a==b||a==c||a==d||b==c||b==d||c==d) { printf("\n"); printf("4數字需相異! 請重新輸入!\n"); break; } else { data[i].guess=guess; h=guess%10; g=((guess-h)/10)%10; f=((guess-h-10*g)/100)%10; e=((guess-h-10*g-100*f)/1000); compare(); system("CLS"); //刷新螢幕 printData(); i++; return i; } } } void compare()//比較答案是A還是B { data[i].A=0; data[i].B=0; if (a == e) { (data[i].A) += 1; } if (b == f) { (data[i].A) += 1; } if (c == g) { (data[i].A) += 1; } if (d == h) { (data[i].A) += 1; } if (e == b || e == c || e == d) { data[i].B += 1; } if (f == a || f == c || f == d) { data[i].B += 1; } if (g == a || g == b || g == d) { data[i].B += 1; } if (h == a || h == b || h == c) { data[i].B += 1; } } void printData()//印出猜測記錄 { int k; printf("%4s%7s%7s\n","No.","guess","AB"); for(k=0;k < =i;k++) { printf("%4d%7d%4dA%dB\n",k+1,data[k].guess,data[k].A,data[k].B); } printf("\n"); } void dot()//點點逃走中程式本體 { int input,level,enemy,count; while(1) { buildTable(); menu(); level=chooseLevel(); count = 0; if(level==0) { break; } randgive(); while(1) { system("CLS"); //刷新螢幕 print(count,level); input=_getch(); input=_getch(); move(input,1); randMove(); count++; if (count%level == 0) { randgive(); } system("CLS"); //刷新螢幕 print(count,level); if (check() == 1) { printf("\n"); printf("\n可惜!被敵人抓到了!\n"); system("pause"); break; } } system("CLS"); //刷新螢幕 gameover(count); } } int row,col; int table[M][M]; void menu()//點點逃走中主程式 { system("CLS"); printf("\n"); printf("遊戲說明\n"); printf("\n"); printf("玩家將扮演一顆黑色的點點\n"); printf("\n"); printf("目標是躲過四處移動的白色點點\n"); printf("\n"); printf("逃得越久,分數越高!\n"); printf("\n"); printf("操作方式:\n"); printf("\n"); printf("鍵盤輸入上下左右,連點兩下空白鍵可以停止不動一回合\n"); printf("\n"); system("pause"); system("CLS"); printf("難度選擇:\n"); printf("\n"); printf("1.簡單 10回合出現一個新敵人\n"); printf("\n"); printf("2.普通 7回合出現一個新敵人\n"); printf("\n"); printf("3.困難 5回合出現一個新敵人\n"); printf("\n"); printf("4.地獄 3回合出現一個新敵人\n"); printf("\n"); printf("輸入0回主選單\n"); } int chooseLevel()//選擇關卡難度 { int level; scanf_s("%d",&level); if(level==0) //輸入0回主選單 { printf("回主選單\n"); system("pause"); return 0; } switch(level) { case 1: { return 10; //若選擇1 則10回合出現一次敵人 } case 2: { return 7; //若選擇2 則7回合出現一次敵人 } case 3: { return 5; //若選擇3 則5回合出現一次敵人 } case 4: { return 3; //若選擇4 則3回合出現一次敵人 } default: { printf("\n"); printf("輸入錯誤\n"); system("pause"); return 0; } } } void buildTable()//建立遊戲平台 { for(row=0;row < M;row++) { for(col=0;col < M;col++) { table[row][col]=0; //歸0遊戲平台 } } table[0][0]=1; //建立初始點點(玩家)在遊戲平台上 } void move(int input,int kind)//玩家的點點移動 { int temp[M][M]; for(row=0;row < M;row++) { for(col=0;col < M;col++) { temp[row][col]=table[row][col]; //先建立一個暫存,讓程式可以比對移動前跟移動後 } } switch(input) { /*getch()抓到的上下左右分別是 上:72 下:80 左:75 右:77 故做4個CASE 若輸入其他數字/按空白鍵則無作為 */ case 72: for(row=0;row < M;row++) { for(col=0;col < M;col++) { if(table[row][col]==kind) { if(row==0) { if (temp[M - 1][col] == 2) /* 若移動目標向上會跨過邊界則設定 移動後目標位置為總行數-1 */ { table[row][col] = 3; //若移動方向已經有點點,則移動後變更玩家為X } temp[M-1][col]=table[row][col]; temp[row][col]=0; //若沒有問題便交換點點的位置 } else { if (temp[row - 1][col] == 2) { table[row][col] = 3; //若移動方向已有敵人,則變更玩家為X } temp[row-1][col]=table[row][col]; temp[row][col]=0; //若沒有問題便交換點點的位置 } } } } for(row=0;row < M;row++) { for(col=0;col < M;col++) { table[row][col]=temp[row][col]; } } break; case 80: for(row=0;row < M;row++) { for(col=0;col < M;col++) { if(table[row][col]==kind) { if(row==M-1) { /* 若移動目標向下會跨過邊界則設定 移動後目標位置為0 */ if (temp[0][col] == 2) { table[row][col] = 3; //若移動方向已經有點點,則移動後變更玩家為X } temp[0][col]=table[M-1][col]; temp[M-1][col]=0; //若沒有問題便交換點點的位置 } else { if (temp[row + 1][col] == 2) { table[row][col] = 3; //若移動方向已經有點點,則移動後變更玩家為X } temp[row+1][col]=table[row][col]; temp[row][col]=0; //若沒有問題便交換點點的位置 } } } } for(row=0;row < M;row++) { for(col=0;col < M;col++) { table[row][col]=temp[row][col]; } } break; case 75: for(row=0;row < M;row++) { for(col=0;col < M;col++) { if(table[row][col]==kind) { if(col==0) { /* 若移動目標向左會跨過邊界則設定 移動後目標位置為總行數-1 */ if (temp[row][M - 1] == 2) { table[row][col] = 3; //若移動方向已經有點點,則移動後變更玩家為X } temp[row][M-1]=table[row][col]; temp[row][col]=0; //若沒有問題便交換點點的位置 } else { if (temp[row][col - 1] == 2) { table[row][col] = 3; //若移動方向已經有點點,則移動後變更玩家為X } temp[row][col-1]=table[row][col]; temp[row][col]=0; //若沒有問題便交換點點的位置 } } } } for(row=0;row < M;row++) { for(col=0;col < M;col++) { table[row][col]=temp[row][col]; } } break; case 77: for(row=0;row < M;row++) { for(col=0;col < M;col++) { if(table[row][col]==kind) { if(col==M-1) { /* 若移動目標向右會跨過邊界則設定 移動後目標位置為0 */ if (temp[row][0] == 2) { table[row][col] = 3; //若移動方向已經有點點,則移動後變更玩家為X } temp[row][0]=table[row][col]; temp[row][col]=0; //若沒有問題便交換點點的位置 } else { if (temp[row][col + 1] == 2) { table[row][col] = 3; //若移動方向已經有點點,則移動後變更玩家為X } temp[row][col+1]=table[row][col]; temp[row][col]=0; //若沒有問題便交換點點的位置 } } } } for(row=0;row < M;row++) { for(col=0;col < M;col++) { table[row][col]=temp[row][col]; } } break; } } int check()//檢察遊戲是否結束 { for (row = 0; row < M; row++) { for (col = 0; col < M; col++) { if (table[row][col] == 1) return 0; /* 如果遊戲平台上有玩家角色(沒有變成X) 則遊戲繼續 */ } } return 1; /* 如果遊戲平台上沒有玩家角色(已經變成X了) 則遊戲繼續 */ } void randgive() { while (1) { row = rand() % 8; col = rand() % 8; if (table[row][col] ==0) /* 當隨機選到的目標是空格時 可以填入敵人 */ { table[row][col] = 2; //填入敵人 break; } } } void randMove()//隨機移動敵人 { int enemy; int temp[M][M]; //先把整個遊戲平台複製一份暫存 方便比對用 for (int k = 0; k < M; k++) { for (int t = 0; t < M; t++) { temp[k][t] = table[k][t]; } } for(int i=0;i < M;i++) { for(int j=0;j < M;j++) { /* 如果某個敵人曾經移動過 則存取為21 這是為了方便分辨移動前與移動後 若暫存的位置與遊戲平台的位置一樣是移動前的敵人 則敵人開始移動 */ if (temp[i][j] == 2 && table[i][j]==2) { switch (rand() % 4) { case 0: //向上移動 { if (i == 0)//若敵人在第一排,則移動到最下面一排 { if (table[M - 1][j] != 2 && table[M - 1][j] != 21)//先檢查最下面一排有沒有其他敵人,如果有則不移動 { if (table[M - 1][j] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[M - 1][j] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[M - 1][j] = 21; table[i][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } else//若敵人不在第一排,則直接向上移動 { if (table[i - 1][j] != 2 && table[i - 1][j] != 21)//先檢查上面一排有沒有其他敵人,如果有則不移動 { if (table[i - 1][j] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[i - 1][j] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[i - 1][j] = 21; table[i][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } break; } case 1: { if (i == M - 1)//若敵人在最下面一排,則移動到第一排 { if (table[0][j] != 2 && table[0][j] != 21)//先檢查最上面一排有沒有其他敵人,如果有則不移動 { if (table[0][j] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[0][j] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[0][j] = 21; table[M - 1][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } else { if (table[i + 1][j] != 2 && table[i + 1][j] != 21)//先檢查下面一排有沒有其他敵人,如果有則不移動 { if (table[i + 1][j] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[i + 1][j] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[i + 1][j] = 21; table[i][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } break; } case 2: { if (j == 0)//若敵人在第一列,則移動到最右邊一列 { if (table[i][M - 1] != 2 && table[i][M - 1] != 21)//先檢查最右邊一列有沒有其他敵人,如果有則不移動 { if (table[i][M - 1] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[i][M - 1] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[i][M - 1] = 21; table[i][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } else { if (table[i][j - 1] != 2 && table[i][j - 1] != 21)//先檢查左邊一列有沒有其他敵人,如果有則不移動 { if (table[i][j - 1] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[i][j - 1] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[i][j - 1] = 21; table[i][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } break; } case 3: { if (j == M - 1)//若敵人在最後一列,則移動到第一列 { if (table[i][0] != 2 && table[i][0] != 21)//先檢查最右邊一列有沒有其他敵人,如果有則不移動 { if (table[i][0] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[i][0] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[i][0] = 21; table[i][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } else { if (table[i][j + 1] != 2 && table[i][j + 1] != 21)//先檢查左邊一列有沒有其他敵人,如果有則不移動 { if (table[i][j + 1] == 1) { //如果該位置有玩家,則宣告玩家死亡(用X取代玩家) table[i][j + 1] = 3; table[i][j] = 0; } else { //如果沒有玩家,則直接互換(存取為移動後) table[i][j + 1] = 21; table[i][j] = 0; } } else//如果沒有移動,則直接設定為移動後 { table[i][j] = 21; } } break; } case 4: //點點不移動 { //直接設定點點為"移動後",以免程式判斷錯誤 table[i][j] = 21; } } } } } for (int k = 0; k < M; k++) { for (int t = 0; t < M; t++) { if (table[k][t] == 21) { table[k][t] = 2; } } } } void print(int count,int level)//印出遊戲平台 { printf("______________________\n"); for(row=0;row < M;row++) { printf("|"); for(col=0;col < M;col++) { if(table[row][col]==0) printf(" "); else if(table[row][col]==1) printf("○"); else if (table[row][col] == 2) printf("●"); else if(table[row][col]==3) printf("X"); } printf("|\n"); } printf("______________________\n"); printf("\n"); printf("你現在的分數是:%d\n,距離下一個敵人出現還有%d次\n",count,level-1-((count-1)%level)); } void gameover(int count)//遊戲結束 { printf("\n"); printf("遊戲結束!\n"); printf("\n"); printf("你一共得了%d分!玩得還開心嗎? 再來一次吧!\n",count); printf("\n"); system("pause"); }
沒有留言:
張貼留言