目錄
1.設計簡單選單
2.創建棋盤
3.下棋程序的實作
3.1玩家下棋
3.2電腦下棋
3.3判斷輸贏
4.游戲原始碼
三子棋是黑白棋的一種,三子棋是一種民間傳統游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等,將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,但是,有很多時候會出現和棋的情況,
1.設計簡單選單
相信大家在玩游戲時會發現,進入游戲前會有選單拱你選擇,你可以選擇你想要的模式,三子棋也是同樣的,
void menu()
{
printf("******************************\n");
printf("********* 0.play *********\n");
printf("********* 1.exit *********\n");
printf("******************************\n");
}
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("請選擇:\n");
scanf("%d", &input);
switch (input)
{
case 0: game(); break;//game()函式是后續用來實作游戲程序的一個函式
case 1:printf("退出游戲\n"); break;
default:printf("選擇錯誤,請重新選擇\n"); break;
}
} while (input);//while(input)相當于while(input!=0)只要沒進入游戲就會一直回圈到進入為止
return 0;
}
2.創建棋盤
在C語言中我們把下棋的棋子存在二維陣列里
char board[ROW][COL];
在下棋前,我們應該保證棋盤上是沒有棋子的,所以我們得先初始化棋盤,
void InitBoard(char board[ROW][COL], int row, int col)
{
int i, j;
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, j;
//列印棋盤
for (i = 0; i < row; i++)
{
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");
}
}
這樣一個簡易的棋盤就列印出來了,(確實簡易)
3.下棋程序的實作
3.1玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
printf("玩家走:>\n");
int x, y;
while (1)
{
printf("請輸入坐標:>\n");
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("坐標被占用,請重新輸入\n");
}
}
else
{
printf("坐標非法,超出范圍\n");
}
}
}
3.2電腦下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("電腦走:>\n");
while (1)
{
int x = rand() % row;//0~2 注意放在回圈里,保證每一次進來都會產生一個亂數
int y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
電腦下棋我就要在這邊說明一下了,電腦是通過產生亂數來進行下棋的,那這個亂數怎么產生呢?C語言作為歷史比較久的一門語言,早期并沒有設計出太多函式,像現在的Python是自帶有隨機函式的,直接呼叫就可以產生隨機值的,而C語言實作亂數的方式就是時間戳,
那什么是時間戳呢?
時間戳是從1970年1月1日(UTC/GMT的午夜)開始到現在所經過的秒數,
當你單獨使用rand函式的時候你會發現產生的數確實是隨機的,但這個隨機是偽隨機,即每次隨機都是一樣的數,而當你用了時間戳就能實作真正的隨機,因為時間是時時刻刻在發生變化的,
那應該怎么使用呢?
首先在主函式里你需要這樣
srand((unsigned)time(NULL));
這樣你的rand函式就變成了真正的隨機函式了,這邊要注意一點,rand函式一定要放在回圈里,保證每次回圈都能產生一個亂數,若放在回圈外面,則每進一次函式才會產生一次隨機值,
到這里整個游戲的實作就圓滿完成了,

真以為這就結束了?想想也沒毛病,選單也設計了,棋盤也列印了,玩家和電腦也實作了,還有什么嗎?

想不到吧,游戲輸贏你還沒判斷吧,
3.3判斷輸贏
在判斷游戲輸贏前還有一個小細節,我們玩家和電腦在下棋時如果棋盤上有子是不是不能下,所以還需要一個判斷棋盤是否滿了的函式,
int IsFull(char board[ROW][COL], int row, int col)
{
int i, j;
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, j;
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 (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[0][0] != ' ')
return board[0][0];
else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
return board[0][2];
//平局
if (IsFull(board, ROW, COL))
return 'd';
//游戲繼續
return 't';
}
到這里整個游戲的邏輯就完美了,(別慌,這次是真的結束了,沒有騙你們)

接下來附上整個游戲的原始碼
4.游戲原始碼
test.c檔案
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
//三子棋的程序
char board[ROW][COL];
//初始化棋盤
InitBoard(board, ROW, COL);
//列印棋盤
DisplayBoard(board, ROW, COL);
//下棋
char ret = IsWin(board, ROW, COL);
while (1)
{
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);//列印棋盤
ret = IsWin(board, ROW, COL);
if (ret != 't')
break;
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 't')
break;
}
if (ret == 'd')
printf("平局");
else if (ret == '*')
printf("玩家贏");
else if (ret == '*')
printf("電腦贏");
}
void menu()
{
printf("******************************\n");
printf("********* 0.play *********\n");
printf("********* 1.exit *********\n");
printf("******************************\n");
}
int main()
{
srand((unsigned)time(NULL));
int input = 0;
do
{
menu();
printf("請選擇:\n");
scanf("%d", &input);
switch (input)
{
case 0: game(); break;
case 1:printf("退出游戲\n"); break;
default:printf("選擇錯誤,請重新選擇\n"); break;
}
} while (input);
return 0;
}
game.c檔案
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i, j;
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, j;
//列印棋盤
for (i = 0; i < row; i++)
{
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)
{
printf("玩家走:>\n");
int x, y;
while (1)
{
printf("請輸入坐標:>\n");
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("坐標被占用,請重新輸入\n");
}
}
else
{
printf("坐標非法,超出范圍\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("電腦走:>\n");
while (1)
{
int x = rand() % row;//0~2 注意放在回圈里,保證每一次進來都會產生一個亂數
int y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(char board[ROW][COL], int row, int col)
{
int i, j;
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, j;
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 (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[0][0] != ' ')
return board[0][0];
else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
return board[0][2];
//平局
if (IsFull(board, ROW, COL))
return 'd';
//游戲繼續
return 't';
}
game.h
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define COL 3
//初始化棋盤
void InitBoard(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);
//判斷輸贏
char IsWin(char board[ROW][COL], int row, int col);
這樣的文章你還不趕緊 點贊收藏+關注作者!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293264.html
標籤:其他
上一篇:【Unity 資源分享】?? | Unity 超好看的 精品四季蔚藍自然場景模型 ,讓我們離二次元開發更近一步!
