C語言程序設(shè)計(jì)從入門到進(jìn)階【比特鵬哥c語言2023完整版視頻教程】(c語言基礎(chǔ)入

//無智商人機(jī)實(shí)現(xiàn)n子棋
//有智商的人機(jī)可否提供代碼
//復(fù)制可運(yùn)行
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//表格行,列
#define ROW 10
#define COL 10
//幾子連接則勝
#define GAME 5
//初始化數(shù)組
void InitArr(char arr[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
//打印棋盤
void DisplayArr(char arr[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (j == col - 1) {
printf(" %c \n", arr[i][j]);
}
else {
printf(" %c |", arr[i][j]);
}
}
if (i == row - 1) continue;
for (int j = 0; j < col; j++)
{
if (j == col - 1) {
printf("---\n");
}
else {
printf("---|");
}
}
}
}
//判斷輸贏
int IsWin(char arr[ROW][COL], int x, int y)
{
//行
int right = 1;
int left = 1;
//列
int down = 1;
int up = 1;
//左斜
int rightup = 1;
int leftdown = 1;
//右斜
int leftup = 1;
int rightdown = 1;
//行
for (int i = 1; i < GAME; i++)
{
if (y + i <= COL && arr[x][y] == arr[x][y + i]) {
left++;
}
else
{
break;
}
}
for (int j = 1; j < GAME; j++)
{
if (y - j >= 0 && arr[x][y] == arr[x][y - j]) {
right++;
}
else
{
break;
}
}
if (right + left - 1 >= GAME) {
return 1;
}
//列
for (int i = 1; i < GAME; i++)
{
if (x + i <= ROW && arr[x][y] == arr[x + i][y]) {
down++;
}
else
{
break;
}
}
for (int j = 1; j < GAME; j++)
{
if (x - j >= 0 && arr[x][y] == arr[x - j][y]) {
up++;
}
else
{
break;
}
}
if (down + up - 1 >= GAME) {
return 1;
}
//左斜
for (int i = 1; i < GAME; i++)
{
if (x + i <= ROW && y + i <= COL && arr[x][y] == arr[x + i][y + i]) {
leftdown++;
}
else
{
break;
}
}
for (int j = 1; j < GAME; j++)
{
if (x - j >= 0 && y - j >= 0 && arr[x][y] == arr[x - j][y - j]) {
rightup++;
}
else
{
break;
}
}
if (leftdown + rightup - 1 >= GAME) {
return 1;
}
//右斜
for (int i = 1; i < GAME; i++)
{
if (x + i <= ROW && y - i >= 0 && arr[x][y] == arr[x + i][y - i]) {
rightdown++;
}
else
{
break;
}
}
for (int j = 1; j < GAME; j++)
{
if (x - j >= 0 && y + j <= COL && arr[x][y] == arr[x - j][y + j]) {
leftup++;
}
else
{
break;
}
}
if (rightdown + leftup - 1 >= GAME) {
return 1;
}
return 0;
}
//判斷是否平局
int IsDraw(char arr[ROW][COL]) {
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (arr[i][j] == ' ') {
return 0;
}
}
}
printf("游戲結(jié)束>\n平局");
return 1;
}
//玩家下棋
int PlayerMove(char arr[ROW][COL], int row, int col)
{
while (1)
{
printf("玩家下棋>\n請輸入坐標(biāo)> ");
int x;
int y;
scanf("%d %d", &x, &y);
if (arr[x - 1][y - 1] == ' ' && x >= 1 && x <= row && y >= 1 && y <= col) {
arr[x - 1][y - 1] = '*';
int a = IsWin(arr, x - 1, y - 1);
if (a) {
printf("玩家贏!!!!!!\n");
return 0;
}
if (IsDraw(arr)) {
return 0;
}
return 1;
}
else
{
printf("坐標(biāo)錯(cuò)誤或者被占用,重新輸入\n");
}
}
}
//電腦下棋
int ComputerMove(char arr[ROW][COL], int row, int col)
{
printf("電腦下棋>\n");
while (1)
{
int x;
int y;
x = rand() % row;
y = rand() % col;
if (arr[x][y] == ' ') {
arr[x][y] = '#';
int a = IsWin(arr, x, y);
if (a) {
printf("電腦贏!!!!!!\n");
return 0;
}
if (IsDraw(arr)) {
return 0;
}
return 1;
}
}
}
void playgame() {
char arr[ROW][COL] = { 0 };
//初始化數(shù)組
InitArr(arr, ROW, COL);
//打印棋盤
DisplayArr(arr, ROW, COL);
//開始
while (1)
{
//玩家下棋
int playnum = PlayerMove(arr, ROW, COL);
DisplayArr(arr, ROW, COL);
if (!playnum) {
break;
}
//電腦下棋
int computernum = ComputerMove(arr, ROW, COL);
DisplayArr(arr, ROW, COL);
if (!computernum) {
break;
}
}
}
int main() {
int choose;
srand((unsigned int)time(NULL));
do {
printf("**************************\n");
printf("**********1.play**********\n");
printf("**********0.exit**********\n");
printf("**************************\n");
printf("請選擇>");
scanf("%d", &choose);
switch (choose)
{
case 1:
playgame();
break;
case 0:
printf("退出游戲成功");
break;
default:
printf("輸入數(shù)字錯(cuò)誤,重新輸入!\n");
break;
}
} while (choose);
return 0;
}