设计思路:
一.主体函数的设计:
设计一个菜单函数,通过选择判定是否选择进入游戏,选择进入时则进入三子棋游戏程序,代码块如下
int main()
{
int quit = 0;
int select = 0;
while (!quit)
{
Menu();
scanf("%d", &select);
switch (select)
{
case 1:
Game();
printf("要不要再来一次?\n");
break;
case 2:
printf("拜拜!\n");
quit = 1;
break;
default:
printf("输入有误,请从新输入!\n");
break;
}
}
二.对菜单函数Menu()进行设计编写
void Menu()
{
printf("########################\n");
printf("1.enter###########2.quit\n");
printf("########################\n");
printf("请输入您的选择!\n");
}
三.对游戏函数Game()进行编写的思路:
1.棋子的储存和显示需要定义一个二维数组board[3][3];
2.棋盘的显示:定义一个函数ShowBoard();
3.用户棋子的下落,定义一个函数Playmove();
4.棋局情况的判断,定义一个函数Judge();
5.电脑棋子的下落,定义一个函数Compmoce();
6.再次进行棋局情况判定;
7.根据判定函数的返回值确定棋局的情况,做出相对应的反应;
void Game()
{
srand((unsigned)time(NULL));//种下随机数种子,系统随机下棋;
char board[COW][LINE];//储存棋子,X O;
memset(board, ' ', sizeof(board));// 将所有所有格子换成空格;
char result = 'x';
do
{
ShowBoard(board,COW,LINE);
Playmove(board,COW,LINE);
result = Judge(board, COW, LINE);
if (result != NEXT)
{
ShowBoard(board, COW, LINE);
break;
}
Compmove(board, COW, LINE);
result = Judge(board, COW, LINE);
if (result != NEXT)
{
ShowBoard(board, COW, LINE);
break;
}
} while (1);
if (result == PLAY)
{
printf("恭喜你,你赢了\n");
}
else if (result == COMP)
{
printf("很遗憾,你输了\n");
}
else
{
printf("和棋,继续努力\n");
}
}
四.对Game()函数进行整体设计后,对其中的部分进行设计
1.棋盘的显示ShowBoard():
利用‘|’和‘——’来构建棋盘,利用memset将二维数组全部初始化为空格,将其与横竖划线共同输出构成空白棋盘;
void ShowBoard(char board[][LINE], int cow, int line)
{
printf("\n");
printf(" | 1 | 2 | 3 |\n--------------------\n");
for (int i = 0; i < cow; i++)
{
printf(" %d |", i + 1);
for (int j = 0; j < line; j++)
{
printf(" %c |", board[i][j]);
}
printf("\n--------------------\n");
}
2.玩家落子的显示Playmove():
先判断输入的数字转化为二维数组下标后是否符合规范,并且对应的地方是否没有落子,即是否是空格,如若符合,则将用户定义的棋子’X’赋值给下标对应的二维数组,那么对应的棋盘出就会显示出对应的棋子‘X’;
void Playmove(char board[][LINE], int cow, int line)//玩家落子
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入你的坐标# ");
scanf("%d %d", &x, &y);
if (x<1 || x>3 || y<1 || y>3)
{
printf("你输入的坐标有误,请从新输入\n");
continue;
}
else if (board[x - 1][y - 1] != ' ')
{
printf("你输入的坐标有误,请从新输入\n");
continue;
}
else
{
board[x - 1][y - 1] = PLAY;
}
break;
}
}
3.判断函数的设立Judge();
分别判断棋局的每行,每列,两条对角线是否布忙了相同的棋子,如若相同则代表已经分出胜负,则返回相对应的棋子,如果没有则判断是否还有空格,还有空格则表示棋局还没有结束,返回’N’。如果没有空格,又没有返回对应的棋子即分出胜负则代表和棋,返回‘D’;
char Judge(char board[][LINE], int cow, int line)//系统判断棋局情况
{
for (int i = 0; i < cow; i++)//每行是否一样
{
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] != ' ')
{
return board[i][0];
}
}
for (int i = 0; i < line; 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][0] != ' ')
{
return board[0][0]; //两个对角是否一样
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[0][2] != ' ')
{
return board[0][2];
}
for (int i = 0; i < cow; i++)
{
for (int j = 0; j < line; j++) //还有没有空格,有空格则还没下完;
{
if (board[i][j] == ' ')
{
return NEXT;
}
}
}
return DRAW;
}
4.电脑下子的显示Compmove():
前面已经种下了随机数种子,则产生的随机数对行数和列数分别求余产生的值作为二维数组的下标,再通过判断对应的二维数组元素是否为空格,如果是空格则代表还是没有落子的地方,显示电脑棋子’O’;
void Compmove(char board[][LINE], int cow, int line)
{
while (1)
{
int x = rand() % cow;
int y = rand() % line;
if (board[x][y] == ' ') //电脑随机落子;
{
board[x][y] = COMP;
break;
}
}
}
整体代码如下
#pragma once
#include <stdio.h>
#include <windows.h>
#pragma warning (disable :4996)
#include <time.h>
#define PLAY 'x'
#define COMP 'o'
#define NEXT 'N'
#define DRAW 'D'
#define COW 3
#define LINE 3
void Menu();
void Game();
void ShowBoard();
void Playmove();
char Judge();
#include "game.h"
void Menu()
{
printf("########################\n");
printf("1.enter###########2.quit\n");
printf("########################\n");
printf("请输入您的选择!\n");
}
void ShowBoard(char board[][LINE], int cow, int line)
{
printf("\n");
printf(" | 1 | 2 | 3 |\n--------------------\n");
for (int i = 0; i < cow; i++)
{
printf(" %d |", i + 1);
for (int j = 0; j < line; j++)
{
printf(" %c |", board[i][j]);
}
printf("\n--------------------\n");
}
}
void Playmove(char board[][LINE], int cow, int line)//玩家落子
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入你的坐标# ");
scanf("%d %d", &x, &y);
if (x<1 || x>3 || y<1 || y>3)
{
printf("你输入的坐标有误,请从新输入\n");
continue;
}
else if (board[x - 1][y - 1] != ' ')
{
printf("你输入的坐标有误,请从新输入\n");
continue;
}
else
{
board[x - 1][y - 1] = PLAY;
}
break;
}
}
char Judge(char board[][LINE], int cow, int line)//系统判断棋局情况
{
for (int i = 0; i < cow; i++)//每行是否一样
{
if (board[i][0] == board[i][1] && \
board[i][1] == board[i][2] && \
board[i][0] != ' ')
{
return board[i][0];
}
}
for (int i = 0; i < line; 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][0] != ' ')
{
return board[0][0]; //两个对角是否一样
}
if (board[0][2] == board[1][1] && \
board[1][1] == board[2][0] && \
board[0][2] != ' ')
{
return board[0][2];
}
for (int i = 0; i < cow; i++)
{
for (int j = 0; j < line; j++) //还有没有空格,有空格则还没下完;
{
if (board[i][j] == ' ')
{
return NEXT;
}
}
}
return DRAW;
}
void Compmove(char board[][LINE], int cow, int line)
{
while (1)
{
int x = rand() % cow;
int y = rand() % line;
if (board[x][y] == ' ') //电脑随机落子;
{
board[x][y] = COMP;
break;
}
}
}
void Game()
{
srand((unsigned)time(NULL));//种下随机数种子,系统随机下棋;
char board[COW][LINE];//储存棋子,X O;
memset(board, ' ', sizeof(board));// 将所有所有格子换成空格;
char result = 'x';
do
{
ShowBoard(board,COW,LINE);
Playmove(board,COW,LINE);
result = Judge(board, COW, LINE);
if (result != NEXT)
{
ShowBoard(board, COW, LINE);
break;
}
Compmove(board, COW, LINE);
result = Judge(board, COW, LINE);
if (result != NEXT)
{
ShowBoard(board, COW, LINE);
break;
}
} while (1);
if (result == PLAY)
{
printf("恭喜你,你赢了\n");
}
else if (result == COMP)
{
printf("很遗憾,你输了\n");
}
else
{
printf("和棋,继续努力\n");
}
}
#include "game.h"
int main()
{
int quit = 0;
int select = 0;
while (!quit)
{
Menu();
scanf("%d", &select);
switch (select)
{
case 1:
Game();
printf("要不要再来一次?\n");
break;
case 2:
printf("拜拜!\n");
quit = 1;
break;
default:
printf("输入有误,请从新输入!\n");
break;
}
}
system("pause");
return 0;
}