课后作业
题目要求:制作一个三子棋游戏
三子棋程序流程图
头文件game.h
主要包含了基本库函数,宏定义和函数声明
#ifndef __GAME_H__
#define __GAME_H__
#include <stdio.h>
#include <stdlib.h>//使用srand函数生成随机种子
#include <time.h>//使用time函数生成随机起点
#define LINE 3//棋盘横向宽度
#define ROW 3//棋盘纵向宽度
void IntialBoard(char board[LINE][ROW], int line, int row);//初始化棋盘函数
void DisplayBoard(char board[LINE][ROW], int line, int row);//打印棋盘函数
void PlayerMove(char board[LINE][ROW], int line, int row);//玩家下棋函数
char IsWin(char board[LINE][ROW], int line, int row);//判断是否有胜出者
int IsFull(char board[LINE][ROW], int line, int row);//判断是否平局
void ComputerMove(char board[LINE][ROW], int line, int row);//电脑下棋函数
#endif __GAME_H__
游戏相关源文件game.c
主要包含了头文件中声明函数的定义部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void IntialBoard(char board[LINE][ROW], int line, int row)
{
int i = 0;
int j = 0;
for(i=0; i< line; i++)//初始化棋盘,按从左到右,从上到下的顺序给棋盘数组赋值空格
{
for(j=0; j <row; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[LINE][ROW], int line, int row)
{
int i = 0;
int j = 0;
int tmp = 0;
// 棋盘的样子
//
// 数组 | | 纵向分割行
// ---|---|--- 横向分割行
// | |
// ---|---|---
// | |
for(i=0; i<line; i++)//按行打印棋盘数组和棋盘其他内容
{
for(j=0; j<row; j++)//打印完一行棋盘数组
{
printf(" %c ",board[i][j]);
if(j < row-1)//打印棋盘数组之间的在纵向分割行
printf("|");
}
printf("\n");//打印完棋盘数组和纵向分割行,换行打印横向分割行
if(i < line-1)//判断是否是最后一行,最后一行不打印分割行
{
for(j=0; j<row; j++)//打印对应棋盘数组下方分割行
{
printf("---");
if(j < row-1)
printf("|");
}
}
printf("\n");//打印完分割行,换行继续打印下一行
}
}
void PlayerMove(char board[LINE][ROW], int line, int row)
{
int x = 0;
int y = 0;
do
{
printf("* 玩家回合 *\n");
printf("* 请输入座标(例如1 1): *\n");
scanf("%d %d", &x, &y);
if(x>=1 && x<=3 && y>=1 && y<=3)//判断座标是否合法
{
if(board[x-1][y-1] == ' ')//判断此处是否已有棋子
{
board[x-1][y-1] = '*';
break;
}
else
printf("* 此座标已有棋子 *\n");
}
else
printf("* 座标非法 *\n");
}while(1);
}
int IsFull(char board[LINE][ROW], int line, int row)
{
int i = 0;
int j = 0;
for(i=0; i<line; i++)//两次循环判断棋盘中是否还有空位
{
for(j=0; j<row; j++)
{
if(board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(char board[LINE][ROW], int line, int row)
{
int i = 0;
for(i=0; i<line; 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<row; 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]!=' ' || board[0][2]==board[1][1]&&board[1][1]==board[2][0]&&board[1][1]!=' ')//判断两条对角线是否有人胜出
{
return board[1][1];
}
if(1 == IsFull(board, line, row))
return 'E';
else
return 'C';
}
void ComputerMove(char board[LINE][ROW], int line, int row)
{
int x = 0;
int y = 0;
srand((unsigned int) time(NULL));//以时间为随机起点设置随机种子
printf("* 电脑回合 *\n");
do
{
x = rand()%3;//随机生成0~2的数
y = rand()%3;
if(board[x][y] == ' ')//判断棋盘状态并下棋
{
board[x][y] = '#';
break;
}
}while(1);
}
游戏主体源文件test.c
包含了主函数和基本游戏思路
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void introduction()//游戏说明
{
printf("******************************\n");
printf("* 本游戏名称为三 *\n");
printf("* 子棋,玩家和电脑轮 *\n");
printf("* 流在棋盘上下棋,当 *\n");
printf("* 某一方的三个棋子可 *\n");
printf("* 以连成一条直线时, *\n");
printf("* 那一方获胜 *\n");
printf("* *\n");
printf("******************************\n");
}
void game()
{
char board[LINE][ROW];//定义棋盘数组
char win_lose =' ';
IntialBoard(board, LINE, ROW);//初始化棋盘数组
DisplayBoard(board, LINE, ROW);//打印棋盘
while(1)
{
PlayerMove(board, LINE, ROW);//玩家移动
DisplayBoard(board, LINE, ROW);//打印棋盘
win_lose = IsWin(board, LINE, ROW);//判断输赢
if(win_lose != 'C')//返回C游戏继续
break;
ComputerMove(board, LINE, ROW);//电脑移动
DisplayBoard(board, LINE, ROW);//打印棋盘
win_lose = IsWin(board, LINE, ROW);//判断输赢
if(win_lose != 'C')
break;
}
if(win_lose == '*')//返回*玩家胜利
printf("玩家胜利!!!\n");
else if(win_lose == '#')//返回#电脑胜利
printf("电脑胜利!!!\n");
else if(win_lose == 'E')//返回E平局
printf("平局!!!\n");
}
int menu()//菜单函数,进行选择
{
int choose = 0;
do
{
printf("******************************\n");
printf("* 三子棋 v1.0 *\n");
printf("******************************\n");
printf("* 菜单 *\n");
printf("* 1.游玩 *\n");
printf("* 2.说明 *\n");
printf("* 3.退出 *\n");
printf("******************************\n");
printf("* 请输入您的选择 *\n");
printf("******************************\n");
scanf("%d",&choose);
switch(choose)//根据choose的值,进入各项功能
{
case 1: game();//进入游戏函数
break;
case 2: introduction();//进入游戏说明
break;
case 3: //退出游戏
{
printf("* 退出游戏 *\n");
return 0;
}
default:printf("* 输入错误 *\n");//默认提示
break;
}
}while(choose !=3);
}
int main()
{
menu();
return 0;
}
课后作业源文件下载
链接: 资源下载