零基础手把手实现小游戏三子棋

零基础手把手实现小游戏三子棋

首页角色扮演代号JGAME更新时间:2024-06-07
三子棋

本文使用C语言从零开始写一个三子棋程序,本程序功能是我们利用坐标在3X3的棋盘上填入“*”键,然后电脑自动填入“#”,最后输出玩家赢还是电脑赢,本文最后附加完整代码和源代码文件。

编程软件使用VS 2019,可以百度到官网下载。

三子棋程序的编写一共分为7个步骤:

1.框架搭建

先把总体的框架搭建好,后面再把核心的代码写好。

实现输入1,开始游戏;输入0,退出游戏。

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> //测试三子棋游戏的逻辑 void menu() { printf("*******************************\n"); printf("********* 1.play ********\n"); printf("********* 0.exit ********\n"); printf("*******************************\n"); } void test() { int input = 0; do { menu(); printf("请选择:>"); scanf("%d",&input); switch (input) { case 1: printf("三子棋\n"); break; case 0: printf("退出游戏!"); break; default: printf("选择错误\n"); break; } } while (input); } int main() { test(); return 0; }

我们实现了输入1,输出三子棋;输入0,退出游戏。

2.文件分配3.初始化棋盘

这一步我们实现把3x3的棋盘每个格子都初始化为空格。

把行列都#define为ROW和COL方便升级行数和列数。

//game.c void InitBoard(char board[ROW][COL],int row,int col) { int i = 0; for (i = 0; i < row; i ) { int j = 0; for (j = 0; j < col; j ) { board[i][j] = ' '; } } }

//game.h #define ROW 3 #define COL 3 //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col);4.打印棋盘框架

利用循环把三子棋盘的框架打印出来,我们框架使用 | - 这两个符合组合实现的。

//game.h void DisplayBoard(char board[3][3], int row, int col) { int i = 0; for (i = 0; i < row; i ) { int j = 0; for (j = 0; j < col; j ) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j ) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } }

//game.h //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col);

这就是我们利用 | - 这两种符合通过循环组合实现的棋盘。

5.玩家下棋

上一步我们已经把棋盘打印出来了,这一步实现我们输入坐标把星号写入棋盘中。

//game.c void player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋\n"); while (1) { printf("请输入坐标:>\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col)//如果在这个棋盘范围才能输入 { if (board[x - 1][y - 1] == ' ')//在棋盘范围内,是空格才能输入 { board[x - 1][y - 1] = '*'; break; } else { printf("改坐标被占用重新输入\n"); } } else { printf("坐标非法,请重新输入\n"); } } }

我们输入2 2 ,就是在棋盘的第二行和第二列输入一个星号,如果输入了 3 7 ,我们初始化棋盘时只是弄了3x3的棋盘,所以7太大了,我们就输出它是错误的坐标。

6.电脑下棋

上一步实现了玩家下棋,这一步是电脑下棋,电脑怎么下棋?我们利用srand()函数生成随机数,再把这个随机数模上棋盘的范围就可以得到一个随机的坐标,让它输入井号。

//game.c void computer_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑下棋\n"); while (1) { x = rand() % row;//0~2 y = rand() % col; //0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }

//test.c srand((unsigned int)time(NULL));

//game.h #include <stdlib.h> #include <time.h>

电脑随机输入井号键。

7.判断输赢

三个星号或者三个井号连在一起就是赢,所以我们用了下面代码的四种情况来判断电脑赢还是玩家赢。

static int if_full(char board[ROW][COL], int row, int col)//判断棋盘是否已经下满了 { int i = 0; for (i = 0; i < row; i ) { int j = 0; for (j = 0; j < col; j ) { if (board[i][j] == ' ') { return 0; } } } return 1; } char is_win(char board[ROW][COL], int row, int col) { int i = 0; //判断每一行的赢法 for (i = 0; i < row; i ) { if (board[i][1] == board[i][0] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][1]; } } //判断每一列的赢法 for (i = 0; i < col; i ) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') { return board[1][i]; } } //判断对角线赢法 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } //判断平局 if (if_full(board, row, col)==1) { return 'Q'; } //继续 return 'C'; }

总结:完整代码

test.c

#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" //测试三子棋游戏的逻辑 void menu() { printf("*******************************\n"); printf("********* 1.play ********\n"); printf("********* 0.exit ********\n"); printf("*******************************\n"); } void game() { char ret = 0; //存放下棋的数据 char board[ROW][COL] = { 0 }; //初始化棋盘为空格 InitBoard(board, ROW, COL); //打印棋盘 DisplayBoard(board, ROW, COL); while (1) { //玩家下棋 player_move(board, ROW, COL); DisplayBoard(board, ROW, COL); //判断输赢 ret = is_win(board, ROW, COL); if (ret != 'C') { break; } //电脑下棋 computer_move(board, ROW, COL);//智能的应该知道该从哪里堵,有点复杂,我们目前先来个随机版本的 DisplayBoard(board, ROW, COL); ret = is_win(board, ROW, COL); if (ret != 'C') { break; } } if (ret == '*') { printf("玩家赢\n"); } else if (ret == '#') { printf("电脑赢\n"); } else { printf("平局\n"); } //DisplayBoard(board, ROW, COL); } //电脑赢 * //玩家赢 # //平局 Q //继续 C void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d",&input); switch (input) { case 1: game();//游戏的实现 break; case 0: printf("退出游戏!"); break; default: printf("选择错误\n"); break; } } while (input); } int main() { test(); return 0; }

game.c

#define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void InitBoard(char board[ROW][COL],int row,int col) { int i = 0; for (i = 0; i < row; i ) { int j = 0; for (j = 0; j < col; j ) { board[i][j] = ' '; } } } void DisplayBoard(char board[3][3], int row, int col) { int i = 0; for (i = 0; i < row; i ) { int j = 0; for (j = 0; j < col; j ) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { for (j = 0; j < col; j ) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } } void player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋\n"); while (1) { printf("请输入坐标:>\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("改坐标被占用重新输入\n"); } } else { printf("坐标非法,请重新输入\n"); } } } void computer_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("电脑下棋\n"); while (1) { x = rand() % row;//0~2 y = rand() % col; //0~2 if (board[x][y] == ' ') { board[x][y] = '#'; break; } } } static int if_full(char board[ROW][COL], int row, int col)//判断棋盘是否已经下满了 { int i = 0; for (i = 0; i < row; i ) { int j = 0; for (j = 0; j < col; j ) { if (board[i][j] == ' ') { return 0; } } } return 1; } char is_win(char board[ROW][COL], int row, int col) { int i = 0; //判断每一行的赢法 for (i = 0; i < row; i ) { if (board[i][1] == board[i][0] && board[i][1] == board[i][2] && board[i][0] != ' ') { return board[i][1]; } } //判断每一列的赢法 for (i = 0; i < col; i ) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ') { return board[1][i]; } } //判断对角线赢法 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') { return board[1][1]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } //判断平局 if (if_full(board, row, col)==1) { return 'Q'; } //继续 return 'C'; }

game.h

#pragma once #include <stdio.h> #include <time.h> #include <stdlib.h> #define ROW 3 #define COL 3 //初始化棋盘 void InitBoard(char board[ROW][COL], int row, int col); //打印棋盘 void DisplayBoard(char board[ROW][COL], int row, int col); //玩家下棋 void player_move(char board[ROW][COL], int row, int col); //电脑下棋 void computer_move(char board[ROW][COL], int row, int col); //判断输赢 char is_win(char board[ROW][COL],int row, int col);

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved