您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關利用C++寫一個俄羅斯方塊游戲,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
思路:
1.打印出游戲地圖,也就是設計游戲地圖類game_interdace,包括設計游戲開始界面的函數,游戲地圖界面的函數,游戲結束界面的函數,以及設計一些輔助函數如(設置光標為目標點,改變顏色,隱藏光標)來完成上述設計。
2.設計方塊圖形類,包括生成圖形,清理圖形,圖形移動,圖形停止的處理,圖形的消失(實質是得分)等。
#include <iostream> #include<conio.h> #include<windows.h> #include<time.h> #include<string> class game_interdace { public: friend class Graphic; game_interdace(); void start_interface();//游戲開始界面 void HideCursor(); //隱藏光標 int color(int c);//改變顏色 void gotoxy(int x, int y);//設置光標為目標點 void gotoprintf(int x, int y);//在目標點打印■ void gotoclear(int x, int y);//消除目標點■ void map(); //游戲地圖界面 bool end_map(); //游戲結束界面 private: int grade; static int game_lv; }; int game_interdace::game_lv{}; game_interdace::game_interdace() :grade{ } { }//注意這里的花括號 class Graphic { public: class game_interdace interdace; Graphic(); int location_x;//用于判斷和控制圖形位置(x坐標) int location_y;//用于判斷和控制圖形位置(y坐標) int graph_id; //圖形id int next_graph_id{};//下一圖形id int random(); //生成隨機數 void produce_graph(int location_x, int location_y,int id );//生成圖形 void clear_graph(int location_x, int location_y,int id);//清理圖形 void graph_moving();//圖形移動 bool graph_no_moving(int location_x, int location_y,int id);//圖形不能超界和不能變形處理 int graph_change(int id); //按‘w'鍵時,圖形的改變 void graph_stop(); //圖形停止的處理 void graph_disppear(int location_x, int location_y); //圖形的消失(實質是得分) bool game_end(); //游戲結束的判定 private: const int graph[15][8];//記錄每個每個圖形的各點坐標 int graph_active_pos[32][26]{};//方塊活動地圖的各坐標點的狀態 const int graph_with[15];//記錄每個每個圖形的寬度 int stop_tgraph_top;// 記錄所有已經下落的方塊中的最高點 }; Graphic::Graphic(): graph { //兩個值一組分別代表x,y 坐標就比如方形圖形數據可以這么來看(0,0),(2,0),(0,2),(2,2) //由于每個方塊由"■"的寬度為兩個字符,所以x坐標成雙增長 {0,0,2,0,0,1,2,1 }, //方形 {2,0,4,0,0,1,2,1},{0,0,0,1,2,1,2,2},// |_ // |形 {0,0,2,0,2,1,4,1},{2,0,0,1,2,1,0,2},// {0,0,2,0,4,0,6,0},{0,0,0,1,0,2,0,3},//條形 {2,0,0,1,2,1,4,1},{0,0,0,1,2,1,0,2},{0,0,2,0,4,0,2,1},{2,0,0,1,2,1,2,2} ,//T形 {0,0,2,0,0,1,0,2},{0,0,0,1,2,1,4,1},{0,0,2,0,2,1,2,2} ,{0,0,2,0,4,0,0,1}, }, //L形 graph_with{ 2,3,2,3,2,4,1,3,2,3,2,2,3,2,3 }, location_x{ 14 }, location_y{ 1 }, graph_id{ 5 }, stop_tgraph_top{ 26 } { } int main() { bool aganst{ false }; do { game_interdace interdace; interdace.HideCursor(); interdace.start_interface(); interdace.map(); Graphic graph; graph.graph_moving(); if (interdace.end_map()) { aganst = true; system("cls"); } } while (aganst); } void game_interdace::start_interface()//游戲開始界面 { color(2); gotoxy(30, 2); std::cout<<" 游戲說明 "; color(3); gotoxy(30, 5); std::cout << " 請在英文輸入法中輸入wsad控制方塊 "; color(4); gotoxy(30, 9); std::cout << " 'w'為變形 \n"; gotoxy(30, 10); std::cout << " 's'為快速下落 \n"; gotoxy(30, 11); std::cout << " 'a'為左移 "; gotoxy(30, 12); std::cout << " 'd'為右移 "; gotoxy(30, 14); color(5); std::cout << " 游戲等級 "; gotoxy(30, 16); color(5); std::cout << "====================================================="; color(3); gotoxy(30, 18); std::cout << " 游戲等級:(1)簡單--(2)(困難)--(3)地獄"; gotoxy(30, 20); color(5); std::cout << "====================================================="; gotoxy(30, 22); color(7); std::cout << " 等級越高,方塊下落的速度越快,加油吧! "; gotoxy(30, 24); color(9); std::cout << " 請輸入游戲等級(1-3): "; gotoxy(70, 24); std::cin >> game_lv; system("cls"); color(7); } void game_interdace::HideCursor() { CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(4); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle, &cursor); } int game_interdace::color(int c) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); return 0; } void game_interdace::gotoxy(int x, int y) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void game_interdace::gotoprintf(int x, int y) { gotoxy(x, y); printf("■"); } void game_interdace::gotoclear(int x, int y) { gotoxy(x, y); printf(" ");//"■"為兩個字符,所以要覆蓋兩個字符 } void game_interdace::map() { int x, y;//邊框打印 for (x = 0; x < 47; x +=2)//從第0列開始到第52列,兩個字符一個"■",一共27個”■“ { gotoprintf(x, 0); gotoprintf(x, 26); } for (y = 0; y < 27; y++)//從第0行開始到第26行 { gotoprintf(0, y); gotoprintf(32, y); gotoprintf(46, y); }//x兩格為一個前進坐標單位,y一格為一個前進單位 } bool game_interdace::end_map() { char isno{}; system("cls"); gotoprintf(14, 6); std::cout << "游戲結束\n"; std::cout << " 輸入【y】鍵繼續游戲\n"; std::cout << " 輸入【n】鍵結束游戲\n"; gotoxy(17, 10); std::cin >> isno; if (isno =='y') { return true; } else { return false; } } int Graphic::random() { srand((int)time(NULL)); int number = rand()%15; return number; } void Graphic::produce_graph(int location_x, int location_y,int id) { int X, Y; for (int i = 0; i < 4; i++) { X = location_x + graph[id][i * 2]; Y = location_y + graph[id][i * 2 + 1]; interdace.gotoprintf(X, Y); } } void Graphic::clear_graph(int location_x, int location_y,int id) { int X, Y; interdace.color(random()%15+1); //使下落過程中顏色隨機變化(有黑色的) for (int i = 0; i < 4; i++) { X = location_x + graph[id][i * 2]; Y = location_y + graph[id][i * 2 + 1]; interdace.gotoclear(X, Y ); } } void Graphic::graph_moving()//按鍵后,如果符號要求就消除舊圖形,打印新圖形 { int sign{}, sleep{ 400 }; graph_id = random(); next_graph_id = random(); produce_graph(36, 3, next_graph_id); while (true) { sign = 0; interdace.gotoxy(35, 9); std::cout << "游戲分數:"; interdace.gotoxy(39, 11); std::cout << interdace.grade * 10; if (_kbhit()) { sign = _getch(); } clear_graph(location_x, location_y, graph_id); switch (sign) { case 119: //如果按下'w'鍵, location_y += 1; if (graph_no_moving(location_x, location_y, graph_change(graph_id))) { location_y -= 1; break; } graph_id = graph_change(graph_id); break; case 115: //如果按下s'鍵 sleep = 50; location_y += 1; break; case 97: //如果按下a'鍵 location_x -= 2; location_y += 1; if (graph_no_moving(location_x, location_y, graph_id) ) { location_x += 2; location_y -= 1; } break; case 100: //如果按下'd'鍵 location_x += 2; location_y += 1; if (graph_no_moving(location_x, location_y, graph_id) ) { location_x -= 2; location_y -= 1; } break; default: location_y += 1; break; } produce_graph(location_x, location_y, graph_id); //按鍵結束后,打印新圖形 Sleep(sleep); sleep = (4- interdace.game_lv)*100; graph_stop();//如果符合停止要求就停止 if (game_end()) { break; } } } bool Graphic::graph_no_moving(int location_x, int location_y,int id) { for (int i = 0; i < 4; i++) { int X, Y; X = location_x + graph[id][i * 2]; Y = location_y + graph[id][i * 2 + 1]; if (location_x < 2 || graph_active_pos[X][Y] == 1 || location_x+ (graph_with[id]-1)*2 >30) { return true; } else return false; } return 0;//防止出現該路徑沒有返回值 } int Graphic::graph_change(int id) { switch (id) { case 0: id = 0; break; //方形 case 1: id = 2; break;//|_ case 2: id = 1; break;// | case 3: id = 4; break;// case 4: id = 3; break; case 5: id = 6; break;//條形 case 6: id = 5; break; case 7: id = 8; break;//T形 case 8: id = 9; break; case 9: id = 10; break; case 10: id = 7; break; case 11: id = 12; break;//L形 case 12: id = 13; break; case 13: id = 14; break; case 14: id = 11; break; default: break; } return id; } void Graphic::graph_stop() { int X{}, Y{}; for (int i = 0; i < 4; i++) { X = location_x + graph[graph_id][i * 2]; Y = location_y + graph[graph_id][i * 2 + 1]; if (graph_active_pos[X][Y+1] == 1||Y>=25) { for (int i = 0; i < 4; i++) { X = location_x + graph[graph_id][i * 2]; Y = location_y + graph[graph_id][i * 2 + 1]; graph_active_pos[X][Y] = 1; } if (stop_tgraph_top >location_y) { stop_tgraph_top = location_y; } graph_disppear(location_y, Y); location_x = 14;//初始化初始坐標 location_y = 1; clear_graph(36, 3, next_graph_id);//清除圖形預覽 graph_id = next_graph_id; next_graph_id = random(); produce_graph(36, 3, next_graph_id);//生成新的圖形預覽 produce_graph(location_x, location_y, graph_id);//打印新的初始圖形 } } } void Graphic::graph_disppear(int location_y,int Y) { int count{ 0 }; bool isno{ false }; for (int line = location_y + graph[graph_id][7] ; line > location_y; line--) { count = 0; isno = false; for (int column = 2; column < 32; column +=2) { if (graph_active_pos[column][line]==1) { count++; if (count==15) { count = 0; interdace.grade++; isno = true; } } if (isno) { for (int ls = 2; ls < 32; ls+=2) { for (int i = line; i >= stop_tgraph_top; i--) { if (graph_active_pos[ls][i]) { interdace.gotoclear(ls, i); } graph_active_pos[ls][i] = graph_active_pos[ls][i - 1]; if (graph_active_pos[ls][i]) { interdace.gotoprintf(ls, i); } } } } } } } bool Graphic::game_end() { if (stop_tgraph_top <=1)return true; else return false; }
關于利用C++寫一個俄羅斯方塊游戲就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。