代码来自在b站上的鹏哥的课程,大部分为手打,少部分直接搬运了csdn博客其他学习者的代码。该三子棋代码内容全免费。这篇文章仅提供给认真上课的学习者参考使用,经过测试该代码能够正常运行使用。
前言
唯一美中不足的是,在开始游戏界面如果输入下棋坐标,会导致死循环。
共包含三篇,分别为
游戏声明:012_game1 head.h
游戏运行逻辑:012_game1 test.c
以及游戏代码的实现:012_game1.c
该命名与鹏哥课程略有改动,但实现效果是一样的。
其函数内命名方式也与鹏哥课程上的有所不同,请注意区分。
如displayboard在鹏哥的课程里写为DisplayBoard
代码
第一篇:游戏声明:
012_game1 head.hd
#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);
char IsWin(char board[ROW][COL], int row, int col);
第二篇:游戏运行逻辑:
012_game1 test.c
#include<stdio.h>
#include "012_game1 head.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);
ret = IsWin(board, ROW, COL);
if (ret != 'C') {
break;
}
displayboard(board, ROW, COL);
//电脑下棋
computermove(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C') {
break;
}
displayboard(board, ROW, COL);
}
if (ret == '*')
{
printf("======玩家赢了======\n");
}
else if (ret == '#') {
printf("------电脑赢了------\n");
}
else {
printf("------双方平局------\n");
}
displayboard(board, ROW, COL);//打印棋盘
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请选择:>");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("重新选择\n");
break;
}
} while (input);
return 86;
}
第三篇:游戏代码的实现:
012_game1.c
#include "012_game1 head.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++)
{
int j = 0;
for (j = 0;j < col;j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
//之前错因在此!!!!!
if (i < row - 1)
{
int j = 0;
for (j = 0;j < col;j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
} printf("\n");
}
}
//csdn的简化版本
//
//void displayboard(char board[ROW][COL], int row, int col)
//{
// for (int i = 0;i < row;i++)
// {
// for (int j = 0;j < col;j++)
// {
// printf(" %c ", board[i][j]);
// if (j < col - 1) //最后一列不打印
// printf("|");
// }
// printf("\n"); //一行打完换一行
// if (i < row - 1) { //最后一行不打印
// for (int j = 0;j < col;j++)
// {
// printf("---");
// if (j < col - 1)
// printf("|");
// }
// printf("\n");
// }
// }
//}
在game.c文件中
void playermove(char board[][COL], int row, int col)
{
int x=0;
int y=0;
printf("玩家走>\n");
while (1)
{
printf("请输入坐标>\n");
scanf_s("%d,%d", &x, &y);
if (1 <= x && x <= row && 1 <= y && 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) {
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
while (1) //电脑:只有下到正确的位置,空位置,才会跳出循环
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = '#';
break;
}
}
}
//void computermove(char board[ROW][COL], int row, int col)
//{
// printf("电脑走:>\n");
//
// int x = 0;
// int y = 0;
// while (1)
// {
// x = rand() % row;
// y = rand() % col;
// if (board[x][y] == ' ')
// {
// board[x][y] == '#';
// break;
// }
// }
//}
//直接照抄该函数 本人未亲自写
int IsFull(char board[ROW][COL], int row, int col)
{
for (int i = 0;i < row;i++)
{
for (int j = 0;j < row;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]; //好妙:返回 * #
}
}
//判断列
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//前面的行, 列 ,对角线,棋盘满了-->都没有赢,则--> 平局 --->返回'Q'
//判断有没有满---->棋盘里还有没有空格
//如果棋盘 满了就返回 1,不满 返回0;
if (IsFull(board, row, col))
{
return 'Q';
}
//前面没人赢,游戏没有平局(棋盘还没满)----->游戏继续返回 'C'
return 'C';
}
参考
参考了其他博主的内容:@一个不知名程序员www
原文链接:https://blog.csdn.net/2302_80297338/article/details/136057596
@我真想吃炸鸡
原文链接:https://blog.csdn.net/m0_74396894/article/details/139963333