2018年4月21日
今天分享一个简单的三子棋游戏的程序。首先看程序:
头文件 game.h :
#ifndef _GAME_H_
#define _GAME_H_
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#define ROW 3 //棋盘行数
#define COL 3 //棋盘列数
void menu(void);//游戏菜单
void game(void);//三子棋游戏
#endif
源文件 game.c :
#include "game.h"
//游戏菜单
void menu(void)
{
system("cls");//每次显示菜单时清屏
printf("**********************************************\n");
printf("****** 欢迎来到三子棋游戏 ******\n");
printf("****** ******\n");
printf("****** 1.开始游戏 ******\n");
printf("****** 0.退出 ******\n");
printf("****** ******\n");
printf("****** 适度游戏益脑 沉迷游戏伤身 ******\n");
printf("**********************************************\n");
}
//初始化棋盘
static void initBoard(char board[][COL])
{
int i, j;
for (i = 0; i < ROW; i++){
for (j = 0; j < COL; j++){
board[i][j] = ' ';
}
}
}
//显示棋盘内容
static void showBoard(char board[][COL])
{
int i;
system("cls");//每次显示棋盘时清屏
for (i = 0; i < ROW; i++){
printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);
if (i < ROW - 1)
printf("-----------\n");
}
}
//玩家落子
static void playerSet(char board[][COL])
{
int x, y;
printf("请玩家落子<x,y>:");
while (1){
scanf("%d%d", &x, &y);
if (x<1 || x>ROW || y<1 || y>COL)
printf("落子请落在棋盘上!请重新落子<x,y>:");
else if (board[x - 1][y - 1] != ' ')
printf("落子请落在空位!请重新落子<x,y>:");
else{
board[x - 1][y - 1] = 'o';
break;
}
}
}
//电脑随机落子
static void computerSet(char board[][COL])
{
int x, y;
while (1)
{
x = rand() % 3;
y = rand() % 3;
if (x > -1 && x<ROW && y>-1 && y < COL && board[x][y] == ' '){
board[x][y] = 'x';
break;
}
}
}
//玩家获胜返回字符'o',电脑获胜返回字符'x',否则返回字符' '
static char isWin(char board[][COL])
{
int i;
//行相等
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[0][2] == board[1][1] && board[1][1] == board[2][0]) && \
board[1][1] != ' ')
return board[1][1];
return ' ';
}
//判断棋盘是否已满,已满返回1,未满返回0
static int isFull(char board[][COL])
{
int i, j;
for (i = 0; i < ROW; i++){
for (j = 0; j < COL; j++){
if (' ' == board[i][j])
return 0;
}
}
return 1;
}
//三子棋游戏
void game(void)
{
char board[ROW][COL];
int flag;
//初始化棋盘
initBoard(board);
//初始化先手标志
printf("玩家先手请输入1,电脑先手请输入0:");
while (1){
scanf("%d", &flag);
if (0 == flag || 1 == flag)
break;
else
printf("输入错误!请按提示重新输入:");
}
//显示棋盘
showBoard(board);
//棋盘为空时轮流落子
while (0 == isFull(board)){
//玩家落子
if (1 == flag){
playerSet(board);
showBoard(board);
if ('o' == isWin(board)){
printf("恭喜你!你赢了!\n");
break;
}
flag = 0;
}
//电脑落子
else{
computerSet(board);
showBoard(board);
if ('x' == isWin(board)){
printf("很可惜!你输了!\n");
break;
}
flag = 1;
}
}
//判断是否为平局
if (' ' == isWin(board))
printf("平局!\n");
}
源文件 test.c :
#include "game.h"
//三子棋游戏
int main(void)
{
int input1, input2, flag;
flag = 1;
srand((unsigned)time(NULL));//随机数种子
do{
input2 = 1;
//显示菜单
menu();
if (flag)
printf("请按菜单提示输入选择:");
else
printf("输入错误!请按菜单提示输入选择:");
scanf("%d", &input1);
flag = 1;
switch (input1)
{
case 0:
printf("祝您生活愉快!再见!\n");
break;
case 1:
do{
switch (input2)
{
case 0:
flag = 1;
break;
case 1:
game();
printf("再来一局请输入1,返回菜单请输入0:");
break;
default:
printf("输入错误!请按提示重新输入:");
break;
}
scanf("%d", &input2);
} while (input2);
break;
default:
flag = 0;
break;
}
} while (input1);
system("pause");
return 0;
}
欢迎并感谢大家在下面留言交流看法。
作者小丿萝卜,来自美丽的大重庆。
我的C故事系列主要写我在C中发现的有趣的代码或者算法。
如果大家觉得我的分享对大家学习了解C有一点点帮助,欢迎关注我的博客。
我的联系方式:微信:zhongdaidongzdd QQ:1161665939。欢迎一起交流编程知识。