C語言版三子棋游戲
很多人從小都玩過三子棋,相信很多人都對這個游戲的實現(xiàn)有所疑問。那么今天我們就用C語言自己來實現(xiàn)一下。
首先 如流程圖所示:

說明一下:首先我們以輸入1/0,來判斷是否進(jìn)入游戲。當(dāng)輸入為1時,進(jìn)入游戲;當(dāng)輸入為0時,退出游戲;當(dāng)輸入為其他值時,我們提示重新輸入。所以我們這里用switch實現(xiàn)。
我們回想棋盤,很像一個二維數(shù)組,所以我們接下里的數(shù)棋盤設(shè)計以及向棋盤里賦值都將使用二維數(shù)組。為了使得我們的擴(kuò)展性變強(qiáng),我們這里使用了宏,來定義行和列的值。
為了將來的判段,我們將棋盤里所以的值都賦值為' ',即棋盤的初始化,這里我們用IntBoard()函數(shù)實現(xiàn)。接下里我們將實現(xiàn)棋盤。

我們觀察可以想象,第一行放數(shù)據(jù),第二行則為分界線,第三行放數(shù)據(jù),第四行為分界線,第五行放數(shù)據(jù),第六行我們將其不打印。同理可以設(shè)計出列,我們由DisplayBoard()函數(shù)實現(xiàn)。
接下來為下棋環(huán)節(jié),這是一個循環(huán)過程,我們將使用while()循環(huán)來實現(xiàn),由判斷輸贏的IsWin()函數(shù)來控制 while()循環(huán)的繼續(xù)和結(jié)束 。
玩家下棋過程中,由鍵盤輸入坐標(biāo),輸入之后我們得首先判斷輸入的坐標(biāo)是否超過了棋盤的范圍,如果合法,其次判斷輸入坐標(biāo)處是否為空,若為空則可以落子,否之打印提示語句并重新輸入,若不合法,則提示并重新輸入。
在玩家落子后我們首先要去判斷是否產(chǎn)生了輸贏,如果產(chǎn)生了輸贏平局,我們將結(jié)束游戲,如果均沒有產(chǎn)生的話我們會返回一個‘C',來繼續(xù)游戲,我們用IsWin()函數(shù)來實現(xiàn)。
電腦下棋,我們可以使用rand()函數(shù),由于我們生成的數(shù)字必須在棋盤范圍內(nèi),所以我們將其模上我們定義的行或列,這樣可以保證電腦輸入的有效性。其次我們和玩家一樣要判斷電腦落子處是否為空,為空才可以落子。
同理 ,電腦落子后,也應(yīng)該使用IsWin()函數(shù)來判斷輸贏情況。
大致的游戲設(shè)計就是這樣,接下來我們用代碼實現(xiàn),此次我們的實現(xiàn)分為test.c game.h game.c 來分別實現(xiàn),其中 test.c 為主體,game.c為函數(shù)的定義,game.h為函數(shù)的聲明。
此處為test.c的內(nèi)容:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//三子棋測試
void menu()
{
printf("1,play 0.exit");
}
void game() {
char ret = 0;
char board[ROW][COL] = { 0 };
//初始化
IntBoard(board, ROW, COL);
Displayboard(board, ROW, COL);
//玩家下棋
while (1) {
PlayerMove(board, ROW, COL);
Displayboard(board, ROW, COL);
//判斷玩家是否贏
ret = IsWin(board, ROW, COL);
if (ret != 'C') {
break;
}
ComputerMove(board, ROW, COL);
Displayboard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C') {
break;
}
}
if (ret == '*')
printf("玩家贏\n");
else if (ret == "#")
printf("電腦贏\n");
else
printf("平局\n");
}
void test() {
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("請選擇:>\n");
scanf("%d", &input);
switch (input) {
case 1:
printf("三子棋\n");
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入有誤,請重新輸入\n");
break;
}
} while (input);
}
int main() {
test();
return 0;
}
game.c:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void IntBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
board[i][j] = ' ';
}
}
}
void Displayboard(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");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
void PlayerMove(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
printf("玩家走");
while (1) {
printf("請輸入坐標(biāo)");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("該坐標(biāo)被占用\n");
}
}
else
printf("輸入有誤其重新輸入\n");
}
}
void ComputerMove(char board[ROW][COL], int row, int col) {
int x = 0;
int y = 0;
printf("電腦開始下棋\n");
while (1) {
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
}
//返回1 表示棋盤滿了
//返回0 表示棋盤沒滿;
int isFULL(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
char IsWin(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];
}
}
//判斷每列是否相等
for (i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board != ' ')
return board[0][0];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
//判斷是否平局
if (isFULL(board, ROW, COL) == 1) {
return 'Q';
}
return 'C';
}
game.h:
#pragma once #define _CRT_SECURE_NO_WARNINGS 1 #define ROW 3 #define COL 3 #include<stdio.h> #include<time.h> #include<stdlib.h> void IntBoard(char board[ROW][COL], int row, int col); void Displayboard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); //玩家贏“*” //電腦贏返回“#” //平局“Q” //繼續(xù)返回“C” char IsWin(char board[ROW][COL], int row, int col);
實現(xiàn)結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

