這是本人用C語言實作的三子棋:

利用C語言實作三子棋,首先你的C語言技術要達到會使用二維陣列,
我在實作三子棋的代碼中創建了三個檔案:game.h(頭檔案) game.c(游戲函式) main.c(主函式),
我們寫代碼都是從主函式開始的,game.h(頭檔案)是我們用來函式宣告和宏定義的地方,這樣game.c和main.c都可以用到宏定義的東西和宣告的函式,
下面是game.h中的內容:
//這里我們創建了一個頭檔案-game.h 頭檔案里面放我們將要用函式宣告,
#include <stdio.h>//scanf和printf這兩個庫函式的頭檔案包含,
#include <time.h>//time()庫函式但頭檔案包含,
#include <stdlib.h>//rand()和srand()庫函式但頭檔案包含,
#define HANG 3//宏定義的二維陣列‘行’為 3.
#define LIE 3//宏定義的二維陣列‘列’為 3.
void caidan();//自定義的選單函式的宣告,
void xuanzhe();//自定義游戲選擇函式宣告,
void game();//自定義游戲函式的宣告,
void chushihua(char arr[HANG][LIE]);//自定義初始化二維陣列函式宣告,
void print(char arr[HANG][LIE]);//自定義列印棋盤函式的宣告,
void wanjia(char arr[HANG][LIE]);//自定義玩家下棋函式的宣告,
void dianniao(char arr[HANG][LIE]);//自定義電腦下棋函式的宣告,
char panduan(char arr[HANG][LIE]);//判斷誰贏函式的宣告,
int pingju(char arr[HANG][LIE]);//判斷平局函式的宣告,
這main.c中的內容,下面看不懂的函式在上面已經注釋過了,
#include "game.h"//用頭檔案(game.h)時需要進行宣告,
//本人個人認為將主函式main()放在開頭便于閱讀,這樣需要在主函式前面進行函式宣告,
//但是我在頭檔案(game.h)中已進行函式宣告,我這用了#include "game.h",不需要再宣告了
int main()
{
caidan();
return 0;
}
void caidan()
{
printf("*************************\n");
printf("*************************\n");
printf("*******1. 玩游戲 *******\n");
printf("*******2.不玩游戲 *******\n");
printf("*************************\n");
printf("*************************\n");
xuanzhe();
}
void xuanzhe()
{
printf("請輸入:");
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 2:
printf("游戲結束\n");
break;
default:
printf("輸入錯誤,請重新輸入!\n");
xuanzhe();//選擇函式的呼叫,
break;
}
}
void game()
{
char arr[HANG][LIE] = { 0 };// rand()是生成亂數的函式
srand((unsigned int)time(NULL));//rand()函式在用之前需要呼叫srand()函式
chushihua(arr);//srand()的括號中必須是無符號整形而且是可變的
print(arr);//time(NULL)可以產生可變的無符號整形,這樣rand()產生的亂數才是可變的
while (1)
{
wanjia(arr);
print(arr);
if (panduan(arr) != 'c')//panduan()會回傳'c' 'p' '#' '*'
break;//'c'表示繼續 'p'表示平局
dianniao(arr);
print(arr);
if (panduan(arr) != 'c')
break;
}
if (panduan(arr) == '#')
printf("玩家勝利!\n");
else if (panduan(arr) == '*')
printf("電腦勝利!\n");
else
printf("平局!\n");
caidan();
}
下面是game.c中的內容:
#include "game.h"
void chushihua(char arr[HANG][LIE])//將二維陣列全部初始化為空格
{
int i = 0;
int j = 0;
for (i = 0; i < HANG; i++)
{
for (j = 0; j < LIE; j++)
{
arr[i][j] = ' ';
}
}
}
void print(char arr[HANG][LIE])//列印棋盤
{
int i = 0;
int j = 0;
for (i = 0; i < HANG; i++)
{
for (j = 0; j < LIE; j++)
{
printf(" %c ", arr[i][j]);
if (j < LIE - 1)
printf("|");
}
printf("\n");
if (i < HANG - 1)
{
for (j = 0; j < LIE; j++)
{
printf("---");
if (j < LIE - 1)
printf("|");
}
}
printf("\n");
}
}
void wanjia(char arr[HANG][LIE])
{
int x = 0;
int y = 0;
printf("玩家下棋:");
while (1)
{
scanf("%d %d", &x, &y);
if (x > 0 && x <= HANG && y > 0 && y <= LIE)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '#';
break;
}
else
{
printf("\n該棋格以被占用,請重新輸入:");
}
}
else
{
printf("\n輸入錯誤,請重新輸入: ");
}
}
}
void dianniao(char arr[HANG][LIE])
{
printf("電腦下棋:\n");
while (1)
{
int x = rand() % HANG;//rand()是生成亂數的函式
int y = rand() % LIE;//給rand()%3生成只有0 1 2的亂數
if (arr[x][y] == ' ')
{
arr[x][y] = '*';
break;
}
}
}
char panduan(char arr[HANG][LIE])
{
int x = 0;
int y = 0;
for (x = 0; x < HANG; x++)
{
if (arr[x][0] == arr[x][1] && arr[x][1] == arr[x][2] && arr[x][2] != ' ')
{
return arr[x][0];
break;
}
}
for (y = 0; y < LIE; y++)
{
if (arr[0][y] == arr[1][y] && arr[1][y] == arr[2][y] && arr[2][y] != ' ')
{
return arr[0][y];
break;
}
}
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] != ' ')
return arr[0][0];
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] != ' ')
return arr[0][2];
if (1 == pingju(arr))
return 'p';
return 'c';
}
int pingju(char arr[HANG][LIE])
{
int x = 0;
int y = 0;
for (x = 0; x < HANG; x++)
{
for (y = 0; y < LIE; y++)
{
if (arr[x][y] == ' ')
return 0;
}
}
return 1;
}
在看的程序中一定要結合代碼中的注釋一起看,不懂得地方可以私信本人!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357249.html
標籤:其他
上一篇:機械硬碟與固態硬碟
