c语言编写程序思路:主要分为三个主要文件——测试模块(test.c)、游戏模块(game.c)、游戏调用模块(game.h)。
目录
前引
测试模块(主要由引用函数构成)
存放游戏菜单,设置游戏的开始、游戏方式逻辑、判断胜利、结束等整套流程的主要模块。
游戏模块(游戏运行函数主题)
存放测试模块中引用的具体游戏函数表达式
游戏调用模块(游戏头文件)
类型为头文件,通过它将游戏模块与测试模块联系起来,在其中申明函数,设置全局可控变量,调用库函数等全局操作。
一、基本思路
1 . 玩法构思
经典游戏三子连线及为胜利(胜利条件判断)
2.菜单构建
选择开始游戏或离开游戏
3.地图构建及设计
4.游戏运行
(1) 棋盘打印
设置建立数组接收棋盘(map)
初始化棋盘(map)
(2)玩家下棋
输入坐标
判断坐标是否合法(是否超出棋盘范围,是否为空位)
更改数组数据
打印棋盘
判断是否胜利
(3)电脑下棋
建立随机行列数
判断坐标合理性
更改数组数据
打印棋盘
判断是否胜利
(4)结果打印及继续游戏
结果输出
重新进入菜单
//及时打印棋盘,实现人机交互。
二、实例代码
1.游戏调用模块(文件名game.h)
#pragma once
//库函数调用
#include<stdio.h>
#include<string.h>
#include<time.h>
#include <stdlib.h>
//数组定义
#define R 3//棋盘行列定义可简易更改
#define L 3
//函数申明
void Initmap(char map[R][L], int r, int l);//初始化地图
void printmap(char map[R][L], int r, int l);//打印地图
void playermove(char map[R][L]);//玩家移动
void computermove(char map[R][L]);//电脑移动
char win(char map[R][L],int r,int l);//胜利条件判断
2. 测试模块(test.c)
#include"game.h"
void menu()//菜单构建
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("***** 0.leave *****\n");
printf("********************\n");
}
void game()//游戏模块主程序
{
char map[R][L] = { ' ' };
char ret='c';
srand((unsigned int)time(NULL));
Initmap(map, R, L);
printmap(map, R, L);
while(1)
{
playermove(map);
ret=win(map, R, L);
if (ret == '*')
{
printf("你赢了\n");
break;
}
if (ret == 'T')
{
printf("——>平局<——\n");
}
computermove(map);
ret=win(map, R, L);
if (ret == '#')
{
printf("你输了!!!");
break;
}
}
main();
}
int main()//整体函数主函数
{
int input = 0;
menu();
printf("请选择:>");
scanf_s("%d", &input);
switch (input) {
case 1:
printf("—— > 开始游戏 < —— \n");
game();
break;
case 0:
printf("感谢游玩!!!");
break;
default:
printf("输入错误,请重新输入!!!");
break;
}
return 0;
}
3.游戏模块(game.c)
#include"game.h"
void Initmap( char map[R][L], int r, int l)
{
int i;
int j;
for (i = 0; i <l; i++)
{
for (j = 0; j < r; j++)
{
map[i][j] = ' ';
}
}
}
void printmap(char map[R][L], int r, int l)
{
int i=0;
int j=0;
for (i = 0;i < l;i++)
{
for (j = 0;j < r;j++)
{
printf(" %c ", map[i][j]);//此处不可使用&
if (j < r - 1)
printf("|");
}
printf("\n");
if (i < r - 1)
{
int j = 0;
for (j = 0; j < l; j++)
{
printf("---");
if (j<l - 1)
printf("|");
}
printf("\n");
}
}
}
void playermove(char map[R][L])
{
printf(">玩家下棋<\n");
while (1)
{
int r=4 ;
int l=4 ;
printf("请输入要下的坐标:>");
scanf_s("%d %d", &r, &l);
if (r >= 1 && r <= 3 && l >= 1 && l <= 3)
{
if (map[r-1][l-1] == ' ')
{
map[r-1][l-1] = '*';
printmap(map, R, L);
break;
}
else
{
printf("位置已被占用\n");
}
}
else
{
printf("输入坐标格式错误\n");
}
}
}
void computermove(char map[R][L])
{
int r;
int l;
printf(">电脑下棋<\n");
while (1)
{
r = rand() % 3;
l = rand() % 3;
if (map[r][l] == ' ')
{
map[r][l] = '#';
printmap(map, R, L);
break;
}
}
}
char win(char map[R][L],int r,int l)
{
char c='T';
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < l; j++)
{
if (map[i][j] == ' ')
{
c = 'C';//检查地图是否下满
}
}
}
for (i = 0; i < r; i++)//判断三行
{
if (map[i][0] == map[i][1] && map[i][1] == map[i][2] && map[i][1] != ' ')
return map[i][1];
}
for (j = 0; j < l; j++)//判断三列
{
if (map[0][j] == map[1][j] && map[1][j] == map[2][j] && map[0][j] != ' ')
return map[i][1];
}
if (map[1][1] != ' ')//判断斜线
{
if (map[1][1] == map[0][0] && map[1][1] == map[2][2])
return map[1][1];
if (map[1][1] == map[0][2] && map[1][1] == map[2][0])
return map[1][1];
}
//游戏继续——C
//玩家胜利——*
//电脑胜利——#
//游戏平局——T
}
4.测试结果
三、总结
三子棋整体结构虽然不是很复杂,但其中对于游戏各模块的系统分工都有涉及。其中还有许多功能步骤还可以简化优化, 欢迎大家提出对代码的意见、建议。
以上就是C语言实现简单游戏——三子棋的全部过程,在visual studio 2019环境下实现