本篇內容介紹了“怎么利用C語言實現AI五子棋游戲”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
一.如何實現
二.實現代碼及分析
(1)菜單的制作
(2)棋盤的初始化和打印
(3)玩家下子
(4)電腦下子
(5)判斷輸贏
三.整個代碼
(1)test.c文件下代碼:
(2)game.c下的代碼
(3)game.h下的代碼
四.具體效果
1.棋盤打印以及選擇先后手
2.玩家和電腦下子
3.判斷輸贏
1.說明:由于本文只是對初學C語言的人學習,所以將不會涉及任何算法,電腦將采用隨機下子的方式。(后期會為大家介紹Alpha-Beta剪枝算法實現人工智能AI)
2.主要部分:
(1)菜單
(2)打印棋盤
(3)玩家下子
(4)電腦下子
(5)判斷輸贏
運用do…while循環調用菜單,根據用戶選擇實現玩游戲和退出游戲
棋盤采用標準的15*15的格子,我們可以宏定義ROW和COL分別為15和15來表示行和列。
分別封裝兩個函數對棋盤進行初始化和打印
初始化:(這里將棋盤初始化為空格,可初始化為其他)
打印棋盤:
效果如下:
void PlayerMove(char board[ROW][COL], int row, int col) { int x, y; while (1) { printf("玩家走:\n"); 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] = 'O'; break; } else { printf("坐標被占用,請重新輸入\n"); } } else { printf("坐標非法,請重新輸入\n"); } } }
玩家下子主要采用的思路是,判斷棋盤上是否有子,已經輸入的坐標是否合法。
void ComputerMove(char board[ROW][COL], int row, int col) { int x, y; printf("電腦走\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } }
與玩家下子相同,此處采用的隨機下子,后期可進行優化(比如:極大極小值算法、Alpha-Beta剪枝算法等)
通過遍歷整個棋盤,觀察是否有連五子情況出現,代碼如下:
char iswin(char board[ROW][COL], int row, int col) { //行 int ren=0,dian=0,i,j; for (i = 0;i < row;i++) { ren = 0; for (j = 0;j < col;j++) { if (board[i][j] == 'O') ren++; else ren = 0; if (ren >= 5) return 'o'; } } for (i = 0;i < row;i++) { dian = 0; for (j = 0;j < col;j++) { if (board[i][j] == 'X') dian++; else dian = 0; if (dian >= 5) return 'x'; } } //列 ren = dian = 0; for (i = 0;i < row;i++) { ren = 0; for (j = 0;j < col;j++) { if (board[j][i] == 'O') ren++; else ren = 0; if (ren >= 5) return 'o'; } } for (i = 0;i < row;i++) { dian = 0; for (j = 0;j < col;j++) { if (board[j][i] == 'X') dian++; else dian = 0; if (dian >= 5) return 'x'; } } //右下 ren = dian =i=j= 0; for (int k = 0;k < row;k++) { i = k; j = 0; ren = 0; while (i < row && j < col) { if (board[i][j] == 'O') { ren++; } else { ren = 0; } i++; j++; if (ren >= 5) return 'o'; } } i = j = 0; for (int k = 0;k < row;k++) { i = k; j = 0; dian = 0; while (i < row && j < col) { if (board[i][j] == 'X') { dian++; } else dian = 0; i++; j++; if (dian >= 5) return 'x'; } } //右上 for (int k = row;k >=0;k--) { j = col; i = k; ren = 0; while (i >=0 && j >=0) { if (board[i][j] == 'O') { ren++; } else ren = 0; i--; j--; if (ren >= 5) return 'o'; } } for (int k = row;k >= 0;k--) { i = k; j = col; dian = 0; while (i >= 0 && j >= 0) { if (board[i][j] == 'X') { dian++; } else dian = 0; i--; j--; if (dian >= 5) return 'o'; } } for (int k = row;k >= 0;k--) { i = k; j = 0; dian = 0; while (i >= 0 && j <col) { if (board[i][j] == 'O') { dian++; } else dian = 0; i--; j++; if (dian >= 5) return 'o'; } } for (int k = row;k >= 0;k--) { i = k; j = 0; dian = 0; while (i >= 0 && j <col) { if (board[i][j] == 'X') { dian++; } else dian = 0; i--; j++; if (dian >= 5) return 'x'; } } for (int k = 0;k < row;k++) { i = k; j = col; dian = 0; while (i < row && j >= 0) { if (board[i][j] == 'O') { dian++; } else dian = 0; i++; j--; if (dian >= 5) return 'o'; } } for (int k = 0;k <row;k++) { i = k; j = col; dian = 0; while (i <row && j >= 0) { if (board[i][j] == 'X') { dian++; } else dian = 0; i++; j--; if (dian >= 5) return 'x'; } } for (int k = row;k >= 0;k--) { i = k; j = 0; dian = 0; while (i >= 0 && j <col) { if (board[i][j] == 'O') { dian++; } else dian = 0; i--; j++; if (dian >= 5) return 'o'; } } for (int k = row;k >= 0;k--) { i = k; j = 0; dian = 0; while (i >= 0 && j <col) { if (board[i][j] == 'X') { dian++; } else dian = 0; i--; j++; if (dian >= 5) return 'x'; } } for (int k = 0;k < row;k++) { i = k; j = col; dian = 0; while (i < row && j >= 0) { if (board[i][j] == 'O') { dian++; } else dian = 0; i++; j--; if (dian >= 5) return 'o'; } } for (int k = 0;k <row;k++) { i = k; j = col; dian = 0; while (i <row && j >= 0) { if (board[i][j] == 'X') { dian++; } else dian = 0; i++; j--; if (dian >= 5) return 'x'; } } return '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],ret; //初始化棋盤 InitBoard(board, ROW, COL); //打印棋盤 PrintBoard(board, ROW, COL); //下棋 int a; printf("1.先手 0.后手"); scanf("%d", &a); if(a==1) PlayerMove(board, ROW, COL); else ComputerMove(board, ROW, COL); while (1) { if (a == 0) { //PlayerMove(board, ROW, COL); PlayerMove(board, ROW, COL); PrintBoard(board, ROW, COL); ret=iswin(board, ROW, COL); if (ret != 'c') { break; } //ComputerMove(board, ROW, COL); ComputerMove(board, ROW, COL); PrintBoard(board, ROW, COL); ret = iswin(board, ROW, COL); if (ret != 'c') { break; } } else { //ComputerMove(board, ROW, COL); ComputerMove(board, ROW, COL); PrintBoard(board, ROW, COL); ret = iswin(board, ROW, COL); if (ret != 'c') { break; } //PlayerMove(board, ROW, COL); PlayerMove(board, ROW, COL); PrintBoard(board, ROW, COL); ret = iswin(board, ROW, COL); if (ret != 'c') { break; } } } if (ret == 'o') printf("玩家贏\n"); else if (ret == 'x') printf("電腦贏\n"); else printf("平局\n"); } int main() { int input; srand((unsigned int)time(NULL)); do { menu(); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戲\n"); break; default: printf("選擇錯誤\n"); break; } } while (input); return 0; }
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void InitBoard(char board[ROW][COL], int row, int col) { for (int i = 0;i < row;i++) { for (int j = 0;j < col;j++) { board[i][j] = ' '; } } } void PrintBoard(char board[ROW][COL], int row, int col) { for (int i = 0;i < row;i++) { printf(" "); printf("%2d", i+1); } printf("\n"); for (int i = 0;i < row;i++) { //打印數據 printf("%2d", i + 1); for (int j = 0;j < col;j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); //打印分割行 if (i < row - 1) { printf(" "); for (int 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, y; while (1) { printf("玩家走:\n"); 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] = 'O'; break; } else { printf("坐標被占用,請重新輸入\n"); } } else { printf("坐標非法,請重新輸入\n"); } } } void ComputerMove(char board[ROW][COL], int row, int col) { int x, y; printf("電腦走\n"); while (1) { x = rand() % row; y = rand() % col; if (board[x][y] == ' ') { board[x][y] = 'X'; break; } } } char iswin(char board[ROW][COL], int row, int col) { //行 int ren=0,dian=0,i,j; for (i = 0;i < row;i++) { ren = 0; for (j = 0;j < col;j++) { if (board[i][j] == 'O') ren++; else ren = 0; if (ren >= 5) return 'o'; } } for (i = 0;i < row;i++) { dian = 0; for (j = 0;j < col;j++) { if (board[i][j] == 'X') dian++; else dian = 0; if (dian >= 5) return 'x'; } } //列 ren = dian = 0; for (i = 0;i < row;i++) { ren = 0; for (j = 0;j < col;j++) { if (board[j][i] == 'O') ren++; else ren = 0; if (ren >= 5) return 'o'; } } for (i = 0;i < row;i++) { dian = 0; for (j = 0;j < col;j++) { if (board[j][i] == 'X') dian++; else dian = 0; if (dian >= 5) return 'x'; } } //右下 ren = dian =i=j= 0; for (int k = 0;k < row;k++) { i = k; j = 0; ren = 0; while (i < row && j < col) { if (board[i][j] == 'O') { ren++; } else { ren = 0; } i++; j++; if (ren >= 5) return 'o'; } } i = j = 0; for (int k = 0;k < row;k++) { i = k; j = 0; dian = 0; while (i < row && j < col) { if (board[i][j] == 'X') { dian++; } else dian = 0; i++; j++; if (dian >= 5) return 'x'; } } //右上 for (int k = row;k >=0;k--) { j = col; i = k; ren = 0; while (i >=0 && j >=0) { if (board[i][j] == 'O') { ren++; } else ren = 0; i--; j--; if (ren >= 5) return 'o'; } } for (int k = row;k >= 0;k--) { i = k; j = col; dian = 0; while (i >= 0 && j >= 0) { if (board[i][j] == 'X') { dian++; } else dian = 0; i--; j--; if (dian >= 5) return 'o'; } } for (int k = row;k >= 0;k--) { i = k; j = 0; dian = 0; while (i >= 0 && j <col) { if (board[i][j] == 'O') { dian++; } else dian = 0; i--; j++; if (dian >= 5) return 'o'; } } for (int k = row;k >= 0;k--) { i = k; j = 0; dian = 0; while (i >= 0 && j <col) { if (board[i][j] == 'X') { dian++; } else dian = 0; i--; j++; if (dian >= 5) return 'x'; } } for (int k = 0;k < row;k++) { i = k; j = col; dian = 0; while (i < row && j >= 0) { if (board[i][j] == 'O') { dian++; } else dian = 0; i++; j--; if (dian >= 5) return 'o'; } } for (int k = 0;k <row;k++) { i = k; j = col; dian = 0; while (i <row && j >= 0) { if (board[i][j] == 'X') { dian++; } else dian = 0; i++; j--; if (dian >= 5) return 'x'; } } return 'c'; //左 }
#pragma once #define ROW 15 #define COL 15 #include<stdio.h> #include<stdlib.h> #include<time.h> //初始化棋盤 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盤 void PrintBoard(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);
此處我們看到玩家贏了,可是電腦實在太蠢了,所以還有很多地方需要添加的
“怎么利用C語言實現AI五子棋游戲”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。