当前位置:网站首页>C语言:三子棋游戏
C语言:三子棋游戏
2022-07-27 14:27:00 【发发是只呆头鹅】
说到三子棋,我想大家一定不陌生吧,它也是我童年中的一部分,今天我们用C语言来实现一下简易版的三子棋。
首先,介绍一下游戏规则:
- 在一个九宫格上进行下棋;
- 玩家两名,双方先后落子;
- 若在一条直线上有三颗同一玩家的棋子,则该玩家赢,若棋盘下满也没有出现三颗棋子在一条直线上,则为平局。
设计思路如下:
1.用do…while循环可以保证玩完一把还能接着玩,玩家可以自行选择继续玩还是退出。
2.用一个3x3的二维数组来存放玩家和电脑下的棋子,再进行判断输赢。
3.进行游戏的棋盘如下:
代码如下:
头文件game.h:
#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);
//判断游戏输赢
//要返回4种不同的状态
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - ‘Q’
//继续 - 'C'
测试文件test.c:
#include"game.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);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请输入:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
game函数里的函数,game.c文件:
#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 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");
}
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
printf("玩家走:>\n");
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:>");
scanf("%d%d", &x, &y);//2 1 表示第二行第一列
if (x >= 1 && x <= row && y >= 1 && 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)
{
int x = 0;
int y = 0;
printf("电脑走:>\n");
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 < col; j++)
{
if (board[i][j] == ' ')
{
return 0;//不满
}
}
}
return 1;//棋盘满
}
char IsWin(char board[ROW][COL], int row, int col)
{
//行
for (int i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//列
for (int i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//对角线
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];
//判断平局
if (IsFull(board, row, col))
{
return 'Q';
}
//游戏继续
return 'C';
}
边栏推荐
- flutter —— 布局原理与约束
- 【剑指offer】面试题56-Ⅰ:数组中数字出现的次数Ⅰ
- Unity3d learning note 10 - texture array
- Huayun data creates a perfect information technology and innovation talent training system to help the high-quality development of information technology and innovation industry
- Selenium reports an error: session not created: this version of chromedriver only supports chrome version 81
- Distributed lock
- Read the wheelevent in one article
- Spark TroubleShooting整理
- 【剑指offer】面试题55 - Ⅰ/Ⅱ:二叉树的深度/平衡二叉树
- “router-link”各种属性解释
猜你喜欢

Leetcode-1737-满足三条件之一需改变的最少字符数

With just two modifications, apple gave styleganv2 3D generation capabilities

Spark 3.0 DPP实现逻辑

【剑指offer】面试题53-Ⅰ:在排序数组中查找数字1 —— 二分查找的三个模版

学习Parquet文件格式

MySQL interview 40 consecutive questions, interviewer, if you continue to ask, I will turn my face

Record record record

EMC design scheme of CAN bus

Leetcode-1737- minimum number of characters to change if one of the three conditions is met

Huayun data creates a perfect information technology and innovation talent training system to help the high-quality development of information technology and innovation industry
随机推荐
How "Crazy" is Hefu Laomian, which is eager to be listed, with capital increasing frequently?
Leetcode-1737-满足三条件之一需改变的最少字符数
Lua study notes
js运用扩展操作符(…)简化代码,简化数组合并
/dev/loop1占用100%问题
Spark Filter算子在Parquet文件上的下推
使用Prometheus监控Spark任务
Network device hard core technology insider router Chapter 15 from deer by device to router (Part 2)
After configuring corswebfilter in grain mall, an error is reported: resource sharing error:multiplealloworiginvalues
Spark 3.0 测试与使用
【剑指offer】面试题51:数组中的逆序对——归并排序
Leetcode-1737- minimum number of characters to change if one of the three conditions is met
STL value string learning
IJCAI 2022 outstanding papers were published, and 298 Chinese mainland authors won the first place in two items
Leetcode 244 week competition - post competition supplementary question solution [broccoli players]
Leetcode 341. flattened nested list iterator DFS, stack / medium
Network equipment hard core technology insider router Chapter 7 tompkinson roaming the network world (Part 2)
Network equipment hard core technology insider router Chapter 14 from deer by device to router (middle)
C language: factorial recursive implementation of numbers
$router.back(-1)