selectMenu.cpp
#include#include #include "headers.h" int main() { while(1) { int option; table(); scanf_s("%d",&option); if(option==0) { printf("EXIT\n"); break; } switch(option) { case 1: system("CLS"); snake(1); break; case 2: system("CLS"); oneAtwoB(); break; case 3: system("CLS"); tetris(); break; default: printf("輸入錯誤\n\n"); break; } } system("pause"); return 0; }
headers.h
//***選單的部分***
void table();
//***貪吃蛇的部分***
typedef struct snake
{//蛇的身體位置宣告
int x;
int y;
} Snake;
void snake(int argc);
void gotoxy(int xpos, int ypos);//移動游標至(x,y)
void showCursor(int visible);//是否顯現游標
void printSnake(int i);
void printWall();
void printInformation(int food, int speed);//印出在左方顯示的資訊,隨時更新
void setSite(int i, int site_x, int site_y);
void setStartSite();
//***1A2B的部分***
typedef struct numGroup
{
int num[4];
} NG;
typedef struct ab
{
int a;
int b;
} AB;
void oneAtwoB();
void printTitleAndHint();
AB judge(NG set,NG got);
//***俄羅斯方塊***
void tetris();
void gotoxy (int x, int y);
void draw (int x, int y, char* s);
void over (int x, int y, char* s);
bool bMoveBlock (int bx, int by, int d);
void showNextBlock (char* s);
void showBlock (char* s);
void showRoom();
void tryMoveBlock (int x, int y, int d);
int removeLines();
void moveBlock();
void init();
void keyControl();
void printGrade(int grade);
table.cpp
//***選單的部分*** #include#include #include "headers.h" void table() { printf("=============選單=============\n"); printf("0. EXIT\n"); printf("1. 貪吃蛇\n"); printf("2. 1A2B\n"); printf("3. 俄羅斯方塊\n"); printf("==============================\n"); printf("Please choose an option: \n"); }
funcSnake.cpp
//***貪吃蛇的部分*** #include#include #include #include #include //_getch()非標準I/O的函式庫 #include "headers.h" Snake sBody[100]; //創造一隻蛇,最多長度是100 void snake(int argc) { int startBodyLenght = 5; //蛇的初始身長 int startEatenFood = 0; //遊戲初始時蛇已經吃的食物數量 int path = 2; //初始設定前進方向,1,2,3,4,代表轉彎 int snakeSpeed = 100; //設定蛇的初始速度 char gameKey = 'y'; //紀錄是否要玩遊戲,初始為要進入遊戲 int bodyLenght; //紀錄蛇的身長 int eatenFood; //紀錄蛇吃掉的食物數目 int gameOver = 0; //紀錄遊戲是否結束 int isFoodEaten = 0; //紀錄食物是否被蛇吃掉 int xyChanged = 0; //紀錄是否頭有改變方向 int keyinFirst, keyinSecond; //輸入一(抓取鍵盤輸入:開始遊戲、暫停遊戲、加減速度)、輸入二(抓取鍵盤輸入:上、下、左、右) int i; //索引(用來設定蛇的身體) Snake foodSite; //食物的位置 Snake coor; //頭的位置(判斷是否有撞牆而死) Snake last; //尾巴的位置 showCursor(0); //不要顯示游標 while(1) { if(gameKey == 'n' || gameKey == 'N') //如果不要進入遊戲,跳出 break; setStartSite(); //設定蛇的身體位置 printWall(); //印出貪吃蛇外牆 bodyLenght = startBodyLenght; //匯入蛇的初始身長 eatenFood = startEatenFood; //匯入蛇一開始就已經吃的食物 coor.x = 1; //蛇頭位置,用來判斷有沒有撞牆 coor.y = 4; path = 2; //蛇頭前進方向 isFoodEaten = 0; //初始蛇沒吃到東西 gameOver = 0; //初始遊戲結束 xyChanged = 0; //初始蛇沒有移動 snakeSpeed = 100; //初始蛇的行進速度 printInformation(startEatenFood, snakeSpeed); //印右邊的起始資訊(包括分數和速度) for(i=0; i < bodyLenght; i++) //把蛇印出來 printSnake(i); do{ //閃爍"Enter to start." gotoxy(55, 13); //列印遊戲開始的提示字串 printf("Enter to start."); gameKey = _getch(); gotoxy(55, 13); printf(" "); }while(gameKey != 13); //當按了enter,跳出 srand(time_t(NULL)); //抓時間種子 while( !gameOver ) //當遊戲沒有結束 { printInformation(eatenFood, snakeSpeed); //隨時更新右邊資訊(包括分數和速度) if( !isFoodEaten ) //如果食物被吃掉,利用亂數抓出的種子,定食物的位子 { foodSite.x = rand()%47+2; //食物的位置X foodSite.y = rand()%17+2; //食物的位置Y isFoodEaten = 1; //食物沒被吃 } gotoxy(foodSite.x, foodSite.y); //移動游標 printf("§"); //印出食物 xyChanged = 0; //蛇頭沒有轉向,也就是沒有按上下左右鍵 if( _kbhit() ) //執行kbhit()時,會直接檢查當時使用者是否有按下任何按鍵。 //如果有的話傳回非零值,沒有按下任何鍵的話則傳回0,但不會暫停程式等待使用者輸入。他類似getch() { keyinFirst=_getch(); //抓取鍵盤輸入一 if(keyinFirst == 224) //按enter { keyinSecond = _getch(); //抓取鍵盤輸入二 switch(keyinSecond) { case 72: /* up,改變蛇頭位置, 1-->前進方向*/ coor.y--; path = 1; break; case 80: /* down,改變蛇頭位置, 2-->前進方向*/ coor.y++; path = 2; break; case 75: /* left,改變蛇頭位置, 3-->前進方向*/ coor.x--; path = 3; break; case 77: /* right,改變蛇頭位置, 4-->前進方向*/ coor.x++; path = 4; break; } xyChanged = 1; //蛇有移動 } if(keyinFirst == 'p' || keyinFirst == 'P') //暫停 { do{ gotoxy(55, 13); //列印閃爍的暫停提示字串"Pause." printf("Pause."); gameKey = _getch(); gotoxy(55, 13); printf(" "); }while(gameKey != 'p' && gameKey != 'P'); } if(keyinFirst == '+') //加速 { if(snakeSpeed > 10) snakeSpeed -= 10; keyinFirst = '\0'; } if(keyinFirst == '-') //減速 { if(snakeSpeed < 300) snakeSpeed += 10; keyinFirst = '\0'; } } else //如果沒有改變方向、加速、暫停,就延續原本的前進方向 { switch(path){ case 1: /* up, 1 */ coor.y--; path = 1; break; case 2: /* down, 2 */ coor.y++; path = 2; break; case 3: /* left, 3 */ coor.x--; path = 3; break; case 4: /* right, 4 */ coor.x++; path = 4; break; } xyChanged = 1; //蛇已經移動 } for(i=1; i < bodyLenght; i++) //蛇頭碰到身體死掉 { if(coor.x == sBody[i].x && coor.y == sBody[i].y) gameOver = 1; } if(gameOver == 0 && xyChanged == 1) //蛇沒有撞牆而死 { if(coor.x>0 && coor.x<49 && coor.y>0 && coor.y<19) //蛇沒有碰到牆 { last.x = sBody[bodyLenght-1].x; //蛇的尾巴位置 last.y = sBody[bodyLenght-1].y; for(i=bodyLenght-1; i>=0; i--) //身體長度少一,設定頭和身體的位置 { if(i == 0) setSite(i, coor.x, coor.y); else setSite(i, sBody[i-1].x, sBody[i-1].y); } for(i=0; i < bodyLenght; i++)//增加蛇的身長,印出來 printSnake(i); Sleep(snakeSpeed); //表示停滯時間,括號內以毫秒為單位,S小寫是以秒為單位(沒有 include window.h 時用) gotoxy(last.x, last.y); printf(" "); //削掉蛇尾巴 } else gameOver = 1; //蛇撞牆而死 if(sBody[0].x == foodSite.x && sBody[0].y == foodSite.y) { isFoodEaten = 0; //食物被吃掉了 bodyLenght++; //身體長度加長 eatenFood++; //累積加分 } } } /* 遊戲結束 */ while(1) { system("CLS"); printf("\n\n\t\tYour Grade: %d\n", eatenFood * 100); printf("\t\tGame over.\n\t\tPlay again? (y/n) \n\t\t"); gameKey = getchar(); if(gameKey == 'y' || gameKey == 'Y' || gameKey == 'n' || gameKey == 'N') { system("CLS"); break; } } } printf("Bye!\n"); system("CLS"); } void gotoxy(int xpos, int ypos) //移動游標至(x,y) { COORD scrn; HANDLE hOuput = GetStdHandle(STD_OUTPUT_HANDLE); scrn.X = xpos; scrn.Y = ypos; SetConsoleCursorPosition(hOuput,scrn); } void showCursor(int visible) //是否顯現游標 { CONSOLE_CURSOR_INFO ConCurInf; HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleCursorInfo(hStdOut, &ConCurInf); ConCurInf.bVisible = visible; SetConsoleCursorInfo(hStdOut, &ConCurInf); } void printSnake(int i) //把蛇的身體印出來 { gotoxy(sBody[i].x, sBody[i].y); printf("%c",4); } void printWall() //印出貪吃蛇的外牆 { int i, j; for(i=0; i<20; i++) { for(j=0; j<50; j++) { gotoxy(j, i); if(i==0 || i==19 || j==0 || j==49) printf("'"); } } void printInformation(int food, int speed) //印出在左方顯示的資訊,隨時更新 { gotoxy(55, 1); printf("Use + to increase the"); gotoxy(55, 2); printf("snake moving speed."); gotoxy(55, 4); printf("Use - to decrease the"); gotoxy(55, 5); printf("snake moving speed."); gotoxy(55, 7); printf("Use P to pause."); gotoxy(55, 9); printf("Grade: %d", food * 100); //顯示得分 gotoxy(55, 11); if(speed == 0) printf("Speed: %3d (The fastest)", 310-speed); //最高速限 else if(speed == 300) printf("Speed: %3d (The slowest)", 310-speed); //最低速限 else printf("Speed: %3d ", 310-speed); //顯示速度 } void setSite(int i, int site_x, int site_y) //設定位置 { sBody[i].x = site_x; sBody[i].y = site_y; } void setStartSite() { int i; for(i=0;i<5;i++) sBody[i].x=1; //設定蛇的五節身體的x值 for(i=0; i<5; i++) sBody[i].y = abs(5 - i); //設定蛇五節身體的y值 }
func1A2B.cpp
//***1A2B的部分*** #include#include #include #include "headers.h" void oneAtwoB() { NG set,got; //結構,儲存電腦設定的數字和玩家輸入的數字 AB ab; //紀錄A、B的個數 int i,j,choose,grade(0); //索引、紀錄是否繼續遊戲 while(1) { printTitleAndHint(); //印出提示字串 do{ for(i=0;i<4;i++) //取得亂數種子,隨機亂數,產生電腦設定的四個數字 { srand(time(NULL)+i); set.num[i]=rand()%10; } for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(i==j) continue; else if(set.num[i]==set.num[j]) break; } if(set.num[i]==set.num[j]) break; } if(i==4&&j==4) //輸入完成 break; }while(1); do{ do{ for(i=0;i<4;i++) { scanf_s("%d",&got.num[i]); //玩家輸入數字 if(got.num[i]>=10) printf("格式不符,請重新輸入\n"); //如果玩家輸入的數字超過十位數,要求重新輸入 } break; //輸入完成 for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(i==j) continue; //輸入完成 else if(got.num[i]==got.num[j]) { printf("格式不符,請重新輸入\n"); continue; //如果輸入的四個數字中有重複,要求重新輸入 } } } break; }while(1); ab=judge(set,got); //判斷幾A幾B printf("==>%dA%dB\n",ab.a,ab.b); //印出判斷 grade++; if(ab.a==4&&ab.b==0) //全對,跳出 break; }while(1); printf("\n!!!YOU GOT IT!!!\n"); printGrade(grade); printf("DO YOU WANT TO PLAY AGAIN?\n\nIF YOU WANT TO CHOOSE 'YES', PLEASE PRESS 1.\nIF NOT, PRESS 0.\n\n"); scanf_s("%d",&choose); //輸入是否再一次遊戲 if(choose!=1) //離開遊戲 break; system("CLS"); //再玩一次,清空螢幕 } printf("Bye Bye!\n"); //回主選單 system("pause"); system("CLS"); } void printTitleAndHint() //遊戲提示字串 { printf("《1A2B猜數字遊戲》\n\n"); printf(" ※遊戲提示\n"); printf("%s\n%s\n%s\n%s\n%s\n","\t電腦會隨機設定四個的數字","\t當玩家輸入四個的數字時,電腦會告訴玩家猜數字的結果","\txA代表玩家猜的四格數字中,有x個位置正確且數字正確","\tyB代表玩家猜的四格數字中,有y個位置不正確但數字正確","\t其中x,y是數字"); printf("\n§遊戲開始§\n\n請輸入四個數字(0,1,2,3,4,5,6,7,8,9以空格分開,不可重複!):\n\n"); } AB judge(NG set,NG got) //判斷幾A幾B { AB ab; ab.a=0; ab.b=0; int i,j; for(i=0;i<4;i++) //若有數字相同位置不同B加一 { for(j=0;j<4;j++) { if(set.num[i]==got.num[j]) { ab.b++; if(i==j) ab.b--; } } if(set.num[i]==got.num[i]) //相對應位置若數字相同A加一 ab.a++; } return ab; //回傳A、B個數 } void printGrade(int grade) //給不同等級的玩家不同的評語 { int level; if(grade<=5) level=1; else if(grade>5&&grade<=10) level=2; else if(grade>10&&grade<=15) level=3; else level=4; switch(level) { case 1: printf("YOU ARE EXCELLENT!!\n"); break; case 2: printf("YOU ARE GREATE!!\n"); break; case 3: printf("NOT BAD!!\n"); break; case 4: printf("YOU CAN BE BETTER!!\n"); break; default: break; } }
funcTetris.cpp
//***俄羅斯方塊*** #include#include #include #include //_getch()非標準I/O的函式庫 #include #include "headers.h" using namespace std ; //C++提供名稱空間的概念,可以在不同的名稱空間使用同一個命名 //使用"using"關鍵字指明所要使用的名稱空間或其下的成員 //則被指定的名稱空間或其下的成員就可以直接被使用 //std 是 Standard C++ library 所建立的 namespace 名稱 //using namespace std 的意思就是指定現在的簡寫所要使用的是 std 裡面的名稱 //亦即省去了 std::。 #define setColor(c) SetConsoleTextAttribute(hOut,c) //設置顏色 #define lightGray 7 #define brightYellow 14 enum {H=23, W=14, nBlock=7}; //畫面長寬, 方塊樣式種類 HANDLE hIn, hOut; //I/O 控制器 bool bExit = false; //是否持續遊戲 int level=0, score=0; //關卡, 積分 int ox=4, oy=1; //畫面左上原點 int B, N; //前一個和下一個方塊的編號 int X, Y, dir=0; //方塊位置, 所處方位(0~3) int delayTime = 40; //延遲時間 int flexibleTime = 10; //(加速按鍵控制的程度)鍵盤連擊的流暢度 char room[W][H]; //畫面 int block[nBlock][4] = //方塊樣式 {{0x6220,0x1700,0x2230,0x0740}, // L {0x6440,0x0e20,0x44c0,0x8e00}, // 反L {0x04e0,0x0464,0x00e4,0x04c4}, // T {0x4620,0x6c00,0x4620,0x6c00}, // z {0x2640,0xc600,0x2640,0xc600}, // 反z {0x0f00,0x4444,0x0f00,0x4444}, // | {0x0660,0x0660,0x0660,0x0660}}; // 田 void tetris() { int i; init(); while (!bExit) //繼續遊戲 { for (i=0; i < flexibleTime; i++) //加速按鍵處理 { if (_kbhit()) //如果有案任何按鍵 keyControl(); //如果有按按鍵 Sleep (delayTime); //延遲一下 } moveBlock (); setColor (brightYellow); gotoxy (ox+W*2+8, 10); cout << "Level: "<< level+1; gotoxy (ox+W*2+8, 12); cout << "Score: " << score; } setColor (lightGray); //*** bExit=0; system("CLS"); } void draw (int x, int y, char* s) //在(x,y)印出任何傳進來的字 { gotoxy (x*2,y); cout << s; } void over (int x, int y, char* s) //遊戲結束 { draw(x,y,s); _getch(); bExit=1; } bool bMoveBlock (int bx, int by, int d) //判斷方塊可不可以移動 { for (int p = 0x8000, x, y=0; y < 4; y++) for (x=0; x < 4; x++, p>>=1) //在(x,y) if ((block[B][d]&p) && room[bx+x-ox][by+y-oy]) return false; return true; //可以變動 } void showNextBlock (char* s) //下一塊方塊 { setColor (N+9); //設定顯示色 int x, y, p = 0x8000; for (y=0; y < 4; y++) for (x=0; x < 4; x++, p>>=1) if (block[N][0] & p) draw (ox+W+2+x, 2+y, s); } void showBlock (char* s) //現在的這塊方塊 { setColor (B+9); //設定顯示色 int x, y, p = 0x8000; for (y=0; y < 4; y++) for (x=0; x < 4; x++, p >>=1) if (block[B][dir] & p) draw (x+X, y+Y, s); } void show_room() //印出外牆 { for (int x,y=0; y 1; i--) for (j=1; j >=1) if (block[B][dir] & p) room[X+x-ox][Y+y-oy] = B+8; int n = removeLines(); //秀出已經bingo的條數 level = (score+=(1+n*n)*4)/200; //透過已經去掉的條數來設定level delayTime = 30-level; //進而加快速度 if (level > 10) over (ox+4, H/2, "Y o u W i n"); //如果level大於十就贏了 showNextBlock (" "); //不能移動方塊的時候,出動下一個方塊 B = N; X = ox+W/2-1; Y = 0; N = rand() % nBlock; showNextBlock ("█"); } void init() //初始配置 { srand (time_t(NULL)); //抓亂數種子 hOut = GetStdHandle (STD_OUTPUT_HANDLE); //標準輸出入(使有顏色) hIn = GetStdHandle (STD_INPUT_HANDLE); HANDLE err = INVALID_HANDLE_VALUE; if (hIn == err || hOut == err) { puts ("handle failed"); _getch (); exit (1); } for (int x=0; x
links
以上程式碼的共用連結
selectMenu.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgWThFcUtTUzdQM2s/view?usp=sharing
headers.h
https://drive.google.com/file/d/0B8OIgELqDXYgb1VLRWUzUnJULUk/view?usp=sharing
table.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgUVpuaXd5dVkyUHM/view?usp=sharing
funcSnake.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgamJlR2NGRzVlLUU/view?usp=sharing
func1A2B.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgdmtnMTFDbkxNME0/view?usp=sharing
funcTetris.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgZTU4VG5RbkNGNjg/view?usp=sharing
遊戲選單.exe
https://drive.google.com/file/d/0B8OIgELqDXYgMng2TDB3d2U1amc/view?usp=sharing
PPT
https://docs.google.com/presentation/d/1TyiN6myvSZJZ2RuFxT2OfXB1mBd79mLIZ3RQ3oHT8Y4/edit?usp=sharing
selectMenu.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgWThFcUtTUzdQM2s/view?usp=sharing
headers.h
https://drive.google.com/file/d/0B8OIgELqDXYgb1VLRWUzUnJULUk/view?usp=sharing
table.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgUVpuaXd5dVkyUHM/view?usp=sharing
funcSnake.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgamJlR2NGRzVlLUU/view?usp=sharing
func1A2B.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgdmtnMTFDbkxNME0/view?usp=sharing
funcTetris.cpp
https://drive.google.com/file/d/0B8OIgELqDXYgZTU4VG5RbkNGNjg/view?usp=sharing
遊戲選單.exe
https://drive.google.com/file/d/0B8OIgELqDXYgMng2TDB3d2U1amc/view?usp=sharing
PPT
https://docs.google.com/presentation/d/1TyiN6myvSZJZ2RuFxT2OfXB1mBd79mLIZ3RQ3oHT8Y4/edit?usp=sharing
沒有留言:
張貼留言