三子棋游戲
- 什么是三子棋
- 游戲規則
- 撰寫游戲的思路
- 知識點
- 1.分支和回圈陳述句
- 2.函式
- 3.陣列
- 三子棋代碼(含解釋)
- 運行結果
- 1.玩家贏
- 2.電腦贏
- 3.平局很難(電腦太傻了!!!)
- 寄予
什么是三子棋
三子棋是黑白棋的一種,三子棋是一種民間傳統游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等,將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,但是,有很多時候會出現和棋的情況,


游戲規則
玩家每人選擇一種棋子(#或*(也可以根據自己的喜好選擇其他的)),先三個棋子連成一線的一方為勝方,橫向、豎向、斜向均可,
撰寫游戲的思路
首先創建test.c 是測驗游戲邏輯的代碼,創建game.h 關于游戲相關的函式宣告,符號宣告,以及頭檔案的包含,創建game.c 游戲相關函式的實作,分為這三個模塊,(撰寫本游戲所用的編輯器是Visual Studio 2019)
思路:1.創建一個游戲選單; 2.創建一個九宮格;3.創建玩家下棋和電腦下棋(電腦下棋時比較傻(演算法比較簡單))的函式;4.寫出對弈結果(1.玩家贏 2.電腦贏 3.平局)
知識點
寫三子棋所以用的編程語言是C語言
1.分支和回圈陳述句
a.if…else陳述句
b.if…else if…else 陳述句
c.switch 陳述句
d.break 的使用
e.while回圈陳述句
f,do…while()陳述句
g.for 回圈陳述句
2.函式
a.頭檔案的包含
b.符號的定義
c.函式的宣告和定義
d.函式的呼叫(傳值呼叫,傳址呼叫)
e.函式的嵌套呼叫
3.陣列
a.二維陣列的創建和初始化
b.二維陣列的使用
c.二維陣列在記憶體中的存盤
d.陣列作為函式的傳參
三子棋代碼(含解釋)
game.h
#pragma once
//頭檔案的包含
#include<stdio.h>
#include<stdlib.h>
#include<time.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);
//
//1. 玩家贏了 - *
//2. 電腦贏了 - #
//3. 平局 - Q
//4. 游戲繼續 - C
//判斷游戲是否有輸贏
char IsWin(char board[ROW][COL], int row, int col);
int IsFull(char board[ROW][COL], int row, int col);
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];
//初始化棋盤 - 初始化空格
InitBoard(board, ROW, COL);
//列印一下棋盤 - 本質是列印陣列的內容
DisplayBoard(board, ROW, COL);
char ret = 0;//接受游戲狀態
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");
}
DisplayBoard(board, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
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 = 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++)
// {
// printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
// if(i<row-1)
// printf("---|---|---\n");
// }
//}
//
void DisplayBoard(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++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (j = 0;j < row;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("玩家走:>\n");
/*while(1)
{
printf("請輸入下棋的坐標:>");
scanf("%d %d", &i, &j);
if (board[i-1][j-1] == ' ')
{
board[i-1][j-1] == '*';
break;
}
else
{
printf("請重新輸入");
}
}*/
while (1)
{
printf("請輸入下棋的坐標:>");
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)
{
while (1)
{
int i = rand() % row;
int j = rand() % col;
if (board[i][j] == ' ')
{
board[i][j] = '#';
break;
}
}
}
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][1] != ' ')
{
return board[i][1];
}
}
//判斷三列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//判斷對角線
if(board[0][0]== board[1][1]&& board[2][2]== board[0][0]&&board[2][2] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0]&& board[2][0] !=' ')
return board[1][1];
//判斷平局
//如果棋盤滿了回傳1, 不滿回傳0
int ret = IsFull(board, row, col);
if (ret == 1)
{
return 'Q';
}
return 'C';
}
運行結果
1.玩家贏

2.電腦贏

3.平局很難(電腦太傻了!!!)
這里就不演示了,
寄予
個人認為:三子棋游戲適合初學C語言或C++的學者學習練習,在這里本博主希望每個人都等成為IT界的大牛,走向人生巔峰!!!
如果代碼有問題或者改進的地方請大佬在評論區給我糾錯 萬分感謝!!!

本游戲純屬在課上寫的(電腦的函式演算法簡單(算不智能))😁😁😁
后期會改進!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/280382.html
標籤:其他
上一篇:Kafka的靈魂伴侶Logi-KafkaManger(3)之運維管控--集群串列
下一篇:現在寫博客沒有原力計劃了嗎
