三子棋
前言
在学习c语言枯燥无味的语法中,当你学到了二维数组这个章节时,恭喜你,你已经具备了能写这个简易三子棋游戏的能力了,请耐心跟寻下文的思路,一步一步的教你写完这个游戏,当你能够写出这个游戏时,无疑会对你c语言编程能力有着更进一步的加强,还会从中获取到c语言的魅力所在,对之后的学习有着更充足的动力,所以一定要跟着我写出这个游戏!
流程图
打印菜单
建立棋盘
初始化棋盘
打印棋盘
玩家下棋
电脑下棋
制定获胜条件
模块
test.c ——测试游戏逻辑
game.h——关于游戏相关的函数声明,符号声明头文件的包含
game.c——游戏相关函数的实现
胜利条件判断
获胜 >三子连线 (行连线,列连线,对角线连线)
继续 >棋盘还有空
平局 >棋盘没有空
玩家获胜返回
' * '
电脑获胜返回
' # '
继续下棋返回
' c '
平局或者流局
' t '
主函数
利用switch函数来让玩家做一个简单的游戏菜单的选择,再在外面套用一个do-while循环,来达到让玩家重复游玩和选择
int main()
{
int input = 0;
do
{
srand((unsigned int)time(NULL));
menu();
printf("请选项>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
}
while (input);
return 0;
}
接下来是各个板块函数的实现,大家可以自己动手写一遍,当遇到难点时再返回过来看答案
函数的实现
- 打印菜单函数menu()
void menu()
{
printf("***********三子棋************\n");
printf("*********输1 开始游戏********\n");
printf("*********输0 退出游戏********\n");
printf("*****************************\n");
printf("*****************************\n");
}
- 初始化棋盘函数initboard(board, ROW, COL)
void initboard(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++)
{
board[i][j] = ' ';
}
}
}
- 打印棋盘函数printboard(char board[ROW][COL], int row, int col)
void printboard(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");
}
}
}
- 玩家移动函数playermove(char board[ROW][COL], int row, int col)
void playermove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = 0;
int y = 0;
printf("玩家请下棋>");
scanf("%d,%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("坐标已经被占用");
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
- 电脑移动computmove(char board[ROW][COL], int row, int col)
void computmove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋>\n");
while(1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
- 判断棋盘还有无空full(char board[ROW][COL], int row, int col)
int full(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++)
{
if (board[i][j] == ' ')
{
return 0;//继续
}
}
}
return 1;
}
- 胜利者判定
char winner(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][0]!=' ')
{
return board[i][0];
}
}
for (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 (full(board, row, col) == 1)
{
return't';
}
return'c';
}
-执行游戏的总函数game()
void game()
{
//存储数据-二维数据
char board[ROW][COL];
//判断条件
char ret;
//初始化棋盘
initboard(board, ROW, COL);
//打印棋盘
printboard(board, ROW, COL);
//玩家下棋和电脑下棋
//判断胜利
while (1)
{
playermove(board, ROW, COL);
printboard(board, ROW, COL);
ret=winner(board, ROW, COL);
if (ret != 'c')
{
break;
}
computmove(board, ROW, COL);
printboard(board, ROW, COL);
ret=winner(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("玩家获胜\n");
}
else if (ret == '#')
{
printf("电脑获胜\n");
}
else if (ret == 't')
{
printf("平局\n");
}
}
希望看到这里,你已经学会如何用c语言做一个简易的三子棋游戏了,恭喜你,你又进步一大截,下面是我写的源码,如果不想自己动手写游戏也可以直接复制我的源码在自己电脑里面运行
源码
test.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"
void game()
{
//存储数据-二维数据
char board[ROW][COL];
//判断条件
char ret;
//初始化棋盘
initboard(board, ROW, COL);
//打印棋盘
printboard(board, ROW, COL);
//玩家下棋和电脑下棋
//判断胜利
while (1)
{
playermove(board, ROW, COL);
printboard(board, ROW, COL);
ret=winner(board, ROW, COL);
if (ret != 'c')
{
break;
}
computmove(board, ROW, COL);
printboard(board, ROW, COL);
ret=winner(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '*')
{
printf("玩家获胜\n");
}
else if (ret == '#')
{
printf("电脑获胜\n");
}
else if (ret == 't')
{
printf("平局\n");
}
}
void menu()
{
printf("***********三子棋************\n");
printf("*********输1 开始游戏********\n");
printf("*********输0 退出游戏********\n");
printf("*****************************\n");
printf("*****************************\n");
}
int main()
{
int input = 0;
do
{
srand((unsigned int)time(NULL));
menu();
printf("请选项>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
}
while (input);
return 0;
}
game.h
#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 printboard(char board[ROW][COL], int row, int col);
void playermove(char board[ROW][COL], int row, int col);
void computmove(char board[ROW][COL], int row, int col);
char winner(char board[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"game.h"
void initboard(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++)
{
board[i][j] = ' ';
}
}
}
void printboard(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");
}
}
}
void playermove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = 0;
int y = 0;
printf("玩家请下棋>");
scanf("%d,%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("坐标已经被占用");
}
else
{
printf("输入错误,请重新输入\n");
}
}
}
void computmove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋>\n");
while(1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int full(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++)
{
if (board[i][j] == ' ')
{
return 0;//继续
}
}
}
return 1;
}
char winner(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][0]!=' ')
{
return board[i][0];
}
}
for (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 (full(board, row, col) == 1)
{
return't';
}
return'c';
}