文章目錄
- 前言:
- 我想要的棋盤
- 程式代碼(分步+匯總)
- 自定義函式庫:game.h
- 棋盤的初始化函式
- 輸出棋盤函式
- 玩家走函式
- 判斷勝負函式
- 電腦走(非智能電腦0.0)函式
- 終止落子函式
- 游戲執行函式
- 匯總
- 運行結果
- 總結
前言:
| 博主實力有限,有什么錯誤,請斧正,非常感謝! |
|---|
| 1.本文的三字琪,針對電腦是一種隨機落子,不智能(后面會進行修改), |
|---|
2.因為在對勝負的判斷很麻煩,因此我的思路:建立一個大原先棋盤2圈的新棋盤,(下棋范圍仍是原棋盤,大2圈是為了邊界情況的判定) 這樣的話判斷勝負時,我只需要判斷落子后周圍2圈的情況 |
| 3.電腦下琪是隨機下棋,因此需要亂數:見我了我一篇博客:偽亂數的生成 |
| 4.這需要很多的函式,為了mian函式檔案的好看,自定義庫函式,main.c檔案呼叫相應函式 |
| 5.為了提高程式的靈活性,我把棋盤定義為全域變數,這樣方便更改棋盤大小, |
6.return可以直接結束函式運行,break只能結束一層回圈,仔細體會其中妙處,后面的判斷勝負函式就用到了,有興趣的請看程式,非常的妙, |
7.在最終判斷是無論勝負,平局都回傳0,否則1.特別妙,0.0. |
我想要的棋盤

思路:
程式代碼(分步+匯總)
自定義函式庫:game.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define Row 9
#define Col 9
#define Rows Row+4
#define Cols Col+4
void Beg_board(char board[Rows][Cols] ,int row, int col);//初始化棋盤
void Show_board(char board[Rows][Cols], int row, int col);//用于輸出棋盤
char Peo_ply(char board[Rows][Cols], int row, int col);//玩家走
char Com_ply(char board[Rows][Cols], int row, int col);//電腦走
char Is_win(char board[Rows][Cols], int x, int y, int row, int col);//回傳判斷的資訊.
int Ret_win(char ch);//回傳的值,用于終止游戲,
void game();//游戲執行
//玩家贏回傳‘*’;
//電腦贏回傳‘#’;
//平局回傳'E';
//繼續回傳' C';
棋盤的初始化函式
void Beg_board(char board[Rows][Cols] ,int row, int col)
{
int i = 0;
int j = 0;
for(i=1;i<= row-3;i++)
{
for (j = 1; j <= col - 3 ; j++)
{
if (i==1)
{
board[i][j] = j - 1+'0';
board[j][i] = j - 1+'0';
}
else if(j>1)
{
board[i][j] = ' ';
}
}
}
}
輸出棋盤函式
void Show_board(char board[Rows][Cols], int row, int col)
{
int i = 0;
int j = 0;
int t = 0;
for (i = 1; i < row - 2; i++)
{
for (j = 1; j < col - 2; j++)
{
if (i == 1)
{
printf(" %c ", board[i][j]);
}
else
{
if (j == 1)
{
printf(" %c |", board[i][j]);
}
else
{
printf(" %c |", board[i][j]);
}
}
}
printf("\n");
for (t = 0; t < col - 2; t++)
{
printf("----");
}
printf("\n");
}
}
玩家走函式
char Peo_ply(char board[Rows][Cols], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("請輸入坐標:");//字符陣列的行列與坐標軸不同,但有規律
scanf("%d %d", &x, &y);
if (x > 0 && x < row - 3 && y>0 && y < col - 3)
{
if (board[y+1][x+1] == ' ')//防止重置電腦走的棋或者自己走過的棋
{
board[y+1][x+1] = '*';
Show_board(board, row, col);
break;
}
else
{
printf("坐標輸入錯誤,請注意是否重復!\n");
}
}
else
{
printf("坐標輸入錯誤,請注意橫縱坐標軸!\n");
}
}
return Is_win(board, x, y, row, col);
}
判斷勝負函式
| 周圍2圈,共12種情況 |
|---|
| 判斷勝負,只有連續3個不為空格,直接回傳值,這地方非常妙 |
| 回傳相應的字符,用以終止落子回圈 |
char Is_win(char board[Rows][Cols], int x, int y, int row, int col)
{
int m = y + 1;//用于存盤x,y的坐標.
int n = x + 1;
int i = 0;
int j = 0;
//判斷周圍一格的情況(直接回傳字符,不需加以判斷,但前提是非空格字符)
if ((board[m][n] == board[m][n - 1] )&& (board[m][n] == board[m][n + 1] )&& (board[m][n] != ' '))
{
return board[m][n];//比較左右
}
else if( (board[m][n] == board[m - 1][n] )&&( board[m ][n] ==board[m+1][n]) &&( board[m][n] != ' '))
{
return board[m][n];//比較上下
}
else if( (board[m][n] == board[m + 1][n + 1]) && (board[m][n] ==board[m - 1][n - 1] )&& (board[m][n] != ' '))
{
return board[m][n];//比較左上右下
}
else if ((board[m][n] == board[m - 1][n + 1] )&&( board[m][n] == board[m + 1][n - 1]) && (board[m][n] != ' '))
{
return board[m][n];//比較左下右上
}
//判斷周圍 2格的情況
else if ((board[m][n] == board[m][n - 1] )&& (board[m][n] == board[m][n - 2]) &&( board[m][n] != ' '))
{
return board[m][n];//比較左邊2個
}
else if( (board[m][n] == board[m][n + 1] )&& (board[m][n] == board[m][n + 2] )&&( board[m][n] != ' '))
{
return board[m][n];//比較右邊2個
}
else if ((board[m][n] == board[m - 1][n] )&& (board[m][n] == board[m - 2][n]) &&( board[m][n] != ' '))
{
return board[m][n];//比較上邊2個
}
else if ((board[m][n] == board[m + 1][n] )&&( board[m][n] == board[m + 2][n] )&&( board[m][n] != ' '))
{
return board[m][n];//比較下邊2個
}
else if ((board[m][n] == board[m + 1][n + 1] )&& (board[m][n] == board[m + 2][n + 2] )&& (board[m][n] != ' '))
{
return board[m][n];//比較右下2個
}
else if( (board[m][n] == board[m - 1][n + 1] )&&( board[m][n] == board[m - 2][n + 2]) && (board[m][n] != ' '))
{
return board[m][n];//比較右上2個
}
else if( (board[m][n] == board[m - 1][n - 1]) &&( board[m][n] == board[m - 2][n - 2]) && (board[m][n] != ' '))
{
return board[m][n];//比較左上2個
}
else if( (board[m][n] == board[m + 1][n - 1] )&&(board[m][n]== board[m + 2][n - 2])&&( board[m][n] != ' '))
{
return board[m][n];//比較左下2個
}
//判斷是否繼續:
for (i=2;i<row-3;i++)
for(j=2;j<col-3;j++)
if (board[i][j] == ' ')
return 'C';//碰到空格字符,程式結束,
//最后一種情況:平局,比較難判斷,不過因為return的原因,變容易了,
return 'E';
}
電腦走(非智能電腦0.0)函式
char Com_ply(char board[Rows][Cols], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % (row - 3);
y = rand() % (col - 3);
if (x > 0 && x < row - 3 && y>0 && y < col - 3)
{
if (board[y+1][x+1] == ' ')//防止重置玩家,或者電腦走的位置,
{
board[y+1][x + 1] = '#';
Show_board(board, row, col);
break;
}
}
}
return Is_win(board, x, y, row, col);
}
終止落子函式
| 將判斷勝負函式的回傳值做為條件 |
|---|
| 無論誰贏,或者平局回傳0,否則1 |
int Ret_win(char ch)//無論輸贏,或者平局都回傳0,繼續則1;
{
if (ch == '*')
{
printf("恭喜你贏了!\n");
return 0;
}
else if (ch == '#')
{
printf("很遺憾,你輸了!\n");
return 0;
}
else if (ch == 'E')
{
printf("本局平局!\n");
return 0;
}
else
{
return 1;
}
}
游戲執行函式
void game()
{
char game_board[Rows][Cols] = {0};
Beg_board(game_board, Rows, Cols);
Show_board(game_board, Rows, Cols);
while (1)
{
if(Ret_win(Peo_ply(game_board, Rows, Cols)))//玩家走,走完判斷勝負情況
{
printf("繼續游戲\n");
}
else
{
Show_board(game_board, Rows, Cols);
break;
}
if( Ret_win(Com_ply(game_board, Rows, Cols)))//玩家走,走完判斷勝負情況
{
}
else
{
Show_board(game_board, Rows, Cols);
break;
}
}
}
匯總
//我的思路:
//在判斷3三子棋情況,若是棋盤過大, 判斷情況太多, 因此我設定了 - 個比原棋盤
//大2圈的棋盤,這樣我只需在每次下棋后,判斷周圍2圈的情況,并回傳值,再通
//過另外 - 個函式,將回傳的值作為引數,只要不是繼續的情況就回傳0,否則就返
//回1.這樣方便結束下棋的回圈,
#include "game.h"
void menu()
{
printf("*********************************\n");
printf("****** 1.Play ***************\n");
printf("****** 0.Exit ***************\n");
printf("*********************************\n");
}
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;
}
運行結果

總結
| 1.return與break的靈活運用 |
|---|
| 2.多留意陣列下標的位置, |
| 3.注意x,y軸與二維陣列行列的不同 |
| 4.五字棋等多子棋,和三字棋相似,但是需要確認周圍幾格內的元素,修改勝負判斷條件即可, |
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294751.html
標籤:其他
