最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何利用最簡(jiǎn)單的C語(yǔ)言實(shí)現(xiàn)AI五子棋

 更新時(shí)間:2021年07月31日 09:09:01   作者:Ja_king_  
這篇文章主要給大家介紹了關(guān)于如何利用最簡(jiǎn)單的C語(yǔ)言實(shí)現(xiàn)AI五子棋的相關(guān)資料,包含了一些五子棋常見(jiàn)的功能,文中也通過(guò)詳細(xì)的實(shí)例代碼和圖片介紹的非常詳細(xì),需要的朋友可以參考下

一.如何實(shí)現(xiàn)

1.說(shuō)明:由于本文只是對(duì)初學(xué)C語(yǔ)言的人學(xué)習(xí),所以將不會(huì)涉及任何算法,電腦將采用隨機(jī)下子的方式。(后期會(huì)為大家介紹Alpha-Beta剪枝算法實(shí)現(xiàn)人工智能AI)

2.主要部分:

(1)菜單

(2)打印棋盤

(3)玩家下子

(4)電腦下子

(5)判斷輸贏

二.實(shí)現(xiàn)代碼及分析

(1)菜單的制作

在這里插入圖片描述

在這里插入圖片描述

運(yùn)用do…while循環(huán)調(diào)用菜單,根據(jù)用戶選擇實(shí)現(xiàn)玩游戲和退出游戲

(2)棋盤的初始化和打印

棋盤采用標(biāo)準(zhǔn)的15*15的格子,我們可以宏定義ROW和COL分別為15和15來(lái)表示行和列。

在這里插入圖片描述

分別封裝兩個(gè)函數(shù)對(duì)棋盤進(jìn)行初始化和打印

初始化:(這里將棋盤初始化為空格,可初始化為其他)

在這里插入圖片描述

打印棋盤:

在這里插入圖片描述

效果如下:

在這里插入圖片描述

(3)玩家下子

void PlayerMove(char board[ROW][COL], int row, int col) {
	int x, y;
	while (1) {
		printf("玩家走:\n");
		printf("請(qǐng)輸入坐標(biāo):\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("坐標(biāo)被占用,請(qǐng)重新輸入\n");
			}
		}
		else {
			printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
		}
	}
}

玩家下子主要采用的思路是,判斷棋盤上是否有子,已經(jīng)輸入的坐標(biāo)是否合法。

(4)電腦下子

void ComputerMove(char board[ROW][COL], int row, int col) {
	int x, y;
	printf("電腦走\(yùn)n");
	while (1) {
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ') {
			board[x][y] = 'X';
			break;
		}
	}
}

與玩家下子相同,此處采用的隨機(jī)下子,后期可進(jìn)行優(yōu)化(比如:極大極小值算法、Alpha-Beta剪枝算法等)

(5)判斷輸贏

通過(guò)遍歷整個(gè)棋盤,觀察是否有連五子情況出現(xiàn),代碼如下:

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';
	//左
}

三.整個(gè)代碼

(1)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() {
	//棋盤數(shù)組
	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("選擇錯(cuò)誤\n");
			break;
		}
	} while (input);
	return 0;
}

(2)game.c下的代碼

#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++) {
		//打印數(shù)據(jù)
		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("請(qǐng)輸入坐標(biāo):\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("坐標(biāo)被占用,請(qǐng)重新輸入\n");
			}
		}
		else {
			printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
		}
	}
}

void ComputerMove(char board[ROW][COL], int row, int col) {
	int x, y;
	printf("電腦走\(yùn)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';
	//左
}

(3)game.h下的代碼

#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);

四.具體效果

1.棋盤打印以及選擇先后手

在這里插入圖片描述

2.玩家和電腦下子

在這里插入圖片描述

3.判斷輸贏

在這里插入圖片描述

此處我們看到玩家贏了,可是電腦實(shí)在太蠢了,所以還有很多地方需要添加的

歡迎各位大佬對(duì)此代碼進(jìn)行優(yōu)化!

總結(jié)

到此這篇關(guān)于如何利用最簡(jiǎn)單的C語(yǔ)言實(shí)現(xiàn)AI五子棋的文章就介紹到這了,更多相關(guān)C語(yǔ)言實(shí)現(xiàn)AI五子棋內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++控制結(jié)構(gòu)詳情

    C++控制結(jié)構(gòu)詳情

    這篇文章主要介紹了C++控制結(jié)構(gòu)詳情,C++的控制結(jié)構(gòu)和其它編程語(yǔ)言類似包括順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu),更多相關(guān)資料需要的小伙伴可以參考下面文章內(nèi)容
    2022-03-03
  • VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問(wèn)題解決

    VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問(wèn)題解決

    本文主要介紹了VS C++頭文件引用提示“未定義標(biāo)識(shí)符”的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++印刷模板使用方法詳解

    C++印刷模板使用方法詳解

    模板是C++支持參數(shù)化多態(tài)的工具,使用模板可以使用戶為類或者函數(shù)聲明一種一般模式,使得類中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù)、返回值取得任意類型
    2022-11-11
  • 淺談單調(diào)隊(duì)列、單調(diào)棧

    淺談單調(diào)隊(duì)列、單調(diào)棧

    其實(shí),單調(diào)隊(duì)列和單調(diào)棧是類似的,在我看來(lái),這兩個(gè)東西只是名字不一樣 - - ! 比較容易想的一道題啦! 首先,這題的兩個(gè)關(guān)鍵點(diǎn): 1、區(qū)間的和。這個(gè)簡(jiǎn)單,地球人都知道! 2、區(qū)間的最小值。
    2015-07-07
  • C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?

    C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?

    今天小編就為大家分享一篇關(guān)于C++begin和end運(yùn)算符的返回迭代器的類型如何判斷?,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • C++讀取注冊(cè)表的實(shí)現(xiàn)方法

    C++讀取注冊(cè)表的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++讀取注冊(cè)表的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • c++讀取excel的代碼詳解

    c++讀取excel的代碼詳解

    在本篇文章里小編給大家分享的是一篇關(guān)于c++讀取excel的代碼詳解內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • C語(yǔ)言中實(shí)現(xiàn)KMP算法的實(shí)例講解

    C語(yǔ)言中實(shí)現(xiàn)KMP算法的實(shí)例講解

    KMP算法即字符串匹配算法,C語(yǔ)言中KMP可以避免指針回溯從而達(dá)到高效,接下來(lái)就來(lái)總結(jié)一下C語(yǔ)言中實(shí)現(xiàn)KMP算法的實(shí)例講解
    2016-06-06
  • 簡(jiǎn)單的socket編程入門示例

    簡(jiǎn)單的socket編程入門示例

    這篇文章主要介紹了簡(jiǎn)單的socket編程入門示例,簡(jiǎn)單實(shí)現(xiàn)client輸入內(nèi)容發(fā)送到server端輸出,需要的朋友可以參考下
    2014-03-03
  • 簡(jiǎn)單講解C++的內(nèi)部和外部函數(shù)以及宏的定義

    簡(jiǎn)單講解C++的內(nèi)部和外部函數(shù)以及宏的定義

    這篇文章主要介紹了簡(jiǎn)單講解C++的內(nèi)部和外部函數(shù)以及宏的定義,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09

最新評(píng)論

元氏县| 札达县| 科尔| 罗源县| 屏东县| 政和县| 福海县| 永新县| 金川县| 容城县| 连云港市| 哈密市| 庆安县| 泰安市| 瓮安县| 成安县| 句容市| 天镇县| 武安市| 乃东县| 民勤县| 崇信县| 新余市| 龙口市| 怀远县| 德令哈市| 巴东县| 卢氏县| 诏安县| 射阳县| 玉田县| 隆安县| 嵊泗县| 察雅县| 富阳市| 永福县| 交城县| 武宣县| 武义县| 栾川县| 西青区|