三字棋的實作和運行
三子棋
(如有不對不好的請明示!抱拳了)
先知道什么是三子棋
1.游戲獲勝的條件三行三豎或者對角線能連成三個都算贏
2.當下滿棋盤沒有實作贏家則為平局
一、應該需要什么
制作三子棋游戲需要較多的代碼所以建議用一個頭檔案和兩個源檔案來方便實作,

game.h 的作用是把需要改的值寫里面,避免后期一個一個更改;避免重復操作(定義的頭檔案,函式),只需要包含一下他,就不要在包別的頭檔案里,前提你在自定義頭檔案里已經包含過了
game.c 的檔案中來實作我們游戲的
test.c 中來制定游戲的規則和游戲的選單
二、使用步驟
1.先列印選單
用 do…while 來實作游戲可以多次的使用,再用menu函式來列印我們的選單
代碼如下(示例):
int main()
{
int improt = 0;//創建一個變數 由玩家輸入
do//do while回圈陳述句 讓你可以多次的體驗
{
menu(); //列印選單
printf("請選擇:");//讓玩家輸入
scanf("%d", &improt);
switch (improt)//選擇陳述句
{
case 1://選擇1進入游戲
game();
break;
case 0:
printf("退出游戲\n");
break;
default://第三種選擇直接報錯 只能選擇 1 0
printf("輸入錯誤,請重新輸入\n");
break;
}
}
while (improt);//反回選單選擇 1 0
return 0;
}
void menu()//游戲的選單 運行起來可以提供玩家選擇
{
printf("********************\n");
printf("****** 1. play *****\n");
printf("****** 0. exit *****\n");
printf("********************\n");
}

選單列印完畢
2.開始創建棋盤
當選擇1時進入游戲game
代碼如下(示例):
void game()
{//創建二維陣列,存盤資料
char board[ROW][COL];//參考頭檔案中定義的函式為3行3列
in_board(board, ROW, COL);//初始化棋盤行列為空格
play_board(board, ROW, COL);//列印棋盤
這里開始參考頭檔案創造的

在頭檔案用ROW COL 來定義行列的行數,在后面在用來修改行列時可以直接在頭檔案中修改,省去在代碼中一個個修改帶來的麻煩,
void game()
{///初始化棋盤的函式
void in_board(char board[ROW][COL], int row, int col);//初始化棋盤
//列印棋盤的函式
void play_board(char board[ROW][COL], int row, int col);
開始先初始化棋盤:
void in_board(char board[ROW][COL], int row, int col)//初始化棋盤為空格
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)//初始化行
{
for (b = 0; b < col; b++)//初始化列
{
board[a][b] = ' ';//初始化棋盤為空格//必須是英文單引號 才能列印空格,雙引號是0
}
}
}
再列印棋盤的樣子——行列
void play_board(char board[ROW][COL], int row, int col)//列印棋盤的樣子(九宮格)
{
int x = 0;//當做行
for (x = 0; x < row; x++)//當條件完成停止列印棋盤
{
int y = 0;//作為列
for (y = 0;y < col;y++)
{//將( +|)看做一個元素在行上列印
printf(" %c ", board[x][y]);//在行上列印( +|)
if (y < col - 1)//最后一個 ‘|’不需要 只用列印2個‘|’但( )還是列印了
printf("|");
}
printf("\n");//在行上列印完( +|)換行列印
if (x < row - 1)
{//將(---+|)看做一個元素列印
int y = 0;//創建一個變數
for (y= 0; y < col;y++)
{//y小于col=小于3
printf("---");//這里列印三次
if(y<col-1)//應為這個條件第三個‘|’沒有列印
printf("|");
}
printf("\n");//這列印完一行回傳for
}
}
}

開始實作玩家下棋和電腦下棋
1.先實作玩家下棋 玩家下棋 先提示他下棋 在讓其輸入坐標,如果坐標是超出了范圍則提示錯誤重新輸入;還要判斷下的坐標上是否有棋子
先在test檔案中列印函式
//玩家下棋
play_man(board, ROW, COL);
play_board(board, ROW, COL);
第二行代碼則表示每次玩家輸入后的坐標在圖上表示在次列印出來
然后再頭檔案中宣告
在到game.c檔案中實作它的程序

void play_man(char board[ROW][COL], int row, int col)
{//列印玩家下棋
int n = 0;
int m = 0;
printf("請玩家下:\n");
while (1)
{
printf("請輸入坐標:");
scanf("%d %d", &n, &m);
if (n >= 1 && n <= row && m >= 1 && m <= col)//判斷玩家下的棋是否符合規則
{//語言中第一個坐標是0,0, 人下棋的第一個是1,1
if (board[n - 1][m - 1] == ' ')
{//判斷n-1,m-1的坐標是空格就落子
board[n - 1][m- 1] = '*';//如果有子 就跳出重新下子
break;
}
else//表示這個地方有子
{
printf("坐標被占用,請重新輸入 \n");
}
}
else
{//超出棋盤的范圍
printf("坐標非法,請重新輸入 \n");
}
}
}
在這實作完玩家然后就可以在游戲中輸入相應的坐標

開始列印電腦的:
和列印玩家的一樣開頭
在test檔案中創建一個函式在到頭檔案中宣告

頭檔案中宣告

game.c檔案中實作電腦輸入
void comquter_play(char board[ROW][COL], int row, int col)
{
printf("電腦走:\n");
while (1)
{
int x = rand() & row;//生成的范圍只有0-2之間
int y = rand() & col;//不用判斷是否合法性;只用考慮是否占用
//控制電腦的坐標是否正確
printf("電腦下棋:\n");
if (board[x][y] == ' ')
{
board[x][y] = '#';//判斷落子的地方是否有棋
break;
}
}
}
電腦和人不一樣不需要提示 電腦也不懂你的提示只需要規范好它的范圍和規則就可以落子,需要用到rand庫函式;需要在test檔案中應用他的回傳值和game.h中參考頭檔案
到這里游戲就可以進行一大半了 但是游戲只能運行但是沒有判斷輸贏或者平局的條件,那這就是個半成品,接下來實作游戲的最后一步,
判斷輸贏
贏的條件有橫 3聯子 豎3聯子 兩個對角3聯子;需要建立while 回圈,判斷電腦和玩家的輸贏
while (1)
{//玩家下棋
play_man(board, ROW, COL);
play_board(board, ROW, COL);
//判斷玩家是否贏
ret =IFwin(board, ROW, COL);
if (ret != 'C')//3種情況判斷游戲誰贏誰輸或者平局 結束游戲
break;
//電腦下棋
comquter_play(board, ROW, COL);
play_board(board, ROW, COL);
//判斷電腦是否贏
ret = IFwin(board, ROW, COL);
if (ret != 'C')//3種情況判斷游戲誰贏誰輸或者平局 結束游戲
break;
}
if (ret == '*')
{
printf("玩家贏了\n");
}
//玩家贏了-* 電腦贏了-# 平局--Q 繼續游戲--C
else if (ret == '#')
{
printf("電腦贏了\n");
}
else
{
printf("平局\n");
}
play_board(board, ROW, COL);
}
創立輸贏的條件后在檔案game.c來實作輸贏的條件
char IFwin(char board[ROW][COL], int row, int col)
{//判斷輸贏
int a = 0;
for (a = 0; a < row; a++)
{//行
if (board[a][0] == board[a][1] && board[a][1] == board[a][2] && board[a][1] != ' ')
{
return board[a][1];//只用判斷三聯同一行中是哪個 代表哪個贏
}
}
for (a = 0; a < col; a++)
{//列
if (board[0][a] == board[1][a] && board[1][a] == board[2][a] && board[1][a] != ' ')
{
return board[1][a];
}
}
//對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{//左上角到右下角
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{//右上角到左下角
return board[1][1];
}
int ret = IF_man(board, row, col);
if (ret == 1)
{
return 'Q';//平局 回傳1則
}
return 'C';//繼續 回傳0則
}
IF_man函式來實作平局和游戲進行時的樣子則需要一下的代碼:
int IF_man(char board[ROW][COL], int row, int col)//判斷棋盤是否滿子沒
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)
{
for (b = 0; b < col; b++)
{
if (board[a][b] == ' ')
{
return 0;//表示棋盤沒滿
}
}
}
return 1;//表示棋盤滿了
}
總結
三子棋游戲就可以實作運行了,第一次用代碼來實作個小游戲確實挺困難的但是游戲能實作后帶來的喜悅真的巴適,這么多個代碼分成三個來寫則思路變得清晰 代碼也看的清楚每一個檔案都有對應相應;在頭檔案宣告定義的條件在源檔案中就只用參考下頭檔案就可拿來直接使用,省下不少的事情,而且還為后來想改變游戲的規則也帶來一定的方便,
以下是全部的代碼
game.h 中的代碼
#pragma once
#include<stdio.h>//頭檔案的包含
#include<stdlib.h>
#include<time.h>
//符號的定義
#define ROW 3//在頭檔案中定義
#define COL 3//定義一個三行三列的一個陣列
//函式的宣告
//
//
//初始化棋盤的函式
void in_board(char board[ROW][COL], int row, int col);//初始化棋盤
//列印棋盤的函式
void play_board(char board[ROW][COL], int row, int col);
//實作玩家下棋
void play_man(char board[ROW][COL], int row, int col);
//實作電腦下棋
void comquter_play(char board[ROW][COL], int row, int col);
//判斷輸贏條件
char IFwin(char board[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1//游戲的運行在這進行
#include "game.h"//參考頭檔案
void in_board(char board[ROW][COL], int row, int col)//初始化棋盤為空格
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)//初始化行
{
for (b = 0; b < col; b++)//初始化列
{
board[a][b] = ' ';//初始化棋盤為空格//必須是英文單引號 才能列印空格,雙引號是0
}
}
}
void play_board(char board[ROW][COL], int row, int col)//列印棋盤的樣子(九宮格)
{
int x = 0;
for (x = 0; x < row; x++)//當條件完成停止列印棋盤
{
int y = 0;
for (y = 0;y < col;y++)
{//將( +|)看做一個元素在行上列印
printf(" %c ", board[x][y]);//在行上列印( +|)
if (y < col - 1)//最后一個 ‘|’不需要 只用列印2個‘|’但( )還是列印了
printf("|");
}
printf("\n");//在行上列印完( +|)換行列印
if (x < row - 1)
{//將(---+|)看做一個元素列印
int y = 0;//創建一個變數
for (y= 0; y < col;y++)
{//y小于col=小于3
printf("---");//這里列印三次
if(y<col-1)//應為這個條件第三個‘|’沒有列印
printf("|");
}
printf("\n");//這列印完一行回傳for
}
}
}
void play_man(char board[ROW][COL], int row, int col)
{//列印玩家下棋
int n = 0;
int m = 0;
printf("請玩家下:\n");
while (1)
{
printf("請輸入坐標:");
scanf("%d %d", &n, &m);
if (n >= 1 && n <= row && m >= 1 && m <= col)//判斷玩家下的棋是否符合規則
{//語言中第一個坐標是0,0, 人下棋的第一個是1,1
if (board[n - 1][m - 1] == ' ')
{//判斷n-1,m-1的坐標是空格就落子
board[n - 1][m- 1] = '*';//如果有子 就跳出重新下子
break;
}
else//表示這個地方有子
{
printf("坐標被占用,請重新輸入 \n");
}
}
else
{//超出棋盤的范圍
printf("坐標非法,請重新輸入 \n");
}
}
}
void comquter_play(char board[ROW][COL], int row, int col)
{
printf("電腦走:\n");
while (1)
{
int x = rand() & row;//生成的范圍只有0-2之間
int y = rand() & col;//不用判斷是否合法性;只用考慮是否占用
//控制電腦的坐標是否正確
printf("電腦下棋:\n");
if (board[x][y] == ' ')
{
board[x][y] = '#';//判斷落子的地方是否有棋
break;
}
}
}
int IF_man(char board[ROW][COL], int row, int col)//判斷棋盤是否滿子沒
{
int a = 0;
int b = 0;
for (a = 0; a < row; a++)
{
for (b = 0; b < col; b++)
{
if (board[a][b] == ' ')
{
return 0;//表示棋盤沒滿
}
}
}
return 1;//表示棋盤滿了
}
char IFwin(char board[ROW][COL], int row, int col)
{//判斷輸贏
int a = 0;
for (a = 0; a < row; a++)
{//行
if (board[a][0] == board[a][1] && board[a][1] == board[a][2] && board[a][1] != ' ')
{
return board[a][1];//只用判斷三聯同一行中是哪個 代表哪個贏
}
}
for (a = 0; a < col; a++)
{//列
if (board[0][a] == board[1][a] && board[1][a] == board[2][a] && board[1][a] != ' ')
{
return board[1][a];
}
}
//對角線
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{//左上角到右下角
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{//右上角到左下角
return board[1][1];
}
int ret = IF_man(board, row, col);
if (ret == 1)
{
return 'Q';//平局 回傳1則
}
return 'C';//繼續 回傳0則
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//參考頭檔案
void menu()//游戲的選單 運行起來可以提供玩家選擇
{
printf("********************\n");
printf("****** 1. play *****\n");
printf("****** 0. exit *****\n");
printf("********************\n");
}
void game()
{//創建二維陣列,存盤資料
char board[ROW][COL];//參考頭檔案中定義的函式為3行3列
in_board(board, ROW, COL);//初始化棋盤行列為空格
play_board(board, ROW, COL);//列印棋盤
char ret = 0;//接收游戲狀態
while (1)
{//玩家下棋
play_man(board, ROW, COL);
play_board(board, ROW, COL);
//判斷玩家是否贏
ret =IFwin(board, ROW, COL);
if (ret != 'C')//3種情況判斷游戲誰贏誰輸或者平局 結束游戲
break;
//電腦下棋
comquter_play(board, ROW, COL);
play_board(board, ROW, COL);
//判斷電腦是否贏
ret = IFwin(board, ROW, COL);
if (ret != 'C')//3種情況判斷游戲誰贏誰輸或者平局 結束游戲
break;
}
if (ret == '*')
{
printf("玩家贏了\n");
}
//玩家贏了-* 電腦贏了-# 平局--Q 繼續游戲--C
else if (ret == '#')
{
printf("電腦贏了\n");
}
else
{
printf("平局\n");
}
play_board(board, ROW, COL);
}
int main()
{
int improt = 0;//創建一個變數 由玩家輸入
srand((unsigned int)time(NULL));
do//do while回圈陳述句 讓你可以多次的體驗
{
menu(); //列印選單
printf("請選擇:");//讓玩家輸入
scanf("%d", &improt);
switch (improt)//選擇陳述句
{
case 1://選擇1進入游戲
game();
break;
case 0:
printf("退出游戲\n");
break;
default://第三種選擇直接報錯 只能選擇 1 0
printf("輸入錯誤,請重新輸入\n");
break;
}
}
while (improt);//反回選單選擇 1 0
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280982.html
標籤:其他
上一篇:C語言實作 掃雷小游戲
