在linux 环境下用c 编写五子棋程序中的鼠标的绘制和轨迹代码怎么编写??

在linux 环境下用c 编写五子棋程序中的鼠标的绘制和轨迹代码怎么编写??,第1张

首先要学习使用 gcc,因为Linux环境下没有VC++,也没有TC,

你还要掌握一些 Linux C编程的一些图形函数,

像 画直线,一些的函数,基本都没什么差别,都和

windows 的差不多.

其实鼠标没有控制什么,只是计算机鼠标的位置,然后画图而已.

我给你一个c++五子棋的程序mian.cpp#include <cstdio>

#include <string>

#include <cstdlib>

#include <ctime>

#include <Windows.h>

#include "pl.h"

using namespace stdpl game

pl game2void srandput(int &x,int &y) {

srand(time(NULL))

do {

x = rand() % 20

y = rand() % 20

} while (!game.isok(x,y))

}void scanfput(int &x,int &y) {

do {

scanf("%d %d",&x,&y)

} while (!game.isok(x,y))

}int main() {

int x,y

char who = com

x = y = -1

do {

if (who == com) who = me

else who = com

if (who == me) {

game.getxy(x,y)

printf("Com put chess in (%d,%d)\n",x,y)

game.printmap()

if (game.isend(x,y,com)) {

who = com

break

} game.sendxy(x,y)

printf("I put chess in (%d,%d)\n",x,y)

game.printmap()

if (game.isend(x,y,me)) break

//system("pause")

}

else {

//srandput(x,y)

scanfput(x,y)

//game2.getxy(x,y)

//game2.sendxy(x,y)

}

} while (true)

if (who == me) {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe)

puts("You Win, Computer Lose.")

}

else {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom)

puts("Computer Win, You Lose.")

}

printf("Use %d Steps\n",game.getstep())

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite)

} pi.hconst DWORD dwWhite = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN

const DWORD dwMe = FOREGROUND_GREEN

const DWORD dwCom = FOREGROUND_RED

//■□○●

char rec1[] = {-95,-10,0}

char rec2[] = {-95,-11,0}

char cir1[] = {-95,-16,0}

char cir2[] = {-95,-15,0}

//////////////////////////////////////////////////////////////////////////

//class pl

//////////////////////////////////////////////////////////////////////////

const int NMAX = 20

const int MAX = 1200

const char blank = '0'

const char me = '1'

const char com = '2'class pl {

public:

void sendxy(int &,int &)

void getxy(int,int)

void initscore()

void refreshscore(char,int,int)

void calscore(char)

void solve(int &,int &)

void printmap()

bool isok(int,int)

bool isend(int,int,char)

int getstep()

pl()

private:

int usestep

int wincount

char chess[NMAX][NMAX]

int win[2][MAX]

//ps,pt ->me

//cs,ct ->com

int ps[NMAX][NMAX],

cs[NMAX][NMAX]

bool pt[NMAX][NMAX][MAX],

ct[NMAX][NMAX][MAX]

}pl::pl() {

memset(chess,blank,sizeof(chess))

memset(pt,false,sizeof(pt))

memset(ct,false,sizeof(ct))

memset(win,0,sizeof(win))

wincount = 0

usestep = 0

initscore()

}void pl::printmap() {

int i,jfor (i=0i<NMAXi++) {

printf("\t\t\t%d\t",i)

for (j=0j<NMAXj++) {

if (chess[i][j] == me) {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwMe)

printf("%s",cir2)

}

else if (chess[i][j] == com) {

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwCom)

printf("%s",cir2)

}

else printf("%s",rec2)

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),dwWhite)

}

putchar('\n')

}

printf("\n\t\t\t\t")

for (i=0i<NMAXi++) printf("%2d",i)

putchar('\n')

}void pl::getxy(int x,int y) {

if (x==-1 &&y==-1) return

refreshscore(com,x,y)

}bool pl::isok(int x,int y) {

return (chess[x][y] == blank)

}bool pl::isend(int x,int y,char who) {

int i,j

int l,r,u,d,c1,c2,c3,c4

if (x==-1 &&y==-1) return false

l = r = u = d = 0

c1 = c2 = c3 = c4 = 0

for (i=1i<5 &&x+i <NMAXi++) {

if (who == chess[x+i][y]) u ++

else break

}

for (i=1i<5 &&x-i >= 0i++) {

if (who == chess[x-i][y]) d ++

else break

}

for (i=1i<5 &&y+i <NMAXi++) {

if (who == chess[x][y+i]) r ++

else break

}

for (i=1i<5 &&y-i >= 0i++) {

if (who == chess[x][y-i]) l ++

else break

}

for (i=1i<5 &&x+i <NMAX &&y+i <NMAXi++) {

if (who == chess[x+i][y+i]) c1 ++

else break

}

for (i=1i<5 &&x+i <NMAX &&y-i >= 0i++) {

if (who == chess[x+i][y-i]) c2 ++

else break

}

for (i=1i<5 &&x-i >= 0 &&y-i >= 0i++) {

if (who == chess[x-i][y-i]) c3 ++

else break

}

for (i=1i<5 &&x-i >= 0 &&y+i <NMAXi++) {

if (who == chess[x-i][y+i]) c4 ++

else break

}

return ( (u+1+d)>=5 || (l+1+r)>=5 || (c1+1+c3)>=5 || (c2+1+c4)>=5 )

}void pl::sendxy(int &x, int &y) {

solve(x,y)

usestep ++

}//枚举赢的局面

void pl::initscore() {

int i,j,k

//竖

for (i=0i<NMAXi++) {

for (j=0j<NMAX-4j++) {

for (k=0k<5k++) pt[j+k][i][wincount] = ct[j+k][i][wincount] = true

wincount ++

}

}

//横

for (i=0i<NMAXi++) {

for (j=0j<NMAX-4j++) {

for (k=0k<5k++) pt[i][j+k][wincount] = ct[i][j+k][wincount] = true

wincount ++

}

}

//斜1

for (i=0i<NMAX-4i++) {

for (j=0j<NMAX-4j++) {

for (k=0k<5k++) pt[j+k][i+k][wincount] = ct[j+k][i+k][wincount] = true

wincount ++

}

}

//斜2

for (i=0i<NMAX-4i++) {

for (j=NMAX-1j>=4j--) {

for (k=0k<5k++) pt[j-k][i+k][wincount] = ct[j-k][i+k][wincount] = true

wincount ++

}

}

}//计算全局位置的分值

void pl::calscore(char who) {

bool (*table)[NMAX][MAX]

int (*score)[NMAX]

int iwho

if (who == me) {

table = pt

score = ps

iwho = 1

}

else {

table = ct

score = cs

iwho = 0

}

srand(time(NULL))

int i,j,k

for (i=0i<NMAXi++) {

for (j=0j<NMAXj++) {

score[i][j] = 0

if (chess[i][j] == blank) {

for (k=0k<wincountk++) {

if (!table[i][j][k]) continue

//分值的大小影响棋子位置的选择

srand(rand())

switch (win[iwho][k]) {

case 1:

score[i][j] += 1

break

case 2:

score[i][j] += 10

break

case 3:

score[i][j] += 100

break

case 4:

score[i][j] += 1000

}

}

}

}

}

}void pl::solve(int &x, int &y) {

calscore(me)

calscore(com)

int i,j

int me_score,com_score

int me_x,me_y,com_x,com_y

me_score = com_score = -1

//选取我方或对方得分最大值

for (i=0i<NMAXi++) {

for (j=0j<NMAXj++) {

if (chess[i][j] == blank) {

if (me_score <ps[i][j]) {

me_score = ps[i][j]

me_x = i

me_y = j

}

if (com_score <cs[i][j]) {

com_score = cs[i][j]

com_x = i

com_y = j

}

}

}

}

if (me_score >com_score) {

x = me_x

y = me_y

}

else {

x = com_x

y = com_y

}

refreshscore(me,x,y)

}//更新分数

void pl::refreshscore(char who,int x,int y) {

bool (*table)[NMAX][MAX]

bool (*antitable)[NMAX][MAX]

int iwho

if (who == me) {

table = pt

antitable = ct

iwho = 1

}

else {

table = ct

antitable = pt

iwho = 0

}

chess[x][y] = who

for (int i=0i<wincounti++) {

//一方位置能胜利次数

if (table[x][y][i] &&win[iwho][i] <INT_MAX) win[iwho][i] ++

if (antitable[x][y][i]) {

//另一方无法放置

antitable[x][y][i] = false

win[1-iwho][i] = INT_MAX

}

}

}int pl::getstep() {

return usestep

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/9029566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-24
下一篇 2023-04-24

发表评论

登录后才能评论

评论列表(0条)

保存