使用工具:VS2017
代码分为三部分 game.h(函数声明) game.c(实现函数功能) test.c(main函数)
棋盘为3*3的矩阵
规则:
1.每回合玩家与电脑只能放置一枚棋子
2.已有棋子的位置不能再放置棋子
3.若有一方的三枚棋子可连城一条直线,则胜利
4.若棋盘棋子已经布满,但是双方没有一方胜利,则平局
注:1.此程序设计的电脑走的方式是产生一个随机值作为坐标,较为简单,可改进,让电脑更加智能
2.#define _CRT_SECURE_NO_WARNINGS 这句代码是为了不让scanf 报错
game.h部分
#ifndef __GAME_H__
#define __GAME_H__
#define ROL 3 //行
#define ROW 3 //列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include <windows.h>
void menu(void);//开始菜单
void init(char arr[ROL][ROW], int rol, int row);//初始化数组
void checkerboard(void);//游戏棋盘
void playermove(char arr[ROL][ROW],int rol,int row); //玩家走
void comermove(char arr[ROL][ROW], int rol, int row); //电脑走
int win(char arr[ROL][ROW], int rol, int row); //判断胜利
#endif // __GAME_H__
game.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu(void)//开始菜单
{
printf("************************\n");
printf("*** 1.开始 0.退出 ***\n");
printf("************************\n\n");
}
void init(char arr[ROL][ROW], int rol, int row)//初始化数组
{
int i = 0;
int j = 0;
for (i = 0; i < rol; i++)
{
for (j = 0; j < row; j++)
{
arr[i][j] = ' ';//将数组的所有元素初始化为一个空格
}
}
}
void checkerboard(char arr[ROL][ROW], int rol, int row)//打印游戏棋盘
{
int i = 0;
for (i = 0; i < rol; i++)
{
printf("************************\n");
printf("* | | *\n");
printf("* %c | %c | %c *\n",arr[i][0],arr[i][1],arr[i][2]);
printf("* | | *\n");
if (2 == i)
printf("************************\n");
}
}
void playermove(char arr[ROL][ROW], int rol, int row)//玩家玩
{
int x = -1;
int y = -1;
while (1)
{
printf("玩家走\n请输入坐标:>");
scanf("%d%d", &x, &y);
if ((x - 1) < rol && (x - 1) >= 0 && (y - 1) < row && (y - 1) >= 0)
{
if (arr[x-1][y-1] == ' ')
{
arr[x - 1][y - 1] = 'X';
break;
}
else
{
printf("此坐标已有棋子,请重新选择坐标!\n");
}
}
else
{
printf("输入坐标错误!\n");
}
}
}
void comermove(char arr[ROL][ROW], int rol, int row)//电脑走
{
int x = -1;
int y = -1;
printf("电脑走:>\n");
while (1)
{
x = rand() % rol;
y = rand() % row; //取余数是为了保证x,y在棋盘的范围内 即 0 1 2
if (x< rol && x >= 0 && y < row && y >= 0)
{
if (arr[x][y] == ' ')
{
arr[x][y] = '@'; //电脑的棋子用@代替
break;
}
}
}
}
//判断输赢
int win(char arr[ROL][ROW], int rol, int row)
{
int i = 0;
int j = 0;
int execute = 1;
for (i = 0; i < rol; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(rol-2)&& i<(row - 2)
|| arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(row-2)
|| arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(rol-2)
|| arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(rol-2)&&(j>=2)) // 判断玩家是否赢
{
printf("恭喜你赢了!\n");
return 1;
}
}
}
for (i = 0; i < rol; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == '@'&&arr[i + 1][j + 1] == '@'&&arr[i + 2][j + 2] == '@'&& i<(rol - 2) && i<(row - 2)
|| arr[i][j] == '@'&&arr[i][j + 1] == '@'&&arr[i][j + 2] == '@'&&j<(row - 2)
|| arr[i][j] == '@'&&arr[i + 1][j] == '@'&&arr[i + 2][j] == '@'&&i<(rol - 2)
|| arr[i][j] == '@'&&arr[i + 1][j - 1] == '@'&&arr[i + 2][j - 2] == '@' && i<(rol - 2) && (j >= 2))// 判断电脑是否赢
{
printf("电脑赢了!\n");
return 1;
}
}
}
for (i = 0; i < rol; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == ' ')
{
execute = 0;
}
}
}
if(1 == execute)
{
printf("平局!\n");
return 1;
}
return 0;
}
test.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
int main()
{
int start = 0;
int i = 0;
int w = -1;
char arr[ROL][ROW] = { 0 };
srand((unsigned int)time(NULL));
while(1)
{
if (i == 0)
{
menu();
init(arr, ROL, ROW);
printf("请选择是否开始游戏(1/0):>");
}
i = 1; //i用来控制 if (i == 0)中的语句是否进行
scanf("%d", &start);
switch (start)
{
//case 1: 表示游戏开始
//case 0: 表示退出游戏
// default: 表示输入错误
case 1:
checkerboard(arr, ROL, ROW);
while (1)
{
playermove(arr, ROL, ROW);
system("cls");
checkerboard(arr, ROL, ROW);
system("cls");
if(win(arr, ROL, ROW)==1)
{
i = 0;
break;
}
comermove(arr, ROL, ROW);
checkerboard(arr, ROL, ROW);
if (win(arr, ROL, ROW) == 1)
{
i = 0;
break;
}
}
break;
case 0:
printf("游戏退出!\n");
system("pause");
return 0;
break;
default:
printf("输入错误!请重新输入:");
break;
}
}
return 0;
}
游戏界面
开始游戏
游戏胜利,是否再次游戏

本文介绍了一个简单的3x3五子棋游戏的设计与实现过程,使用C语言编程,涉及VS2017环境下的游戏逻辑实现,包括玩家与电脑对弈的功能。文章详细展示了游戏的代码结构及主要功能模块。
619

被折叠的 条评论
为什么被折叠?



