目录
三子棋规则
三子棋游戏运行步骤
一、代码构成
游戏模块图
如何在vs编译器中建立game.c和game.h文件
建立test.c文件和game.c文件
建立game.h头文件
新建完文件
二、游戏代码和讲解
程序步骤
1.建立菜单(游戏选择界面)
2.用switch语句来实现选择
3.定义一个char类型的数组
4.初始化棋盘
5.打印棋盘函数(九宫格)
6.玩家下棋
7.电脑下棋
8.判断游戏状态函数
三、全部代码如下
game.h
game.c
test.c
三子棋规则
将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了
三子棋游戏运行步骤
- 进入游戏界面
- 选择进入游戏或者退出游戏
- 输入1或者0来实现进入游戏或者退出游戏
- 棋盘进行初始化处理
- 打印空棋盘
- 玩家进行下棋
- 电脑下棋
- 判断输赢
判断输赢分为: 玩家赢 电脑赢 棋盘无空位(双方平局) 继续下棋(返回第6步)
一、代码构成
游戏模块图
main函数在test.c文件中,test.c文件里编写测试游戏逻辑,game.c里进行函数的实现,game.h文件里进行函数的声明。通过#include "game.h"来调用。
如何在vs编译器中建立game.c和game.h文件
建立test.c文件和game.c文件
建立game.h头文件
新建完文件
二、游戏代码和讲解
程序步骤
- 程序运行进入游戏菜单栏
- 定义一个char类型的数组
- 初始化棋盘
- 打印空棋盘(九宫格)
- 玩家下棋函数
- 电脑下棋函数
- 判断游戏状态函数
1.建立菜单(游戏选择界面)
void menu()
{
printf("***********************\n");
printf("******1. 开始游戏******\n");
printf("******0. 退出游戏******\n");
printf("***********************\n");
}
这样就拥有了游戏开始界面
2.用switch语句来实现选择
do
{
menu();
printf("请选择|:");
scanf("%d", &input);
switch (input)
{
case 1:
/*printf("游戏开始\n");*/
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入!\n");
break;
}
} while (input);
这里定义一个整形变量 当input为0时,跳出do...while循环。
输入1 进入游戏
输入0 退出游戏
输入其他数字 则输出( 输入错误,重新输入 ) input不为0,则继续进入循环。
3.定义一个char类型的数组
在game.h中定义 ROW COL 为3 方便后期的调整
#define ROW 3
#define COL 3
在game函数里定义一个char类型的素组
char board[ROW][COL] = { 0 };
#include"game1.h"
记得引用game.h的头文件。
4.初始化棋盘
头文件game.h 声明
void NewRoard(char board[ROW][COL], int row, int col);
在test.c 调用 NewRoard 函数
//棋盘初始化
NewRoard(board, ROW, COL);
在game.c中完成函数的实现
void NewRoard(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] = ' ';
}
}
}
5.打印棋盘函数(九宫格)
九宫格由符号来实现 横线使用 --- 竖线使用 |
代码顺序(头文件、test.c、game.c)
void PriRoard(char board[ROW][COL], int row, int col);
PriRoard(board, ROW, COL);
void PriRoard(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 < row; j++)
{
printf("---");
if(j<row-1)
printf("|");
}
}
printf("\n");
}
}
6.玩家下棋
由于玩家不一定是程序员,不知道数组起始是0,也为了方便游玩的时候使用方便,玩家输入1-3 之间的两个数字进入 函数编写时要进行减运算
代码顺序(头文件、test.c、game.c)
void PlayRoard(char board[ROW][COL], int row, int col);
PlayRoard(board, ROW, COL);
void PlayRoard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家请下棋\n");
while (1)
{
printf("玩家请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= row)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("位置已被占用,请重新输入\n");
}
}
else
{
printf("输入错误,重新输入\n");
}
}
}
7.电脑下棋
这里使用srand函数来生成随机数
需要用到 #include<stdlib.h> #include<time.h>
用rand进行调用,将rand的随机数%(模)3得到0-2随机数
代码顺序(头文件、test.c、game.c)
void CompRoard(char board[ROW][COL], int row, int col);
CompRoard(board, ROW, COL);
void CompRoard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
8.判断游戏状态函数
判断游戏状态可以分为 玩家赢 电脑赢 平局(棋盘满) 继续
编写一个函数 当玩家赢的时候返回 " * "
" # "
" Q "
" C "
代码顺序(test.c、game.c)
IsWin(board, ROW, COL);
int IsFull(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++)
{
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][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[0][0];
}
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';
}
三、全部代码如下
game.h
#pragma once
#define ROW 3
#define COL 3
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
void NewRoard(char board[ROW][COL], int row, int col);
void PriRoard(char board[ROW][COL], int row, int col);
void PlayRoard(char board[ROW][COL], int row, int col);
void CompRoard(char board[ROW][COL], int row, int col);
char IsWin(char board[ROW][COL], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game1.h"
void NewRoard(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 PriRoard(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 < row; j++)
{
printf("---");
if(j<row-1)
printf("|");
}
}
printf("\n");
}
}
void PlayRoard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家请下棋\n");
while (1)
{
printf("玩家请输入坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= row)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("位置已被占用,请重新输入\n");
}
}
else
{
printf("输入错误,重新输入\n");
}
}
}
void CompRoard(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(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++)
{
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][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[0][0];
}
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';
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game1.h"
void game()
{
printf("游戏开始\n");
//存放数组
char board[ROW][COL] = { 0 };
//棋盘初始化
NewRoard(board, ROW, COL);
//打印棋盘
PriRoard(board, ROW, COL);
char ret = 0;
while (1)
{
//玩家下棋
PlayRoard(board, ROW, COL);
//打印棋盘
PriRoard(board, ROW, COL);
//判断输赢
ret=IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
电脑下棋
CompRoard(board, ROW, COL);
打印棋盘
PriRoard(board, ROW, COL);
判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
printf("玩家赢\n");
else if (ret == '#')
printf("电脑赢\n");
else if (ret == 'Q')
printf("平局\n");
}
void menu()
{
printf("***********************\n");
printf("******1. 开始游戏******\n");
printf("******0. 退出游戏******\n");
printf("***********************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择|:");
scanf("%d", &input);
switch (input)
{
case 1:
/*printf("游戏开始\n");*/
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入!\n");
break;
}
} while (input);
return 0;
}