#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void print()
{
printf("*************************\n");
printf("*********1、paly*********\n");
printf("*********0、exit*********\n");
printf("*************************\n");
}
void Init(char(*arr)[COLS], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
*(*(arr + i) + j) = ' ';
}
}
}
void PrintBorad(char(*arr)[COLS], int row, int col)
{
int i = 0;
for (i = 1; i <= row; i++)
{
int j = 0;
for (j = 1; j <= col; j++)
{
printf(" %c ", *(*(arr + i) + j));
if (j <= col - 1)
printf("|");
}
printf("\n");
if (i <= row - 1)
{
for (j = 1; j <= col; j++)
{
printf("---");
if (j <= col - 1)
printf("|");
}
printf("\n");
}
}
}
void PlayerInput(char(*arr)[COLS], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家回合:\n");
printf("请输入要下棋的坐标(中间用空格隔开):");
while (scanf("%d%d", &x, &y) == 2)
{
while (getchar() != '\n')
{
;
}
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (arr[x][y] == ' ')
{
arr[x][y] = 'O';
break;
}
else
printf("此处已下过棋子,请重新下子:");
}
else
printf("非法输入,请重新输入:");
}
}
void ComputerInput(char(*arr)[COLS], int row, int col)
{
printf("电脑回合:\n");
while (1)
{
int x = rand() % row + 1;//生产1-5的随机数
int y = rand() % col + 1;
if (arr[x][y] != ' ')
{
continue;
}
else
{
arr[x][y] = 'X';
break;
}
/*if (arr[x][y] == ' ')
{
arr[x][y] = 'X';
}
else
{
;
}*/
}
}
char IsWin(char(*arr)[COLS], int row, int col)//c继续 q平局 O玩家获胜 X电脑获胜
{
int i = 0;
int j = 0;
char c = 'c';
char q = 'q';
//斜线确定
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
if (arr[i][j] != ' ')
{
if (arr[i][j] == arr[i - 1][j - 1] && arr[i][j] == arr[i + 1][j + 1])
{
return arr[i][j];
}
else if (arr[i][j] == arr[i - 1][j + 1] && arr[i][j] == arr[i + 1][j - 1])
{
return arr[i][j];
}
}
}
}
//行确定
int sum = 0;//优化方案
for (i = 1; i <= row; i++)
{
sum = 0;
for (j = 1; j <= col - 1; j++)
{
if (arr[i][j] == arr[i][j + 1] && arr[i][j] != ' ')
{
sum = sum + 1;
if (sum == 2)
{
return arr[i][j];
}
}
else
sum = 0;
}
}
//列确定
for (j = 1; j <= col; j++)
{
sum = 0;
for (i = 1; i <= row - 1; i++)
{
if (arr[i][j] == arr[i + 1][j] && arr[i][j] != ' ')
{
sum = sum + 1;
if (sum == 2)
{
return arr[i][j];
}
}
else
sum = 0;
}
}
//平局
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
if (arr[i][j] == ' ')
return c;
}
}
return q;
}
void play(char(*arr)[COLS], int rows, int cols)
{
Init(arr, rows, cols);//初始化7*7棋盘
PrintBorad(arr, ROW, COL);//打印只需打印5*5棋盘即可
char poi = 0;
while (1)
{
PlayerInput(arr, ROW, COL);//玩家下棋
PrintBorad(arr, ROW, COL);
poi = IsWin(arr, ROW, COL);//判断胜负
if (poi != 'c')
break;
ComputerInput(arr, ROW, COL);//电脑下棋
PrintBorad(arr, ROW, COL);
poi = IsWin(arr, ROW, COL);//判断胜负
if (poi != 'c')
break;
}
if (poi == 'O')
{
printf("玩家获胜!\n");
}
else if (poi == 'X')
{
printf("电脑获胜!\n");
}
else
{
printf("平局!\n");
}
}
c语言实现井字棋,可以随意更改棋盘的大小
需积分: 0 165 浏览量
更新于2023-09-20
收藏 2KB ZIP 举报
在本文中,我们将深入探讨如何使用C语言实现一个具有可扩展棋盘大小功能的井字棋游戏。井字棋,也称为"tic-tac-toe",是一个简单但有趣的游戏,通常在3x3的棋盘上进行,由两个人轮流在空格中放置X或O,目标是形成一行、一列或一条对角线的相同标记。
我们需要理解C语言的基本语法和结构。C语言是一种强大的、低级别的编程语言,允许我们直接操作内存和硬件资源。在实现井字棋时,我们需要用到C语言的数据类型(如int、char)、控制流程(if-else、for、while循环)、函数和数组等概念。
1. **棋盘表示**:
在C语言中,我们可以用二维数组来表示棋盘。例如,一个3x3的棋盘可以表示为一个大小为3的数组,每个元素又是一个大小为3的数组。对于可扩展的棋盘,我们需要动态分配内存,根据用户输入的尺寸创建大小合适的棋盘数组。
2. **初始化棋盘**:
游戏开始时,棋盘上的所有位置应为空。我们可以通过将数组中的所有元素初始化为一个特殊值(如' '或0)来实现这一点。
3. **用户交互**:
我们需要读取用户的输入,让他们选择放置X或O的位置。C语言的`scanf()`函数可以用来获取用户输入,但要注意处理非法输入(如超出棋盘范围的位置或已经占用的位置)。
4. **检查游戏状态**:
每次下棋后,我们需要检查是否有人获胜或者棋盘是否已满(平局)。这可以通过遍历数组,检查行、列和对角线是否有三个连续的相同标记来实现。
5. **扩大棋盘功能**:
这部分涉及到动态内存管理。当用户要求扩大棋盘时,我们使用`malloc()`和`calloc()`函数来分配新的内存,然后复制旧棋盘的数据到新棋盘,释放旧棋盘的内存。需要注意的是,扩大棋盘后,需要重新计算胜利条件,因为更多的行、列和对角线可能出现。
6. **函数设计**:
将游戏的不同部分封装成函数,如`drawBoard()`用于打印当前棋盘,`checkWin()`用于检查游戏状态,`playTurn()`用于处理玩家的回合等,可以使代码更清晰、更易于维护。
7. **错误处理**:
在C语言编程中,错误处理是至关重要的。确保在遇到内存分配失败、输入错误等情况时,程序能够优雅地处理并给出适当的提示。
通过以上步骤,我们可以构建一个功能完善的C语言井字棋游戏。这个项目不仅锻炼了基本的C语言编程技巧,还涉及到了动态内存管理和用户交互,对于学习C语言的初学者来说是一个很好的实践项目。同时,增加的扩大棋盘功能使得游戏更具挑战性和趣味性,也让开发者有机会进一步提升其编程技能。
安权_code
- 粉丝: 1539
- 资源: 1
最新资源
- 毕设-java web-ssm-javaweb物流配货项目源码25.zip
- 毕设-java web-ssm-Javaweb仓库管理系统项目源码23.zip
- 毕设-java web-ssm-javaWeb传智播客网上书城项目源码(设计以及实现论文)24.zip
- 毕设-java web-ssm-JAVAWEB校园订餐系统项目源码27.zip
- 毕设-java web-ssm-javaWeb物资管理系统项目源码26.zip
- 毕设-java web-ssm-java源码 仿360buy京东商城源码 京东JavaWeb项目源代码1.zip
- 毕设-java web-ssm-大学生求职就业网3.zip
- 毕设-java web-ssm-都市供求信息网4.zip
- 毕设-java web-ssm-编程爱好者博客地带2.zip
- 毕设-java web-ssm-华奥汽车销售集团网源码6.zip
- 毕设-java web-ssm-进销存管理系统7.zip
- 毕设-java web-ssm-高校学生选课系统项目源码5.zip
- 毕设-java web-ssm-科研成果申报管理系统源码9.zip
- 毕设-java web-ssm-企业办公自动化系统11.zip
- 毕设-java web-ssm-科帮网javaWeb计算机配件报价系统项目源码8.zip
- 毕设-java web-ssm-图书馆管理系统项目源码14.zip