C語(yǔ)言工程文件該如何寫(以三子棋游戲?yàn)槔?
1.工程上(作為程序員應(yīng)如何寫代碼)
1.1 新手如何寫代碼
我們知道在進(jìn)行C語(yǔ)言文件的編寫時(shí),我們通常只在一個(gè)文件中進(jìn)行,從頭寫到尾
如下圖所示

這種方式寫代碼適用于初學(xué)者,實(shí)際上在程序員的工作中并不這樣寫代碼,這樣既不利于員工之間的合作,也不利于將代碼作為產(chǎn)品進(jìn)行出售。
1.2 程序員如何寫代碼
工程上寫代碼應(yīng)分為多個(gè)文件,如:
主文件.c 自定義函數(shù).c 頭文件.h 具體如下圖所示

此圖為三子棋游戲的代碼
我們可以看到圖中分為三部分,首先主函數(shù)部分game.c 其次是自定義函數(shù)部分 game_my_function.c 以及頭文件部分game.h
為什么要分開(kāi),而不像一開(kāi)始學(xué)的那樣在一起寫呢?①多人協(xié)作,在工作中我們要面對(duì)的是一個(gè)龐大的工程,每個(gè)人要負(fù)責(zé)各自的模塊,如果放在一個(gè).c文件中,那么只有等一個(gè)人寫完自己的部分,下一個(gè)人才能開(kāi)始工作,這顯然不符合工作常理。分開(kāi)寫能夠提高工作效率,在各個(gè)模塊完成之后組合起來(lái)即可。
②代碼保護(hù),在程序員寫完自己的自定義函數(shù)而不想讓別人知道自己是如何寫的,便可以將自己寫的自定函數(shù)編譯成一個(gè)庫(kù)文件,這樣別人再打開(kāi)庫(kù)文件時(shí)就是一堆亂碼。這是,只需要將頭文件提供給別人,別人依然可以使用此代碼。下圖所示為轉(zhuǎn)為庫(kù)文件的方法??梢钥吹綆?kù)文件為亂碼。



2.三子棋游戲代碼示例
我們先列出一個(gè)思維導(dǎo)圖,分析這個(gè)程序需要什么,有哪些情況,這樣我們才會(huì)很好地完成這個(gè)程序哦
1.菜單界面選擇開(kāi)始游戲或者退出游戲。
2.創(chuàng)建棋盤并初始化。
3.打印棋盤。
4.玩家落子(玩家輸入行列坐標(biāo)的方式來(lái)落子),'*’表示玩家落子。
5.電腦落子(隨機(jī)位置落子) ,'#’表示電腦落子。
6.判定勝負(fù)關(guān)系(輸,贏,平局(棋盤滿了))。
7.判定勝負(fù)關(guān)系。
8.如未結(jié)束,回到 步驟2 繼續(xù)執(zhí)行。
2.1 打印菜單
void menu()
{
printf("---------------------------------------------------\n");
printf("---------------------------------------------------\n");
printf("--------------- 1.開(kāi)始游戲 ------------------\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時(shí),不進(jìn)入,一共5行
}
}2.4玩家落子(玩家輸入行列坐標(biāo)的方式來(lái)落子),'*’表示玩家落子。
void player(char arr[Line][Column], int line, int column)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家請(qǐng)下棋\n");
printf("請(qǐng)輸入下棋的坐標(biāo):");
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("該位置已有棋,請(qǐng)選擇其他位置\n");
}
}
else
{
printf("輸入坐標(biāo)不合理,請(qǐng)重新輸入\n");
}
}
}2.5電腦落子(隨機(jī)位置落子) ,'$’表示電腦落子。
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判定勝負(fù)關(guān)系(輸,贏,平局(棋盤滿了))
//玩家贏 *
//電腦贏 $
//平局 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';
}以上為思路牽引,完整代碼如下,分為三個(gè)部分
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時(shí),不進(jìn)入,一共5行
}
}
void player(char arr[Line][Column], int line, int column)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家請(qǐng)下棋\n");
printf("請(qǐng)輸入下棋的坐標(biāo):");
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("該位置已有棋,請(qǐng)選擇其他位置\n");
}
}
else
{
printf("輸入坐標(biāo)不合理,請(qǐng)重新輸入\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.開(kāi)始游戲 ------------------\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("請(qǐng)準(zhǔn)備好,游戲即將開(kāi)始\n");
game();
break;
case 2:
printf("已退出游戲\n");
input = 0;
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入\n");
}
} while (input);
return 0;
}只需將以上三個(gè)文件代碼組合在一個(gè)工程即可進(jìn)行三子棋游戲,同時(shí)也希望學(xué)習(xí)者們這樣寫代碼,為以后成為打工人做鋪墊。
到此這篇關(guān)于C語(yǔ)言工程文件該如何寫(以三子棋游戲?yàn)槔?的文章就介紹到這了,更多相關(guān)C語(yǔ)言工程文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++之初識(shí)多態(tài)(Visual Studio 2019)的使用
文章主要解釋了C++中的多態(tài)概念、實(shí)現(xiàn)細(xì)節(jié)及一些相關(guān)特性,如虛函數(shù)、override和final關(guān)鍵字、純虛函數(shù)和抽象類,通過(guò)代碼示例展示了多態(tài)原理,包括虛函數(shù)表和動(dòng)態(tài)綁定的概念,并探討了多繼承下虛函數(shù)表的行為2026-04-04
c語(yǔ)言中abs()和fabs()的區(qū)別點(diǎn)整理
在本篇文章里小編給大家分享的是關(guān)于c語(yǔ)言abs()和fabs()的區(qū)別,有需要的朋友們可以參考學(xué)習(xí)下。2020-02-02
結(jié)構(gòu)體類型數(shù)據(jù)作為函數(shù)參數(shù)(三種方法)
將一個(gè)結(jié)構(gòu)體中變量中的數(shù)據(jù)傳遞給另一個(gè)函數(shù),有以下三種方法。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
VSCODE+cmake配置C++開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)步驟
這篇文章主要介紹了VSCODE+cmake配置C++開(kāi)發(fā)環(huán)境的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
C++工廠方法之對(duì)象創(chuàng)建型模式詳解
這篇文章主要為大家詳細(xì)介紹了C++對(duì)象創(chuàng)建型模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03
C語(yǔ)言實(shí)現(xiàn)flappy bird游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)flappy bird小游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
C語(yǔ)言?struct結(jié)構(gòu)體超詳細(xì)講解
C語(yǔ)言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04

