C語言工程文件該如何寫(以三子棋游戲為例)
1.工程上(作為程序員應如何寫代碼)
1.1 新手如何寫代碼
我們知道在進行C語言文件的編寫時,我們通常只在一個文件中進行,從頭寫到尾
如下圖所示
這種方式寫代碼適用于初學者,實際上在程序員的工作中并不這樣寫代碼,這樣既不利于員工之間的合作,也不利于將代碼作為產(chǎn)品進行出售。
1.2 程序員如何寫代碼
工程上寫代碼應分為多個文件,如:
主文件.c 自定義函數(shù).c 頭文件.h 具體如下圖所示
此圖為三子棋游戲的代碼
我們可以看到圖中分為三部分,首先主函數(shù)部分game.c 其次是自定義函數(shù)部分 game_my_function.c 以及頭文件部分game.h
為什么要分開,而不像一開始學的那樣在一起寫呢?①多人協(xié)作,在工作中我們要面對的是一個龐大的工程,每個人要負責各自的模塊,如果放在一個.c文件中,那么只有等一個人寫完自己的部分,下一個人才能開始工作,這顯然不符合工作常理。分開寫能夠提高工作效率,在各個模塊完成之后組合起來即可。
②代碼保護,在程序員寫完自己的自定義函數(shù)而不想讓別人知道自己是如何寫的,便可以將自己寫的自定函數(shù)編譯成一個庫文件,這樣別人再打開庫文件時就是一堆亂碼。這是,只需要將頭文件提供給別人,別人依然可以使用此代碼。下圖所示為轉(zhuǎn)為庫文件的方法??梢钥吹綆煳募閬y碼。
2.三子棋游戲代碼示例
我們先列出一個思維導圖,分析這個程序需要什么,有哪些情況,這樣我們才會很好地完成這個程序哦
1.菜單界面選擇開始游戲或者退出游戲。
2.創(chuàng)建棋盤并初始化。
3.打印棋盤。
4.玩家落子(玩家輸入行列坐標的方式來落子),'*’表示玩家落子。
5.電腦落子(隨機位置落子) ,'#’表示電腦落子。
6.判定勝負關系(輸,贏,平局(棋盤滿了))。
7.判定勝負關系。
8.如未結(jié)束,回到 步驟2 繼續(xù)執(zhí)行。
2.1 打印菜單
void menu() { printf("---------------------------------------------------\n"); printf("---------------------------------------------------\n"); printf("--------------- 1.開始游戲 ------------------\n"); printf("--------------- 2.退出游戲 ------------------\n"); printf("---------------------------------------------------\n"); printf("---------------------------------------------------\n"); }
2.2 創(chuàng)建棋盤并初始化。+2.3打印棋盤
void star_arr(char arr[Line][Column], int line, int column) { int i = 0; int j = 0; for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { arr[i][j] = ' '; } } } void Display_arr(char arr[Line][Column], int line, int column) { int i = 0; int j = 0; for (i = 0; i < line; i++) { int j = 0; for(j=0;j<column;j++) { printf(" %c ", arr[i][j]); if (j < column - 1) printf("|"); } printf("\n");//走三輪,占3行 if (i < line - 1) { int j = 0; for (j = 0; j < column; j++) { printf("---"); if (j < column - 1) printf("|"); } } printf("\n");//走兩輪,最后i=2時,不進入,一共5行 } }
2.4玩家落子(玩家輸入行列坐標的方式來落子),'*’表示玩家落子。
void player(char arr[Line][Column], int line, int column) { int x = 0; int y = 0; while (1) { printf("玩家請下棋\n"); printf("請輸入下棋的坐標:"); scanf("%d %d", &x, &y); if (x > 0 && x <= line && y>0 && y <= column) { if (arr[x - 1][y - 1] == ' ') { arr[x - 1][y - 1] = '*'; break; } else { printf("該位置已有棋,請選擇其他位置\n"); } } else { printf("輸入坐標不合理,請重新輸入\n"); } } }
2.5電腦落子(隨機位置落子) ,'$’表示電腦落子。
void computer(char arr[Line][Column], int line, int column) { printf("電腦已下棋:\n"); int x = 0; int y = 0; while (1) { x = rand() % line; y = rand() % column; if (arr[x][y] == ' ') { arr[x][y] = '$'; break; } } }
2.6判定勝負關系(輸,贏,平局(棋盤滿了))
//玩家贏 * //電腦贏 $ //平局 O //繼續(xù) C char why_win(char arr[Line][Column], int line, int column) { int i = 0; for (i = 0; i < line; i++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') { return arr[i][0]; } } for (i = 0; i < column; i++) { if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i] != ' ') { return arr[2][i]; } } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ') { return arr[0][0]; } if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ') { return arr[1][1]; } if (chess_full(arr, line, column)) { return 'O'; } return 'C'; }
以上為思路牽引,完整代碼如下,分為三個部分
1.頭文件
#pragma once #include <stdio.h> #define Line 3 #define Column 3 void star_arr(char arr[Line][Column],int line,int column); void Display_arr(char arr[Line][Column], int line, int column); void player(char arr[Line][Column], int line, int column); void computer(char arr[Line][Column], int line, int column); #include <time.h> #include <stdlib.h> char why_win(char arr[Line][Column], int line, int column); int chess_full(char arr[Line][Column], int line, int column);
2.自定義函數(shù)文件
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void star_arr(char arr[Line][Column], int line, int column) { int i = 0; int j = 0; for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { arr[i][j] = ' '; } } } void Display_arr(char arr[Line][Column], int line, int column) { int i = 0; int j = 0; for (i = 0; i < line; i++) { int j = 0; for(j=0;j<column;j++) { printf(" %c ", arr[i][j]); if (j < column - 1) printf("|"); } printf("\n");//走三輪,占3行 if (i < line - 1) { int j = 0; for (j = 0; j < column; j++) { printf("---"); if (j < column - 1) printf("|"); } } printf("\n");//走兩輪,最后i=2時,不進入,一共5行 } } void player(char arr[Line][Column], int line, int column) { int x = 0; int y = 0; while (1) { printf("玩家請下棋\n"); printf("請輸入下棋的坐標:"); scanf("%d %d", &x, &y); if (x > 0 && x <= line && y>0 && y <= column) { if (arr[x - 1][y - 1] == ' ') { arr[x - 1][y - 1] = '*'; break; } else { printf("該位置已有棋,請選擇其他位置\n"); } } else { printf("輸入坐標不合理,請重新輸入\n"); } } } void computer(char arr[Line][Column], int line, int column) { printf("電腦已下棋:\n"); int x = 0; int y = 0; while (1) { x = rand() % line; y = rand() % column; if (arr[x][y] == ' ') { arr[x][y] = '$'; break; } } } int chess_full(char arr[Line][Column], int line, int column) { int i = 0; int j = 0; for (i = 0; i < line; i++) { for (j = 0; j < column; j++) { if (arr[i][j] == ' ') return 0; } } return 1; } //玩家贏 * //電腦贏 $ //平局 O //繼續(xù) C char why_win(char arr[Line][Column], int line, int column) { int i = 0; for (i = 0; i < line; i++) { if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ') { return arr[i][0]; } } for (i = 0; i < column; i++) { if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[2][i] != ' ') { return arr[2][i]; } } if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ') { return arr[0][0]; } if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ') { return arr[1][1]; } if (chess_full(arr, line, column)) { return 'O'; } return 'C'; }
3.主函數(shù)文件
#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("---------------------------------------------------\n"); printf("---------------------------------------------------\n"); printf("--------------- 1.開始游戲 ------------------\n"); printf("--------------- 2.退出游戲 ------------------\n"); printf("---------------------------------------------------\n"); printf("---------------------------------------------------\n"); } void game() { char ret = 0; char arr[Line][Column]; star_arr(arr, Line, Column); Display_arr(arr, Line, Column); while ( 1 ) { player(arr, Line, Column); Display_arr(arr, Line, Column); ret=why_win (arr, Line, Column); if (ret != 'C') { break; } computer(arr, Line, Column); Display_arr(arr, Line, Column); ret = why_win(arr, Line, Column); if (ret != 'C') { break; } } if (ret == '*') { printf("恭喜你戰(zhàn)勝了電腦\n"); } else if (ret == '$') { printf("很遺憾你輸給了電腦\n"); } else if (ret == 'O') { printf("游戲平局\n"); } } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); scanf("%d", &input); switch(input) { case 1: printf("請準備好,游戲即將開始\n"); game(); break; case 2: printf("已退出游戲\n"); input = 0; break; default: printf("輸入錯誤,請重新輸入\n"); } } while (input); return 0; }
只需將以上三個文件代碼組合在一個工程即可進行三子棋游戲,同時也希望學習者們這樣寫代碼,為以后成為打工人做鋪墊。
到此這篇關于C語言工程文件該如何寫(以三子棋游戲為例)的文章就介紹到這了,更多相關C語言工程文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法
這篇文章主要介紹了C++不使用變量求字符串長度strlen函數(shù)的實現(xiàn)方法,實例分析了strlen函數(shù)的實現(xiàn)原理與不使用變量求字符串長度的實現(xiàn)技巧,需要的朋友可以參考下2015-06-06C/C++寬窄字符轉(zhuǎn)換與輸出的多種實現(xiàn)方法
本文主要介紹了C/C++寬窄字符轉(zhuǎn)換與輸出的多種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù)
這篇文章主要介紹了你真的理解C語言qsort函數(shù)嗎?帶你深度剖析qsort函數(shù),本篇將引入一個庫函數(shù)來實現(xiàn)我們希望的順序,結(jié)合示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-02-02