相信有許多盆友喜歡玩游戲吧,有沒有想過自己用代碼實作一個游戲呢?
今天,就由我來帶大家簡單實作并講解一下經典游戲《三子棋》吧!
可別怪我啰里啰嗦哦!!!
注意:程式中有不懂的地方記得看我給你們準備的注釋哦!!!
頭檔案game.h
首先,介紹一下什么是頭檔案:
常見的像我們開頭常參考的#include<stdio.h>、#include <stdlib.h>、 #include<string.h>這些以 “.h” 結尾的就是所謂的頭檔案,更詳細點說,以上這些 #include后面用<>,也就是尖括號括起來的是庫函式的頭檔案,而像我下面所寫的這個game.h檔案,即 程式員自己創建的頭檔案,是普通頭檔案,程式員自己創建的頭檔案中常用來存放 1 . 庫函式頭檔案的參考 2 . 自定義函式的宣告, 這樣,在同一個專案的不同檔案中只要像我下面的源檔案game.c和test.c中一樣,在開頭參考 #include“game.h”,即對應的普通頭檔案就可以了,(這樣就避免了在每個源檔案中都需要重復參考庫函式頭檔案和重復宣告自定義函式了)
附:庫函式即編輯器自帶的函式,我們在應用了其頭檔案后便可按照格式來使用對應功能的函式,避免了程式員實作常用函式所做的重復無意義勞動,大大提高了編程效率,
#define _CRT_SECURE_NO_WARNINGS
//庫函式頭檔案的參考
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//define定義的識別符號常量
#define ROW 3
#define COL 3
//棋盤初始化函式的宣告
void initial_board(char board[ROW][COL], int row, int col);
//棋盤列印函式的宣告
void print_board(char board[ROW][COL],int row ,int col );
//判斷輸贏及狀態函式的宣告
char is_win(char board[ROW][COL], int row, int col);
源檔案game.c
再來介紹一下什么是源檔案:
在開發軟體的程序中,我們需要將撰寫好的代碼保存到一個檔案中,這樣代碼才不會丟失,才能夠被編譯器找到,才能最終變成可執行檔案,這種用來保存代碼的檔案就叫做源檔案,也就是說源檔案是用來存放 主程式 和 函式具體實作 的,
上面我們了解到,在頭檔案(.h)中放函式的宣告,那么在哪里真正具體的實作函式呢?沒錯,在對應的源檔案中,源檔案是可以存放函式的具體實作(即主程式中自定義函式的具體實作)的,
附:C語言的檔案都有特定的后綴,以方便被編譯器識別,被程式員理解,例如: C語言源檔案的后綴是 .c ,C語言頭檔案的后綴是 .h
#include"game.h"
//棋盤初始化函式的實作
int a = 0;
void initial_board(char board[ROW][COL], int row, int col)
{
//用for回圈給二維陣列每個元素初始化為空格
int i = 0;
for (i=0;i<row;i++)
{
int j = 0;
for (j=0;j<col;j++)
{
board[i][j] = ' ';
}
}
}
//棋盤列印函式的實作
void print_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
//列印陣列元素(也就是棋子)
printf(" %c ", board[i][j]);
//控制列印列分割線
if (j < col - 1)
{
printf("|");
}
}
//列印完一行以后換行
printf("\n");
for (j = 0; j < col; j++)
{
//控制列印分割行
if (i < row - 1)
{
printf("----");
}
}
printf("\n");
}
}
//判斷輸贏及狀態函式的實作
char is_win(char board[ROW][COL], int row, int col)
{
//判斷是否有一方贏
//行
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//斜
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') || (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' '))
{
return board[1][1];
}
//判斷是平局還是繼續
int h = 0;
//繼續
for (h = 0; h < row; h++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[h][j] == ' ')
{
return 'c';
}
}
}
//平局
return 'p';
}
源檔案test.c
如果說 頭檔案(game.h) 和 存放函式具體實作的源檔案(game.c) 是樹枝樹葉,那么 存放程式主體的源檔案 就是樹干,該源檔案中存放著程式主體,即程式的整體思路和整個程式的基本實作程序,
#include"game.h"
//列印選單函式的實作
void menu()
{
printf("**************************\n");
printf("**** 0.exit 1.play ****\n");
printf("**************************\n");
}
//game函式的實作
void game()
{
//創建陣列
char board[ROW][COL];
//初始化棋盤
initial_board(board,ROW,COL);
//列印(初始)棋盤
print_board(board, ROW, COL);
//開始下棋
while (1)
{
//玩家下棋
while (1)
{
int a = 0;
int b = 0;
printf("請輸入落子坐標,并中間用空格隔開:");
scanf("%d %d", &a, &b);
if ((a>=1&&a<=ROW)&&(b>=1&&b<=COL)&&(board[a - 1][b - 1] == ' '))
{
board[a-1][b-1] = '*';
break;
}
else
{
printf("落子不符合條件,請正確下棋");
}
}
//列印棋盤
printf("玩家下棋\n");
print_board(board, ROW, COL);
//判斷輸贏與狀態 并回傳值相應的值
char sult = is_win(board, ROW, COL);
//根據回傳值做出調整
if (sult == '*')
{
printf("玩家贏\n");
break;
}
if (sult == 'p')
{
printf("平局\n");
break;
}
else
{
;
}
//電腦下棋
while (1)
{
//產生兩個隨機值并%ROW(COL)以產生0~ROW(COL)的隨機值
int ret1 = rand() % ROW;
int ret2 = rand() % COL;
if (board[ret1][ret2] == ' ')
{
board[ret1][ret2] = '#';
break;
}
}
//列印棋盤
printf("電腦下棋\n");
print_board(board, ROW, COL);
//判斷輸贏與狀態 并回傳值相應的值
char sul = is_win(board, ROW, COL);
//根據回傳值做出調整
if (sul == '#')
{
printf("電腦贏\n");
break;
}
if (sul == 'p')
{
printf("平局\n");
}
else
{
;
}
}
}
//定義了一個全域變數n
int n = 0;
int main()
{
srand((unsigned int)time(NULL));
do
{
//呼叫選單列印函式
menu();
printf("請輸入:>");
//讓玩家根據選單做出選擇(用鍵盤輸入值)
scanf("%d", &n);
switch (n)
{
case 0:
{
printf("退出游戲\n");
break;
}
case 1:
{
printf("游戲開始:\n");
//呼叫game函式
game();
break;
}
default:
{
printf("輸入錯誤,請重新輸入\n");
break;
}
}
}while(n);
return 0;
}
最后,如果這篇文章幫到您了,可以點下贊嗎~~~
拜托了,這對我真的很重要!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280289.html
標籤:其他
