c语言采用多文件方式实现简单三子棋游戏 如下:
1.规则介绍:同行,同列,两个对角线实现三点连成一线。
这个代码可以实现简单的三子棋单机游戏,如有更好的idea,可以互相交流!
2.程序思路:打印菜单----->初始化并打印棋盘----->确定who first----->电脑或者人走棋------>判断是否三点连成一线,确定是否继续走棋------>如果不继续走棋则说明已有结果 即,谁赢谁输or平局
3.优化:采用硬币模型确定谁先走,实现清屏操作。
4.拓展:五子棋
5.函数接口设计时声明放在game.h
函数实现放在game.c
main.c实现游戏的主逻辑
main.c代码块如下:
#include "game.h"
void Menu()
{
printf("###################################\n");
printf("### 欢迎来到我的游戏厅 ###\n");
printf("###################################\n");
printf("###1.Play 2.Exit ###\n");
printf("###################################\n");
printf("请选择:> ");
}
int main()
{
int quit = 0;
while (!quit){
Menu();
int select = 0;
scanf("%d", &select);
switch (select){
case 1:
Game();
break;
case 2:
quit = 1; //退出
break;
default:
printf("你输错了,请重新输入!\n");
break;
}
}
printf("ByeBye!\n"); //case:2
system("pause");
}
game.h代码块如下:
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <time.h>
#include <windows.h>
#pragma warning(disable:4996)
#define ROW 3
#define COL 3
#define P_COLOR 'X'
#define C_COLOR 'o'
#define INIT ' '
void Game(); //编写的第一个接口Game的声明
void InitBoard(char board[][COL], int row, int col);
void ShowBoard(char board[][COL], int row, int col);
void ComputerMove(char board[][COL], int row, int col);
char Judge(char board[][COL], int row, int col);
#endif
game.c代码块如下
1.
#include"game.h"
2.对棋盘进行初始化:
void InitBoard(char board[][COL], int row, int col)
{
int i = 0;
for (; i < row; i++) {
int j = 0;
for (; j < col; j++) {
board[i][j] = INIT;
}
}
}
3.打印棋盘:当时我调试的时候展示的三子棋盘不规整,经过反复试,最后终于打印好啦。
void ShowBoard(char board[][COL], int row, int col)
{
printf(" 1 | 2 | 3 \n");
printf("---------------\n");
int i = 0;
for (; i < row; i++){
printf("%d |", i+1);
int j = 0;
for (; j < col; j++) {
printf("%c |", board[i][j]);
}
printf("\n");
printf("---------------\n");
}
}
4.电脑走棋:
用到了while死循环。
Sleep(1000)是为了给电脑思考时间
其中电脑走棋采用随机数生成:int x = rand() % row;
还可以写一个循环来让电脑更聪明,这里我没有敲。
void ComputerMove(char board[][COL], int row, int col)
{
while (1) {
Sleep(1000);
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ') {
board[x][y] = C_COLOR;
break;
}
}
}
5.判断行,列,以及两个对角线
char Judge(char board[][COL], int row, int col)
{
int i = 0;
for (; 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[i][0];
}
}
if (board[0][0] == board[1][1] && \
board[1][1] != ' ' && \
board[1][1] == board[2][2]) {
return board[1][1];
}
if (board[0][2] == board[1][1] && \
board[1][1] != ' ' && \
board[1][1] == board[2][0]) {
return board[1][1];
}
for (i = 0; i < row; i++) {
int j = 0;
for (; j < col; j++) {
if (board[i][j] == INIT) {
return 'N';
}
}
}
return 'F';
}
6.Guess函数是为了判断第一次是电脑还是人先走,采用抛硬币模型。是代码中的亮点。
注意:如果return 1,则转向7.中的case 1
如果return 0,则转向7.中的case 0
int Guess()
{
int result = 0;
result = rand() % 2;
int g = 0;
printf("硬币已抛,猜正反面<0:正, 1:反面>: ");
scanf("%d", &g);
if (result == g){
printf("你猜对了,你先走\n");
return 1;
}
printf("你猜错了了,电脑先走\n");
return 0;
}
7.游戏执行
void Game()
{
srand((unsigned long)time(NULL)); //在玩游戏之前就生成随机数种子
char board[ROW][COL];
InitBoard(board, ROW, COL); //让棋盘内容变空
char result = 0;
int who = Guess();
int x = 0;
int y = 0;
do{
system("cls"); //清屏操作
ShowBoard(board, ROW, COL);
switch (who){
case 1:
printf("请落子:> ");
scanf("%d %d", &x, &y);
if (x <= 0 || x > 3 || y <= 0 || y > 3){
printf("你输入的位置有误,请重新输入!\n");
continue;
}
if (board[x - 1][y - 1] != ' '){
printf("该位置已被占用,请重新输入!\n");
continue;
}
board[x - 1][y - 1] = P_COLOR; //走到这表明数据未越界,且未被占用,开始输入数据
who = 0;
printf("你已经走完了,电脑正在思考\n");
break;
case 0:
ComputerMove(board, ROW, COL); //电脑走棋
ShowBoard(board, ROW, COL);
who = 1;
printf("电脑已经走完了,请你思考\n");
break;
default:
break;
}
result = Judge(board, ROW, COL);
if (result != 'N'){//'N'--->next 'F'--->FULL 'X' 'O'
break;
}
} while (1);
//判断谁赢谁输
if (result == P_COLOR) {
printf("恭喜你,你赢了!\n");
}
else if (result == C_COLOR) {
printf("不好意思,你输了!\n");
}
else {
printf("还不错,平手!\n");
}
printf("你玩的还不错,要不要再来一把!\n");
}
调试结果:
如图为平局的情况(电脑赢和人赢同理)
3342

被折叠的 条评论
为什么被折叠?



